100 Continue
Uso
Los clientes que incluyen la cabecera Expect quieren confirmar que el servidor está preparado para recibir el cuerpo del mensaje antes de transmitirlo. Cuando el cuerpo del mensaje es grande, usa un tipo de contenido que el servidor no acepta o el usuario carece de autorización para enviar archivos, este proceso valida esas condiciones antes de enviar el cuerpo.
Una vez que llega el código de estado 100 Continue, se envía el cuerpo del mensaje. Cuando el servidor devuelve 417 en su lugar, el cliente no continúa.
La ventaja de usar la cabecera Expect con 100-continue es el ahorro de ancho de banda cuando el servidor es selectivo respecto al contenido que recibe y procesa.
La desventaja es que la cabecera y el cuerpo de la solicitud HTTP se envían de forma independiente. Algunos entornos son propensos a separarlos y a devolver un error en lugar de procesar la solicitud HTTP.
Ejemplo
Solicitud
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue
Respuesta
HTTP/1.1 100 Continue
Continuación de la solicitud
<PDF file contents are sent as message body>
Respuesta final
HTTP/1.1 200 OK
El cliente tiene previsto enviar al servidor un archivo PDF de 99 KB para su procesamiento y lo indica en la solicitud HTTP, pidiendo una validación previa. El servidor responde afirmativamente y el cliente envía el cuerpo del mensaje. Como respuesta final, el servidor cierra la sesión HTTP con una indicación de éxito.
Como alternativa, el servidor responde con un error:
HTTP/1.1 417 Expectation Failed
En esta situación, el cliente no envía el PDF y la comunicación posterior comienza con una nueva solicitud HTTP.
Expect100Continue en las bibliotecas cliente
Muchas bibliotecas cliente de HTTP exponen Expect100Continue como una propiedad configurable. En .NET, ServicePointManager.Expect100Continue controla si las solicitudes POST y PUT incluyen automáticamente la cabecera Expect: 100-continue. Deshabilitar esta propiedad omite la comprobación preliminar y envía el cuerpo de inmediato.
Referencias de código
.NET
HttpStatusCode.Continue
Rust
http::StatusCode::CONTINUE
Rails
:continue
Go
http.StatusContinue
Symfony
Response::HTTP_CONTINUE
Python3.5+
http.HTTPStatus.CONTINUE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_CONTINUE
Angular
@angular/common/http/HttpStatusCode.Continue