Um mecanismo de servlet (Jetty) está sendo executado por trás de um servidor Apache Httpd, encaminhado usando mod_proxy_http
. Isso está executando um pequeno servlet que aceita solicitações PUT
e é autenticado usando a autenticação HTTP básica (tratada no Jetty).
Ao fazer uma solicitação PUT
direta (não em proxy) com curl
, usando as credenciais de autenticação erradas, o servidor retorna um código de status 401 como esperado:
curl -v -T testfile -u user:WRONG_PASSWORD http://localhost:8080/myservlet/
Isso interrompe as solicitações assim que o código de status é recebido, por isso, o curl não carrega todo o corpo, mas para cedo ( 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
Em contraste, quando atrás de mod_proxy_http
, há uma resposta 100 Continue
enviada quase de imediato pelo Apache Httpd, que curl interpreta como continue
, então envia a solicitação inteira ( We are completely uploaded and fine
) antes de eventualmente receber a resposta 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
Existe uma maneira de impedir que mod_proxy_http
use o código 100 Continue
e aguarde o código de status 401
do servidor backend antes de enviar sua primeira resposta?
Eu tentei seguir a seguinte sugestão desta pergunta , mas isso não resolveu o problema não era exatamente o mesmo problema):
ProxyPass /myservlet/ http://localhost:8080/myservlet/
<Location /myservlet/>
RequestHeader unset Expect early
</Location>