Отсутствующие символы из входного потока из запроса fastcgi - PullRequest
2 голосов
/ 26 ноября 2010

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

Тело отправлено: 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 с apache (не уверен, что это что-то меняет).

Есть идеи, что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 22 июня 2012

Проблема в файле fcgio.cpp

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

2 голосов
/ 11 января 2012

Я также столкнулся с этой проблемой при неизмененной установке 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.
1 голос
/ 04 апреля 2011

Использование 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 голос
/ 29 ноября 2010

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

...