无法通过 Squid 代理测试基于 HTTP PUT 的文件上传

无法通过 Squid 代理测试基于 HTTP PUT 的文件上传

我可以使用 Curl 将文件上传到我的 Apache Web 服务器:

echo "[$(date)] file contents." | curl -T - http://WEB-SERVER/upload/sample.put 

但是,如果我在中间放置一个 Squid 代理服务器,那么我就无法:

echo "[$(date)] file contents." | curl -x http://SQUID-PROXY:3128 -T - http://WEB-SERVER/upload/sample.put 

Curl 报告以下错误:

注意:此错误响应是 HTML 格式,但为了便于阅读,我删除了标签。

ERROR: The requested URL could not be retrieved

ERROR
The requested URL could not be retrieved

While trying to retrieve the URL:
http://WEB-SERVER/upload/sample.put

The following error was encountered:
Unsupported Request Method and Protocol

Squid does not support all request methods for all access protocols.
For example, you can not POST a Gopher request.
Your cache administrator is root. 

我的squid.conf似乎没有任何 ACL/规则应该根据srcdstIP 地址、或protocol或 HTTP来禁止method...因为我可以HTTP POST在同一个客户端和 Web 服务器之间很好地完成操作,并且两者之间使用同一个代理。

为了防止出现故障HTTP PUT,为了查看实际发生的请求和响应流量,我netcat在 Curl 和 Squid 之间放置了一个进程,我看到的情况如下:

要求:

PUT http://WEB-SERVER/upload/sample.put HTTP/1.1
User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: WEB-SERVER
Pragma: no-cache
Accept: */*
Proxy-Connection: Keep-Alive
Transfer-Encoding: chunked
Expect: 100-continue

回复:

HTTP/1.0 501 Not Implemented
Server: squid/2.6.STABLE21
Date: Sun, 13 May 2012 02:11:39 GMT
Content-Type: text/html
Content-Length: 1078
Expires: Sun, 13 May 2012 02:11:39 GMT
X-Squid-Error: ERR_UNSUP_REQ 0
X-Cache: MISS from SQUID-PROXY-FQDN
X-Cache-Lookup: NONE from SQUID-PROXY-FQDN:3128
Via: 1.0 SQUID-PROXY-FQDN:3128 (squid/2.6.STABLE21)
Proxy-Connection: close

<SNIPPED the HTML error response already shown earlier above>

注意:为了便于阅读,我已将 IP 地址和服务器名称匿名化。

注:我已将这个问题发布在StackOverflow 也,但没有得到有用的回复。将其发布在这里,以防 StackOverflow 上的人们认为这是一个非编程问题并且不感兴趣。

答案1

感谢 Amos Jeffries 在squid 用户论坛。 他说:

Curl 正在尝试使用 2.6 不支持的 HTTP/1.1 功能(Expect:100-continue、Transfer-Encoding:chunked),并且太旧了,甚至无法为损坏的客户端提供适当的解决方法。即使 PUT 没问题,您的请求也会因这些原因而无法正常工作。

请升级。squid-2.7/3.1 仍然是 HTTP/1.0,但有一些技巧可以解决 curl 要求的 HTTP/1.1 功能。Squid-3.2(测试版)支持 HTTP/1.1。

相关内容