Назад | Перейти на главную страницу

Заставить mod_proxy_http отправлять ответ асинхронно (без 100 Continue)

Механизм сервлетов (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>