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:
- Primero, agregue un encabezado de solicitud Expect: 100-continue y envíe esta solicitud sin datos POST;
- 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.