使用ISAPI筛选器将标头转换为文件

时间:2010-12-10 19:16:30

标签: c++ isapi

我正在尝试将整个原始标题放入文件中,但每当我尝试编写内容时,我都会得到一个满是ÌÌ的文件。我究竟做错了什么?

DWORD CTryISAPIFilter::OnPreprocHeaders(CHttpFilterContext* httpContext,
    PHTTP_FILTER_PREPROC_HEADERS headerInformation)
{


    char buffer[4096];
    DWORD bufferSize = sizeof(buffer);

    BOOL HeaderBoolean = headerInformation->GetHeader(httpContext->m_pFC, "ALL_RAW", buffer, &bufferSize); 
    char * ptrIn = (char *) buffer;
    std::string postData2 = ptrIn;
    char * outputString = new char[4096];

    int i = 0;
    for(i=0;i<4096;i++){
        outputString[i] = postData2[i];
    }
    outputString[i+1] = NULL;


    std::ofstream outfile ("D:\\WebSites\\wwwroot\\test.txt",std::ios::app);

    outfile << outputString << std::endl;

    outfile.close(); 
    return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

1 个答案:

答案 0 :(得分:1)

headerInformation->GetHeader()是否会成功?

如果是这样,它实际上写入了多少buffer(可能它会在bufferSize中的值中告诉你这个)

我怀疑GetHeader()失败,并且没有任何内容写入buffer,因为:

  • 你得到所有“ÌÌ”字符(VC的调试版本将设置未初始化的内存),
  • 当您将postData2索引到通常应该是字符串结尾(大多数情况下无论如何)时,您都不会抛出异常。所以buffer中显然没有'\ 0'终止符(如果成功,GetHeader()会写入。)

您需要检查此失败并检查GetLastError()以获取有关失败的更多信息。

更新:您的缓冲区可能不够大。有关如何正确调整缓冲区大小的信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163939.aspx

更新2:我已经有一段时间了,因为我已经完成了网络内容,但是“ALL_RAW”不是CGI风格的服务器环境变量而不是标题?您不应该使用GetServerVariable()而不是GetHeader()来检索此内容吗?