Механизм сервлетов (Jetty) работает за сервером Apache Httpd, пересылаемый с использованием mod_proxy_http
. Это запускает небольшой сервлет, который принимает PUT
запросов и аутентифицируется с использованием базовой аутентификации HTTP (обрабатывается в Jetty).
При прямом (без прокси) PUT
запрос с curl
, используя неправильные учетные данные для аутентификации, сервер возвращает код состояния 401, как и ожидалось:
curl -v -T testfile -u user:WRONG_PASSWORD http://localhost:8080/myservlet/
Это прерывает запросы, как только получен код состояния, поэтому curl не загружает все тело, а останавливается раньше (HTTP error before end of send, stop sending
).
* About to connect() to localhost port 8080 (#0)
* Trying 127.0.0.1... connected
* Server auth using Basic with user 'user'
> PUT /myservlet/testfile HTTP/1.1
> Authorization: Basic xxxxxxxxxxxxxxxxx
> User-Agent: curl/7.22.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 3672
> Expect: 100-continue
>
< HTTP/1.1 401 Unauthorized
< Date: xxxxxxxxxxxxxxxx
* Authentication problem. Ignoring this.
< WWW-Authenticate: basic realm="Test Realm"
< Content-Length: 0
< Server: Jetty(7.4.5.v20110725)
* HTTP error before end of send, stop sending
<
* Closing connection #0
Напротив, когда позади mod_proxy_http
, есть 100 Continue
ответ, отправленный почти сразу Apache Httpd, который curl интерпретирует как continue
, поэтому он отправляет весь запрос (We are completely uploaded and fine
) прежде, чем он в конечном итоге получит 401
ответ.
* Trying 127.0.0.1... connected
* Server auth using Basic with user 'user'
> PUT /myservlet/testfile HTTP/1.1
> Authorization: Basic xxxxxxxxxxxxxxxxx
> User-Agent: curl/7.22.0
> Host: localhost
> Accept: */*
> Content-Length: xxxxxx
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 401 Unauthorized
< Date: xxxxxxxxxxxxxxxx
< Server: Jetty(7.4.5.v20110725)
* Authentication problem. Ignoring this.
< WWW-Authenticate: basic realm="Test Realm"
< Content-Length: 0
< Via: 1.1 localhost
< Content-Type: xxxxxxxxxxxxxx
<
* Connection #0 to host localhost left intact
* Closing connection #0
Есть ли способ предотвратить mod_proxy_http
от использования 100 Continue
код и заставить его ждать 401
код состояния с внутреннего сервера перед отправкой первого ответа?
Я пытался следовать следующее предложение из этого вопроса, но это не решило проблему (в любом случае это была не та же проблема):
ProxyPass /myservlet/ http://localhost:8080/myservlet/
<Location /myservlet/>
RequestHeader unset Expect early
</Location>