2010-11-25 2 views
2

Я пытаюсь разработать простой RESTful api с помощью FastCGI (и restcgi). Когда я попытался реализовать метод POST, я заметил, что входной поток (представляющий тело запроса) ошибочен. Я сделал небольшой тест и выглядит, когда я пытаюсь прочитать поток, только каждый другой персонаж получен.Отсутствующие символы из потока ввода из запроса fastcgi

Тело отправлено: name=john&surname=smith Поступила: aejh&unm=mt

Я пытался больше клиентов, просто чтобы убедиться, что это не клиент баловаться с данными. Мой код:

int main(int argc, char* argv[]) { 
    // FastCGI initialization. 
    FCGX_Init(); 
    FCGX_Request request; 
    FCGX_InitRequest(&request, 0, 0); 

    while (FCGX_Accept_r(&request) >= 0) { 
    // FastCGI request setup. 
    fcgi_streambuf fisbuf(request.in); 
    std::istream is(&fisbuf); 
    fcgi_streambuf fosbuf(request.out); 
    std::ostream os(&fosbuf); 

    std::string str; 
    is >> str; 
    std::cerr << str; // this way I can see it in apache error log 

    // restcgi code here 
    } 

    return 0; 
} 

Я использую модуль fast_cgi с апача (не уверен, если это делает никакой разницы).

Любая идея, что я делаю неправильно?

+0

Кажется, проблема с кодировкой каждый второй символ пропускается (16/8 бит) – stacker 2010-11-25 21:38:45

+0

, но как? если бы он интерпретировал 2B как один символ, тогда char был бы чем-то другим, но он верен в моем случае ... – Tom 2010-11-28 09:12:14

ответ

0

Не нашли ответа нигде (даже не список рассылки FastCGI) Я сбросил оригинальные библиотеки fastcgi и вместо этого попытался использовать библиотеки fastcgi ++. Проблема исчезла. Есть и другие преимущества - C++, больше функций, проще в использовании.

1

Использование is.read() не is >> ...

Пример из restcgi документации:

clen = strtol(clenstr, &clenstr, 10); 
if (*clenstr) 
{ 
    cerr << "can't parse \"CONTENT_LENGTH=" 
      << FCGX_GetParam("CONTENT_LENGTH", request->envp) 
      << "\"\n"; 
    clen = STDIN_MAX; 
} 

// *always* put a cap on the amount of data that will be read 
if (clen > STDIN_MAX) clen = STDIN_MAX; 

*content = new char[clen]; 

is.read(*content, clen); 
clen = is.gcount(); 
1

Я столкнулся с этой проблемой, а также, на неизмененном Debian установки.

Я обнаружил, что проблема ушла, если я поставила буфер в fcgi_streambuf конструктор:

const size_t LEN = ... // whatever, it doesn't have to be big. 
vector<char> v (LEN); 
fcgi_streambuf buf (request.in, &v[0], v.size()); 
iostream in (&buf); 
string s; 
getline(in, s); // s now holds the correct data. 
2

Проблема находится в fcgio.cpp

fcgi_steambuf класс определяется с помощью char_type, но int underflow() метод понижает его возвращаемое значение до (unsigned char), его следует отбрасывать до (char_type).

Смежные вопросы