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