2011-11-11 17 views
3

C++アプリケーションでhttp://fastcgi.com/のライブラリをバックエンドとして使用し、nginx Webサーバーをフロントエンドとして使用しています。FastCGIアプリケーションでHTTP POSTの本体を取得できない

HTMLフォームから1MBのファイルが成功し、変数 "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がHTTP POSTの本体を正しく送信していることを示していますが、1MBのjpegファイルも含まれています。

したがって、POSTリクエストによってHTMLフォームから送信されたデータを取得する方法はクリーンではありません。

答えて

4

libfcgiには、入力ストリームから読み取る3つの関数FCGX_GetStr,FCGX_GetLineおよびFCGX_GetCharがあります。

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

multipart/form-dataのボディを解析する必要があります。

関連する問題