Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;生成器indy截取IdHTTPProxyServer以插入标头_Proxy_C++builder_Indy - Fatal编程技术网

C++;生成器indy截取IdHTTPProxyServer以插入标头

C++;生成器indy截取IdHTTPProxyServer以插入标头,proxy,c++builder,indy,Proxy,C++builder,Indy,我想在浏览器中通过https插入外部脚本的标题。为此,我使用C++ Builder和IDHTTPro服务器组件。我阅读了响应事件中的文档,但不知道如何插入一个简单的.js。->因为Document属性是只读的,在CommandHandler想要用脚本追加之前的另一端(在下面的代码中,为了简单起见,我只使用文本插入) < > >在C++ Builder中如何插入.js外部脚本?< /强> 以下是我到目前为止所做的 void __fastcall TForm5::IdHTTPProxySe

我想在浏览器中通过https插入外部脚本的标题。为此,我使用C++ Builder和IDHTTPro服务器组件。我阅读了响应事件中的文档,但不知道如何插入一个简单的.js。->因为Document属性是只读的,在CommandHandler想要用脚本追加之前的另一端(在下面的代码中,为了简单起见,我只使用文本插入)

< > >在C++ Builder中如何插入.js外部脚本?< /强>

以下是我到目前为止所做的

    void __fastcall TForm5::IdHTTPProxyServer1HTTPResponse
    (TIdHTTPProxyServerContext *AContext)

{
    Memo1->Lines->Append("\nOn Response!!!\n" + AContext->Document);
}


void __fastcall TForm5::IdHTTPProxyServer1BeforeCommandHandler
(TIdCmdTCPServer *ASender, UnicodeString &AData, TIdContext *AContext) {
try {
    Memo1->Lines->Add(AData);
    UnicodeString sa = AData;
    AData = L"<html>Something</html>" + sa;
}
catch (int e) {
    MessageBeep(100);
}
}
void\uu fastcall TForm5::IdHTTPProxyServer1HTTPResponse
(TIdHTTPProxyServerContext*AContext)
{
备忘录1->行->追加(“\n响应!!!\n”+a文本->文档);
}
void u fastcall TForm5::IDHttpProxyServer1BeforRecommandHandler
(TIdCmdTCPServer*ASender、UnicodeString和AData、TIdContext*AContext){
试一试{
备忘录1->行->添加(数据);
单轴压缩sa=AData;
AData=L“某物”+sa;
}
捕获(INTE){
MessageBeep(100);
}
}

在处理客户端请求之前,会触发
TIdHTTPProxyServer::OnBeforeCommandHandler
事件。
AData
参数是原始请求。此事件用于在解析命令之前记录/更改命令


在接收到客户端的请求头之后,但在建立到目标服务器的连接之前,以及在读取客户端的请求正文并将其发送到服务器之前,会触发
TIdHTTPProxyServer::OnHTTPBeforeCommand
事件


在接收到服务器的响应头之后,但在读取响应正文并将其发送到客户端之前,会触发
TIdHTTPProxyServer::OnHTTPResponse
事件

所以这些事件都不会对你有帮助

就这一点而言,
TIdHTTPProxyServerContext::Document
属性也不会。该属性不包含您假设的文档数据。它包含被请求文档的服务器相对URL

要执行您要求的操作,请将
TIdHTTPProxyServer::DefaultTransferMode
属性设置为
tmFullDocument
,并使用
OnHTTPDocument
事件。
TIdHTTPProxyServerContext::TransferSource
属性将告诉您数据是来自客户端还是服务器

您将拥有对标题和正文数据的完全访问权限,并且可以根据需要修改它们。如果修改正文数据,只需确保更新
TIdHTTPProxyServerContext.Headers
,特别是
内容长度
头。主体数据作为
TStream
对象提供(具体地说,是
TMemoryStream
)。因此,您可以直接修改流的内容,也可以使用所需内容创建一个新的
TStream
对象(事件的
VStream
参数通过引用传递,因此您可以重新分配它)

例如:

void\uu fastcall TForm5::IdHTTPProxyServer1HTTPDocument(TIdHTTPProxyServerContext*AContext、TStream*&VStream)
{
if(AContext->TransferSource==tsServer)
{
字符串s=ReadStringAsContentType(VStream,AContext->Headers->Values[L“Content Type]”,QuoteHTTP);
//这不是线程安全的!TIdHTTPProxyServer是多线程的,
//必须与主线程同步,才能安全地
//更新UI控件。。。
//
//备忘录1->Text=s;
s=L“某物”+s;
删除VStream;
VStream=新的TStringStream(s,Sysutils::TEncoding::UTF8);
AContext->Headers->Values[L“Content Length”]=VStream->Size;
AContext->Headers->Params[L“Content Type”][L“charset”]=L“utf-8”;
}
}

安全注意:HTTPS代理允许中间人攻击Hnx Remy将尝试这种攻击