我正在尝试使用FastCGI(和restcgi)开发简单的RESTful api。当我尝试实现POST方法时,我注意到输入流(表示请求体)是错误的。我做了一点测试,看起来当我尝试读取流时,只收到其他所有角色。
发送的身体: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 :(得分:2)
我在未经修改的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.
答案 1 :(得分:2)
问题在于fcgio.cpp
fcgi_steambuf
类是使用char_type
定义的,但int underflow()
方法将其返回值向下转换为(unsigned char)
,它应该转换为(char_type)
。
答案 2 :(得分:1)
在任何地方找不到答案(甚至不是FastCGI邮件列表)后,我抛弃了原来的fastcgi库并尝试使用fastcgi ++库。问题消失了。还有其他好处--c ++,更多功能,更易于使用。
答案 3 :(得分:1)
使用is.read()
而不是is >> ...
来自restcgi文档的示例:
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();