2010-11-25 36 views
2

私はFastCGI(およびrestcgi)を使用して簡単なRESTful APIを開発しようとしています。 POSTメソッドを実装しようとすると、入力ストリーム(要求本体を表す)が間違っていることに気付きました。私は少しのテストをして、ストリームを読み込もうとすると、他のすべてのキャラクターだけが受け取られたように見えます。送信されfastcgiからの入力ストリームに文字がありません

ボディ:受信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; 
} 

私は(それが何の違いを行う場合わからない)Apacheでfast_cgiモジュールを使用しています。

私は間違って何を考えていますか?

+0

は1秒ごとに符号化の問題があるようです(16/8ビット) – stacker

+0

どのようにですか? 2Bを1つの文字として解釈していた場合、その文字は別のものになりますが、私の場合は正しいです... – Tom

答えて

0

どこでも答えが見つからないので(FastCGIメーリングリストでさえも)、元のfastcgiライブラリをダンプし、代わりにfastcgi ++ライブラリを使ってみました。問題は消えた。また、C++、より多くの機能、使いやすいという利点もあります。

1

使用is.read() restcgiドキュメントからないis >> ...

サンプル:

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

私は、同様にこの問題が発生した無修正の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. 
2

問題がfcgi_steambufクラスはchar_typeを使用して定義されfcgio.cppに

ですが、int underflow()メソッドは戻り値を(unsigned char)にダウンキャストし、それは(char_type)にキャストする必要があります。

+0

これは本当に問題を解決するようですが、なぜそれを 'unsigned char'戻る前に他の文字が消える原因 – RPGillespie

関連する問題