Landray-bug

本文解析了使用HttpClient发送HTTP请求时出现的ClientProtocolException异常,深入分析了异常产生的原因,并给出了具体的解决办法。

今天在做OutServer的一个proxy_async方法时,使用到HttpClient发送请求时,有bug

网上查找原因发现类似如下情况;

现象:用httpclient发送http请求时,客户端返回:

org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:822)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
……
Caused by: org.apache.http.ProtocolException: Content-Length header already present
at org.apache.http.protocol.RequestContent.process(RequestContent.java:67)
at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:108)
at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:174)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:462)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
... 27 more

原因:查看httpclient中RequestContent类的process方法,看到当body非空时,会自动加上Content-Length请求头及其对应值,不需要自己手动加上它。源码如下:

</pre>
public void process(final HttpRequest request, final HttpContext context)
throws HttpException, IOException {
if (request == null) {
throw new IllegalArgumentException("HTTP request may not be null");
}
if (request instanceof HttpEntityEnclosingRequest) {
if (request.containsHeader(HTTP.TRANSFER_ENCODING)) {
throw new ProtocolException("Transfer-encoding header already present");
}
if (request.containsHeader(HTTP.CONTENT_LEN)) {
throw new ProtocolException("Content-Length header already present");
}
ProtocolVersion ver = request.getRequestLine().getProtocolVersion();
HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity();
if (entity == null) {
request.addHeader(HTTP.CONTENT_LEN, "0");
return;
}
// Must specify a transfer encoding or a content length
if (entity.isChunked() || entity.getContentLength() < 0) {
if (ver.lessEquals(HttpVersion.HTTP_1_0)) {
throw new ProtocolException(
"Chunked transfer encoding not allowed for " + ver);
}
request.addHeader(HTTP.TRANSFER_ENCODING, HTTP.CHUNK_CODING);
} else {
request.addHeader(HTTP.CONTENT_LEN, Long.toString(entity.getContentLength()));
}
// Specify a content type if known
if (entity.getContentType() != null && !request.containsHeader(
HTTP.CONTENT_TYPE )) {
request.addHeader(entity.getContentType());
}
// Specify a content encoding if known
if (entity.getContentEncoding() != null && !request.containsHeader(
HTTP.CONTENT_ENCODING)) {
request.addHeader(entity.getContentEncoding());
}
}
}
解决方法:remove掉Content-Length后,不再抛异常,请求正常返回。

 

转载于:https://www.cnblogs.com/buyx/p/6825327.html

ruiyi-cloud白名单是指在阿里云中设置的一种访问控制规则,用于限制对特定资源的访问。通过将允许访问某资源的IP地址列入白名单,可以精确地管理谁可以访问这些资源。对于ruiyi-cloud白名单的具体设置方法,可以按照以下步骤进行操作: 1. 登录阿里云官网并进入控制台。 2. 找到需要设置白名单的产品和服务,例如数据库(RDS)、云服务器(ECS)等。 3. 进入安全组管理界面,安全组是一种用于设置虚拟防火墙规则的功能,可实现对资源访问的限制。 4. 在安全组管理界面中,配置白名单规则,即添加允许访问的IP地址或地址段。只有这些IP地址可以访问关联的资源。 需要注意的是,在使用ruiyi-cloud白名单规则时,应定期检查和更新白名单,以适应企业业务的发展和变化。同时,对于使用动态IP的用户,应注意IP地址可能发生变化,需要及时更新白名单设置,以保持访问策略的有效性。通过合理设置和管理ruiyi-cloud白名单规则,可以提高网络安全水平,实现有针对性的IP限制和访问控制。 #### 引用[.reference_title] - *1* *2* [阿里云的白名单规则如何实现IP限制和访问控制?](https://blog.youkuaiyun.com/weixin_51708323/article/details/130958168)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [蓝凌(Landray)OA漏洞常见RCE](https://blog.youkuaiyun.com/qq_53385700/article/details/128650811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值