Не удается получить тело HTTP POST в приложении FastCGI - PullRequest
3 голосов
/ 11 ноября 2011

Я использую библиотеку http://fastcgi.com/ в приложении C ++ в качестве бэкэнда и веб-сервер nginx в качестве внешнего интерфейса.

Публикация 1 МБ файла из HTML-формы успешно завершена и переменная "CONTENT_LENGTH "достаточно большой :) Но я не могу понять, как получить доступ к телу POST-запроса, используя libfcgi.Это моя HTML-форма, она отлично работает.

<form action="/upload" enctype="multipart/form-data" method="POST">
<input type="test" name="text1" /> 
<input type="file" name="file1" />
<input type="submit" /> 
</form> 

Запрос принимается через

int FCGX_Accept_r(FCGX_Request *request);

Внутри FCGX_Request у нас есть 3 потока: in, out, err.Поток "in" имеет флаг isReader == 1, чужой isReader == 0.

typedef struct FCGX_Stream {
   unsigned char *rdNext;    /* reader: first valid byte
                              * writer: equals stop */
   unsigned char *wrNext;    /* writer: first free byte
                              * reader: equals stop */
   unsigned char *stop;      /* reader: last valid byte + 1
                              * writer: last free byte + 1 */
   unsigned char *stopUnget; /* reader: first byte of current buffer
                              * fragment, for ungetc
                              * writer: undefined */
   int isReader;
   int isClosed;
   int wasFCloseCalled;
   int FCGI_errno;                /* error status */
   void (*fillBuffProc) (struct FCGX_Stream *stream);
   void (*emptyBuffProc) (struct FCGX_Stream *stream, int doClose);
   void *data;
} FCGX_Stream;

Разница между всеми указателями rdNext, wrNext, stop == 0. Разница (stop - stopUnget) составляетоколо 0x500.

Чтение данных между stopUnget и stop дает мне «FASTCGI-dump», отправленный nginx в мое приложение, но данные не отправляются через форму.

Хотя, перехватчик между nginx иПриложение fastcgi показывает, что nginx правильно отправляет тело HTTP POST, включая jpeg-файл размером 1 МБ.

Поэтому не совсем понятно, как получить данные, отправленные с помощью HTML-формы, через запрос POST.

1 Ответ

4 голосов
/ 11 апреля 2012

libfcgi предоставляет три функции для чтения из входного потока: FCGX_GetStr, FCGX_GetLine и FCGX_GetChar.

while (FCGX_GetStr(buf, sizeof(buf), request.in) > 0) {
    /* ... */
}

Вам нужно позаботиться о разборе тела multipart/form-data.

...