it-swarm.com.de

Wie behebe ich Antworten mit WP HTTP API?

Ich rufe die API mit GET auf, der Aufruf soll keine Daten zurückgeben:

  • browser (und Sniffer) geben mir 200-OK-Antwort mit null Text als Textkörper;
  • wp_remote_get() gibt mir eine 200-OK-Antwort mit einer Zeichenfolge von binärem Müll als Textkörper.

Andere API-Anforderungen (die nicht leere Daten zurückgeben sollen und sollen) funktionieren einwandfrei.

Wo fange ich an, die HTTP-API zu stöbern, um herauszufinden, warum es zu Müll kommt?

Hier ist ein Speicherauszug der vollständigen Antwortdaten:

array
  'headers' => 
    array
      'date' => string 'Tue, 22 Feb 2011 16:51:03 GMT' (length=29)
      'server' => string 'Apache/2.2.3 (Red Hat)' (length=22)
      'x-powered-by' => string 'PHP/5.2.16' (length=10)
      'content-encoding' => string 'deflate' (length=7)
      'vary' => string 'Accept-Encoding' (length=15)
      'content-length' => string '17' (length=2)
      'connection' => string 'close' (length=5)
      'content-type' => string 'application/json; charset=utf-8' (length=31)
  'body' => string 'x��+��������_' (length=17)
  'response' => 
    array
      'code' => int 200
      'message' => string 'OK' (length=2)
  'cookies' => 
    array
      empty
2
Rarst

[update] Die von MailChimp verwendete Komprimierungsmethode wurde in WP core in Version 3.3 implementiert.


Dieses Problem trat erneut auf und dieses Mal konnte ich es reproduzieren und Fehler beheben.

WordPress gibt an, dass deflationierte Daten mit hoher Priorität erwartet werden, aber aus irgendeinem Grund können einige Antworten nicht aufgeblasen werden - sie werden entweder von gzinflate() oder WP_Http_Encoding::compatible_gzinflate() nicht erkannt.

In meinem speziellen Fall gab es anscheinend zwei zusätzliche Bytes beim Start, die dies verursacht haben. Ermittelt aus Kommentaren zu gzinflate() docs , die auch die Quelle für WP_Http_Encoding::compatible_gzinflate() sind, aber anscheinend ist diese Funktion nicht perfekt.

Grobe Schnellkorrektur, die prüft, ob die Antwort JSON-Daten enthält und versucht, das Komprimierungsproblem ansonsten zu beheben:

add_filter('http_response', 'mailchimp_http_response_inflate_fix', 10, 3);

function mailchimp_http_response_inflate_fix($response, $args, $url) {

    if( false === strpos($url, 'sts.mailchimp.com') )
        return $response;

    $json = json_decode($response['body']);

    if( is_null($json) ) {

        $inflate = @gzinflate(substr($response['body'], 2));

        if( false !== $inflate )
            $response['body'] = $inflate;
    }

    return $response;
}
2
Rarst

Wir haben festgestellt, dass die Inhaltscodierung '=> Zeichenfolge' deflate '(Länge = 7) fehlerhaft ist.

WP_HTTP fügt ohne Grund einen deflate-Header hinzu und dekomprimiert die Ergebnisse mit gzip. Dies geschieht nur, wenn der Hauptteil der Antwort eine bestimmte Zeichenfolgenlänge unterschreitet.

Sehr ärgerlich, wenn Sie nur eine 1 oder eine 0 wollen.

Eine Anfrage an WP_Hackers führte zu keinem Fix. Könnte es weiter jagen müssen .....

2
Barry Carlyon