Я могу загрузить файл на свой веб-сервер Apache, используя Curl:

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/ правила, которое должно быть запрещено на основе IP-адресов src или dst , или protocol , или method HTTP ... так как я могу прекрасно выполнить HTTP POST между теми же клиент и веб-сервер, между которыми находится один и тот же прокси.

В случае сбоя 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 ответ1

0

Спасибо Амосу Джеффрису за ответ на форуме пользователей squid. Он сказал:

Curl пытается использовать функции HTTP/1.1, которые 2.6 не поддерживает (ожидайте:100-continue, Transfer-Encoding:chunked), и он слишком стар, чтобы даже иметь надлежащие обходные пути для сломанных клиентов. Ваш запрос не будет работать из-за этого, даже если PUT был в порядке.

Пожалуйста, обновите. squid-2.7/3.1 по-прежнему HTTP/1.0, но есть некоторые способы, чтобы обойти функции HTTP/1.1, которые требует curl. Squid-3.2 (бета) имеет поддержку HTTP/1.1.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .