2011-11-11 6 views
3

C++ 응용 프로그램에서 http://fastcgi.com/의 라이브러리를 백엔드로 사용하고 nginx 웹 서버를 프런트 엔드로 사용하고 있습니다.FastCGI 응용 프로그램에서 HTTP POST 본문을 가져올 수 없습니다.

1MB 파일을 HTML 형식에서 성공적으로 게시하고 "CONTENT_LENGTH"변수가 충분히 큽니다. :) 그러나 libfcgi를 사용하여 POST 요청 본문에 액세스하는 방법을 알 수 없습니다. 이것은 내 HTML 양식이며 훌륭하게 작동합니다.

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

요청이 FCGX_Request 내부

int FCGX_Accept_r(FCGX_Request *request); 

를 통해 허용됩니다 우리는 3 개 스트림을 가지고있는, 밖으로, ERR. 스트림 플래그 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 차이가 == 0 차액을 중지 (정지 - stopUnget)는 약 0x500이고 .

stopUnget과 stop 사이의 데이터를 읽으면 내 응용 프로그램에 nginx가 보낸 "FASTCGI-dump"가 표시되지만 양식을 통해 전송 된 데이터는 없습니다.

nginx와 fastcgi 응용 프로그램 사이의 스니퍼는 nginx가 1MB jpeg 파일을 포함하여 HTTP POST 본체를 올바르게 보내고 있음을 보여줍니다.

따라서 POST 요청을 통해 HTML 양식에 의해 전송 된 데이터를 가져 오는 방법은 깨끗하지 않습니다.

답변

4

libfcgi은 입력 스트림 (FCGX_GetStr, FCGX_GetLineFCGX_GetChar)에서 읽을 수있는 세 가지 기능을 제공합니다.

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

multipart/form-data 본문을 파싱해야합니다.

관련 문제