LINUX.ORG.RU

FastCGI и POST-запрос. Не вижу тела запроса.


0

1

Просьба не переносить в Web-Development, т.к. это не html/js/php/mysql - вопрос.

Юзаю библиотеку с http://fastcgi.com/

Сниффером вижу как nginx запихивает в соединение с FastCGI-программой всё что нужно - все заголовки и потом мегабайтный джипег.

<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);

Внутри этого запроса есть три «стрима» -> in, out, err. Первый говорит, что у него флаг isReader == 1. У остальных == 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;

Для объекта «in» разница между всеми указателями (вверху структуры) равна нулю, кроме разницы между (stop - stopUnget), которая разна примерно 0x500. Если прочитать содержимое памяти начиная с stopUnget до stop, получим дамп входящего FASTCGI-мяса от сервера с FASTCGI-переменными и бинарными структурами, но без «тела» HTTP-запроса, то есть без данных из HTML-формы (multipart/form-data).

Тем не менее, сниффер канала между веб-сервером и fastcgi-приложением показывает отправку данных формы со всеми пирогами веб-сервером по TCP-соединению в направлении fastcgi-приложения.

Короче изучая структуры в файле fcgiapp.h непонятно, откуда достать тело HTTP-запроса.

Ответ на: комментарий от Sectoid

Смотрел, но этот echo - либо просто CGI (не Fast), либо неизвестно что - у него нет инициализации сокета, а у меня cin, cout, cerr не учавствуют в сетевом обмене - в случае полноценного FastCGI весь обмен через TCP или сокеты (у меня TCP).

kiverattes ★☆ ()
Ответ на: комментарий от trashymichael

Начнём с того, что нет ничего равного, поэтому «всё равно» как-то не круто звучит.

kiverattes ★☆ ()
Ответ на: комментарий от kiverattes

А можешь дать свой минимальный пример, на котором воспроизводится ошибка?

Sectoid ★★★★★ ()
Ответ на: комментарий от Sectoid

Если вечером найду время - сделаю пример. Если у вас есть время сейчас - можете повторить эксперимент сами, всё равно вам придётся поднимать всю инфраструктуру, если вы собираетесь пытаться воспроизводить «ошибку». Наваяйте простое fcgi-приложение и проверьте мои утверждения, заглянув в структуру FCGX_Stream, запостив 100-килобайтный джипег. Если в моём посте достаточно ясно всё изложено, конечно.

kiverattes ★☆ ()
Ответ на: комментарий от kiverattes

>Наваяйте простое fcgi-приложение и проверьте мои утверждения, заглянув в структуру FCGX_Stream, запостив 100-килобайтный джипег.

Попутно насажав своих ошибок) Да и сейчас некогда — я потому и попросил минимальный пример.

Ладно, вечером продолжим.

ЗЫ: ко мне на «ты»

Sectoid ★★★★★ ()
Ответ на: комментарий от Sectoid

Там ошибок негде сажать - функция main с циклом while() приёма сообщений. В этом цикле просто выводите разницу между указателями или просто печатайте их значения.

kiverattes ★☆ ()

Как бы глупо это не звучало, но разве по аналогии с CGI тело запроса не надо читать из stdin?

Tark ★★ ()
Ответ на: комментарий от Tark

Хрен его знает, вечером попробую. По крайней мере stdout у меня никак с веб-сервером не связан, а печатает в консоль, поэтому stdin, я думаю, смотрит в клавиатуру.

kiverattes ★☆ ()
Ответ на: комментарий от kiverattes

Посмотрел таки на fcgiapp.h. Читать вход надо из того стрима, что isReader. И читать не руцями, а вот этими функциями:

DLLAPI int FCGX_GetChar(FCGX_Stream *stream);

DLLAPI int FCGX_GetStr(char *str, int n, FCGX_Stream *stream);

DLLAPI char *FCGX_GetLine(char *str, int n, FCGX_Stream *stream);

...и далее по тексту fcgiapp.h

Sectoid ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.