【转】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要注意的一点

不使用代理的时候,以下代码能正常工作。

// no error handling ...
string strURI = "http://www.baidu.com/query?r=xxx";
Poco::URI uri(strURI);  

Poco::Net::HTTPClientSession session;
session.setHost(uri.getHost());
session.setPort(uri.getPort());  

// Proxy switch:
//  session.setProxy(<proxyHost>, <proxyPort>);  

Poco::Net::HTTPRequest req("HTTP/1.1");
req.setURI(strURI);    

session.sendRequest(req);  

蛋是如果启用Proxy(取消掉对上面setProxy那句代码的注释),则上面的代码会报错。

抓包发现它发出去的HTTP请求成了:

GET http://www.baidu.com:80http://www.baidu.com/query?r=xxx

跟到Poco源代码中,发现原因为:

// in poco/net/HTTPClientSession.cpp
//
 if (!_proxyHost.empty())
{
     request.setURI(proxyRequestPrefix() + <strong>request.getURI()</strong>);
     proxyAuthenticate(request);
}  

解决的方法,

1) 修改 poco/net/HTTPClientSession.cpp

request.setURI(proxyRequestPrefix() + Poco:URI(request.getURI()).getPathEtc());  

或者,2)

使用的时候,给HTTPRequest传入URI的时候不包含schema, host, port

如下:

// no error handling ...
string strURI = "http://www.baidu.com/query?r=xxx";
Poco::URI uri(strURI);
Poco::Net::HTTPClientSession session;
session.setHost(uri.getHost());
session.setPort(uri.getPort());
// Proxy switch: on
session.setProxy(<proxyHost>, <proxyPort>);
Poco::Net::HTTPRequest req("HTTP/1.1");
req.setURI(<strong>uri.getPathEtc()</strong>);
session.sendRequest(req);
时间: 2024-11-11 20:48:52

【转】Poco 1.4.2 HTTPClientSession/HTTPRequest 使用使用代理(proxy)需要注意的一点的相关文章

HttpClient使用详解 (一)

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性.因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入. 一.简介 HttpClient是Apache Jakarta Common下的子项目,用

零基础http代理http完美代理访问

如果翻过墙,或者做过渗透啥的,肯定对代理不陌生,说白了,代理服务器就是一个中转站,你对目标网址的请求都会进过代理服务器去请求,类似于一个被你操控的傀儡,别人能知道的也只能是这个代理,从而提升安全性和访问一些受限制的网站. 实现方式 方法一 :使用系统属性来完成代理设置, 这种方法比较简单, 但是不能对单独的连接来设置代理: 方法二 :使用Proxy来对每个连接实现代理, 这种方法只能在jdk 1.5以上的版本使用(包含jdk1.5), 优点是可以单独的设置每个连接的代理, 缺点是设置比较麻烦:

使用 CAS 在 Tomcat 中实现单点登录

单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架,本文介绍了 CAS 的原理.协议.在 Tomcat 中的配置和使用,对于采用 CAS 实现轻量级单点登录解决方案的入门读者具有一定指导作用. CAS 介绍 CAS 是 Yale 大学发起的一

CAS 在 Tomcat 中实现单点登录

单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统 中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS(Central Authentication Service)是一款不错的针 对 Web 应用的单点登录框架,本文介绍了 CAS 的原理.协议.在 Tomcat 中的配置和使用,对于采用 CAS 实现轻量级单点登录解决方案 的入门读者具有一定指导作用. CAS 介绍 CAS 是 Yale 大学发

cas改造随笔

原http://www.cnblogs.com/hellowood/archive/2010/08/05/1793364.html 键字: sso域名:cas.server.com 登陆地址(spring web flow):https://cas.server.com/cas/login 登陆地址(直接):https://cas.server.com/cas/directLogin 退出地址:https://cas.server.com/cas/logout 语言参数:locale=zh_CN

httpclient学习(原创)

--httpmime-4.2.5.jar  跟提交Form相关的类 这一块主要post数据的提交.每一条数据同name和content组成.content可能是字节数组或是流.提交这一类(MIME)的数据的时候,还要添加一些 header数据.于是FormBodyPart类就诞生了,它的属性有name,header,content.很多个FormBodyPart组成了HttpMultipart(因为HttpMultipart 有个FormBodyPart的List集合).所有的东东最后在Mult

使用POCO发送HTTP(S)请求

POCO GitHub地址https://github.com/pocoproject/poco http_example.cpp #include <iostream> #include <Poco/URI.h> #include <Poco/StreamCopier.h> #include <Poco/Net/HTTPClientSession.h> #include <Poco/Net/HTTPRequest.h> #include <

Entity Framework工具POCO Code First Generator的使用

在使用Entity Framework过程中,有时需要借助工具生成Code First的代码,而Entity Framework Reverse POCO Code First Generator是一款不错的工具 在Visual Studio中,通过"工具"→"扩展和更新..."来安装Entity Framework Reverse POCO Code First Generator 这里添加一个控制台项目,并在项目中添加POCO Code First Genera

POCO库——Foundation组件之核心Core

核心Core: Version.h:版本控制信息,宏POCO_VERSION,值格式采用0xAABBCCDD,分别代表主版本.次版本.补丁版本.预发布版本: Poco.h:简单地包含了头文件Foundation.h: Foundation.h:使用其他任何Foundation模块前需要包含的头文件,主要定义库导出宏POCO_DLL.Foundation_API以及自动连接相应配置正确的库引用文件lib:包含库配置文件Config.h: 平台相关的Platform.h以及各个平台相应的文件Plat