Esperar: 100-continuar en el encabezado de solicitud HTTP put / post

Cuando se usa HTTPClient encapsulado en curl, en el método put de carga de archivos, a través del análisis de datos de captura de paquetes, se encuentra que antes de que cada dato se transmita realmente, se debe recibir una respuesta del lado del servidor: HTTP / 1.1 100 Continue, que sin duda aumenta el tiempo solicitado;

Cuando se usa curl para enviar una solicitud POST, si los datos POST son mayores de 1024 bytes, el comportamiento predeterminado de curl es el siguiente:

  1. Primero, agregue un encabezado de solicitud Expect: 100-continue y envíe esta solicitud sin datos POST;
  2. Si la información del encabezado de respuesta devuelta por el servidor contiene Expect: 100-continue, significa que el servidor está dispuesto a aceptar los datos y luego POST los datos reales al servidor;

Por lo tanto, si el cliente espera esperar una respuesta "100-continue", la solicitud que envía debe contener un "Expect: 100-continue";

Se puede ver que curl envió una solicitud HTTP innecesaria en este momento, lo que no está permitido en términos de rendimiento del sistema. Además, no todos los servidores responderán correctamente a 100-continue, pero devolverán 417 Expectation Failed. El lado curl no iniciará una solicitud POST de datos, lo que provocará errores de lógica empresarial. Debemos evitar esta situación.

Solución:

Simplemente configure el encabezado de la solicitud Expect para que esté vacío.

Al encapsular la interfaz, podemos hacer las siguientes configuraciones:

        struct curl_slist *headers = NULL;
	headers = curl_slist_append(headers, "Expect:");  //注意此处的操作
	headers = curl_slist_append(headers, "Connection:keep-alive");
	/* 1: set http server url */
	curl_easy_setopt(curl, CURLOPT_URL, serv_url);

	// 3.4:put & upload
	curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
	curl_easy_setopt(curl, CURLOPT_PUT, 1);
	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
	curl_easy_setopt(curl, CURLOPT_READFUNCTION, upload_read_func);
	curl_easy_setopt(curl, CURLOPT_READDATA, fp);
	curl_easy_setopt(curl, CURLOPT_INFILESIZE, local_file_length);

	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
	/* abort if slower than 1 bytes/sec during 6 seconds */
	curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1);
	curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 6);
        ......

Después de capturar el paquete nuevamente, se encontró que cuando se usa curl para enviar datos PUT / POST que exceden los 1024 bytes, no hay una solicitud HTTP 100-continue.

Supongo que te gusta

Origin blog.csdn.net/Swallow_he/article/details/94444766
Recomendado
Clasificación