wp_remote_post no funciona con más de 1024 bytes en el cuerpo

2

Lo que necesito

Estoy trabajando con una API de terceros (para los fines de esta pregunta, es irrelevante cuál) y necesito enviar una solicitud POST a un servicio externo.

Estoy tratando de usar wp_remote_post para lograr lo que necesito, pero parece que hay un límite para la cantidad de datos que puede enviar en su cuerpo de solicitud.

El problema que estoy enfrentando

Se envía solo si el cuerpo contiene hasta 1024 caracteres . Un personaje más y la solicitud (aparentemente) no se envía.

Depurar

Estoy tratando de solucionar el problema utilizando ngrok para escuchar las solicitudes POST en $url , y configurar manualmente $body como cadena de "bla bla bla (...)". Solo se muestran cuando $body contiene 1024 o menos caracteres. No obtengo un error 5xx o cualquier otro mensaje de error. De hecho, is_wp_error( $response ) devuelve false .

Sin embargo, si uso una herramienta como Postman para generar una solicitud POST similar fuera de WP con más De 1024 caracteres en su cuerpo, ngrok lo recibe muy bien.

  • WP - > Cuerpo de solicitud inferior a 1024 bytes - > ngrok = OK
  • WP - > Cuerpo de solicitud mayor de 1024 bytes - > ngrok = ??
  • Cartero - > Cuerpo de solicitud inferior a 1024 bytes - > ngrok = OK
  • Cartero - > Cuerpo de solicitud mayor de 1024 bytes - > ngrok = OK

Lo que probé

  • Enviar la misma solicitud desde fuera de WordPress con más de 1024 bytes en su cuerpo: funciona.
  • Una nueva instalación de WordPress sin complementos y un tema predeterminado (veintisiete): no funciona.
  • Probar en una PC diferente, con la última instalación de Fedora, el último kernel de Linux, la última versión de Firefox, la última versión de Docker: no funcionó.

Mi configuración

Todas las pruebas se están realizando en mi máquina local, con WordPress 4.9.5 ejecutándose dentro de un contenedor Docker con la imagen de WordPress predeterminada, y utiliza la configuración predeterminada no modificada, excepto por las siguientes líneas de entrada php personalizadas:

file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600

El código

  $response = wp_remote_post( $url,
    array(
      'timeout' => 60,
      'redirection' => 5,
      'blocking' => true,
      'headers' => array(
        'Content-Type' => 'application/json',
      ),
      'body' => 'bla bla (...)' // fails if larger than 1024
    )
  );

  if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Something went wrong: $error_message";
  } else { echo "Request sent"; }
    
pregunta That Brazilian Guy 21.04.2018 - 14:53

1 respuesta

5

Si está utilizando el transporte CURL, a veces tiene problemas menores al enviar solicitudes POST de más de 1024 caracteres. Más información aquí:

enlace

La solución sugerida es enviar un encabezado Expect: vacío. Puedes hacer esto modificando tu código de esta manera:

$response = wp_remote_post( $url,
    array(
      'timeout' => 60,
      'redirection' => 5,
      'blocking' => true,
      'headers' => array(
        'Content-Type' => 'application/json',
        'Expect' => '',
      ),
      'body' => 'bla bla (...)' // fails if larger than 1024
    )
  );

Editar: más información:

Algunas versiones de curl y PHP, cuando ingresan más de 1024 caracteres en el cuerpo, enviarán primero los encabezados y luego un encabezado "Esperar: 100-continuar". Un servidor web que reciba esto debe responder con un estado de 100 Continuar para que el cliente continúe enviando el resto del cuerpo.

Si está utilizando un servidor web real, enviará esa respuesta para recibir el resto del mensaje. Algunos servidores web más antiguos no hicieron esto, por lo tanto, la solución dada en esa pregunta anterior.

No sé qué es ngrok, pero apuesto a que no está respondiendo como un servidor web normal aquí. Sin que el servidor diga que continúe la POST, curl espera a que lo haga. Eventualmente se agota.

    
respondido por el Otto 22.04.2018 - 16:44

Lea otras preguntas en las etiquetas