私はLight HTTPdを使ってC++で書かれた動作中のFastCGIアプリケーションを持っていますが、getenv("QUERY_STRING")
を使ってクエリ文字列を取得することはできません。私は、クエリ文字列要求を取り出し(またはnullのチェックを追加する)場合はすべてが正常に動作しますが、それに代わって、それは失敗します。getenv( "QUERY_STRING")がFastCGI C++プログラムでnullを返すのはなぜですか?
#include <stdlib.h>
#ifdef _WIN32
#include <process.h>
#else
#include <unistd.h>
extern char ** environ;
#endif
#include "fcgio.h"
#include "fcgi_config.h" // HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
#include "redisclient.h"
....
while (FCGX_Accept_r(&request) == 0)
{
fcgi_streambuf cin_fcgi_streambuf(request.in);
fcgi_streambuf cout_fcgi_streambuf(request.out);
fcgi_streambuf cerr_fcgi_streambuf(request.err);
...
cout << "Content-type: text/html\r\n"
"\r\n"
"<TITLE>^_^</TITLE>\n"
"<H1>echo-cfpp</H1>\n"
"<H4>PID: " << pid << "</H4>\n"
"<H4>Request Number: " << ++count << "</H4>\n";
// If I make this conditional on getenv("QUERY_STRING") not returning null,
// then the program behaves reliably.
cout <<getenv("QUERY_STRING");
}
私はリクエストにクエリー文字列を渡していることを確認しました。なぜgetenv( "QUERY_STRING")がnullを返すのですか?そして、それは何ですか私はそれを取得するのですか?
これは実際にクエリ文字列にアクセスする方法を文書化したものです。 http://www.fastcgi.com/devkit/doc/fastcgi-prog-guide/ch2c.htm私がここに来る前に、私はたくさんのRTMをしていました。また、私はnullを確認してくれたことに感謝しました。 – user1202909
@ user1202909:私の答えが更新されました。あなたのコードは、文書に記載されている前提条件を満たしていません。 –
実際、FWIW、libstdC++はヌル 'char const *'のストリーミングをチェックします。まだUBです。もちろん –