且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

web服务器读写权限可能会引起HttpSendRequest返回错误码12152

更新时间:2022-08-13 21:25:53

web服务器为Aapache(运行在linux上)扩展模块(参看这里),将收到来自客户端的POST请求文本写到某个目录中,客户端发送代码如下(不完整):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
strcpy(szURL, "http://www.xxx.com") // xxx 仅仅为了说明问题
if (!::InternetCheckConnection(szURL, FLAG_ICC_FORCE_CONNECTION, 0))
    return FALSE;
TCHAR szModuleFile[MAX_PATH] = {0};
::GetModuleFileName(NULL, szModuleFile, MAX_PATH);
LPCTSTR lpPath = ::PathFindFileName(szModuleFile);
HINTERNET hOpen = ::InternetOpen(lpPath, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
if (NULL == hOpen)
    return FALSE;
HINTERNET hConnect = ::InternetConnect(hOpen, lpDomain, dwPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (NULL == hConnect)
    goto FUN_END2;
LPCTSTR szAccept[] = {_T("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), NULL};
DWORD dwFlag = INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_KEEP_CONNECTION;
HINTERNET hOpenRequest = ::HttpOpenRequest(hConnect, _T("POST"), _T("my_app"),
    _T("HTTP/1.1"), szURL, szAccept, dwFlag, 0); // my_app是apache扩展C++模块.
if (NULL == hOpenRequest)
    goto FUN_END1;
BOOL bRet = FALSE;
TCHAR headerContentLength[64];
_stprintf(headerContentLength, _T("Content-Length: %d\r\n\r\n"), nLen);
// 这个语句向http://www.xxx.com/my_app发送数据.
bRet = ::HttpSendRequest(hOpenRequest, headerContentLength, _tcslen(headerContentLength), utf8PostData, nLen);
DWORD dwErr = ::GetLastError();
if (!bRet)  goto FUN_END1;
TCHAR szBuff[BUF_LEN_1024] = {0};
DWORD dwBuffSize = BUF_LEN_1024*sizeof(szBuff)-2;
bRet = ::HttpQueryInfo(hOpenRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)szBuff, &dwBuffSize, NULL);
//Reference to http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
int nStatusCode = _tstoi(szBuff);
//if (nStatusCode<200 || 206<nStatusCode)
if (200 != nStatusCode)
    bRet = FALSE;
......

在调试过程中发现,HttpSendRequest总是返回FALSE,错误码为12152(MSDN定义,ERROR_HTTP_INVALID_SERVER_RESPONSE,The server response could not be parsed).经过抓包可知,网络正常,3次握手,4次分手都正常,说明apache确实收到了这份数据,通过浏览器访问http://www.xxx.com/my_app也正常.  

 有不少网友说该错误可能发生在客户端或者系统,例如杀毒软件,网络异常等等,现这里不是这种问题,经过调查发现,错误竟然出在服务端读写权限上.扩展模块my_app会将收到的数据写到目录log,但log的权限开始是"drwxr-xr-x.",后来修改了权限(chmod ugo+w log)为"drwxrwxrwx."竟然可以了.

 从这个错误可以看出,当apache不能处理某个http请求时,不会将相应的数据传递给C++扩展模块,而是返回错误(12152)给发送程序.

 











本文转自jetyi51CTO博客,原文链接:http://blog.51cto.com/jetyi/1254778 ,如需转载请自行联系原作者