WordPress.org

Make WordPress Core

Ticket #10588: IXR-HTTP.diff

File IXR-HTTP.diff, 4.3 KB (added by andy, 10 years ago)
  • wp-includes/class-IXR.php

     
    507507        if (!$path) {
    508508            // Assume we have been given a URL instead
    509509            $bits = parse_url($server);
     510            $this->scheme = $bits['scheme'];
    510511            $this->server = $bits['host'];
    511512            $this->port = isset($bits['port']) ? $bits['port'] : 80;
    512513            $this->path = isset($bits['path']) ? $bits['path'] : '/';
     
    515516                $this->path = '/';
    516517            }
    517518        } else {
     519            $this->scheme = 'http';
    518520            $this->server = $server;
    519521            $this->path = $path;
    520522            $this->port = $port;
     
    526528        $args = func_get_args();
    527529        $method = array_shift($args);
    528530        $request = new IXR_Request($method, $args);
    529         $length = $request->getLength();
    530531        $xml = $request->getXml();
    531         $r = "\r\n";
    532         $request  = "POST {$this->path} HTTP/1.0$r";
    533532
    534                 $this->headers['Host']                  = $this->server;
    535                 $this->headers['Content-Type']  = 'text/xml';
    536                 $this->headers['User-Agent']    = $this->useragent;
    537                 $this->headers['Content-Length']= $length;
     533        $url = $this->scheme . '://' . $this->server . ':' . $this->port . $this->path;
     534        $args = array(
     535            'headers'    => array('Content-Type' => 'text/xml'),
     536            'user-agent' => $this->useragent,
     537            'body'       => $xml,
     538        );
    538539
    539                 foreach( $this->headers as $header => $value ) {
    540                         $request .= "{$header}: {$value}{$r}";
    541                 }
    542                 $request .= $r;
     540        foreach ( $this->headers as $header => $value )
     541            $args['headers'][$header] = $value;
    543542
    544         $request .= $xml;
     543        if ( $this->timeout !== false )
     544            $args['timeout'] = $this->timeout;
     545
    545546        // Now send the request
    546547        if ($this->debug) {
    547             echo '<pre class="ixr_request">'.htmlspecialchars($request)."\n</pre>\n\n";
     548            echo '<pre class="ixr_request">'.htmlspecialchars($xml)."\n</pre>\n\n";
    548549        }
    549         if ($this->timeout) {
    550             $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout);
    551         } else {
    552             $fp = @fsockopen($this->server, $this->port, $errno, $errstr);
     550
     551        $response = wp_remote_post($url, $args);
     552
     553        if ( is_wp_error($response) ) {
     554            $errno    = $response->get_error_code();
     555            $errorstr = $response->get_error_message();
     556            $this->error = new IXR_Error(-32300, "transport error: $errno $errstr");
     557            return false;
    553558        }
    554         if (!$fp) {
    555             $this->error = new IXR_Error(-32300, "transport error - could not open socket: $errno $errstr");
     559
     560        $code = $response['response']['code'];
     561        if ( $code != 200 ) {
     562            $this->error = new IXR_Error(-32301, "transport error - HTTP status code was not 200 ($code)");
    556563            return false;
    557564        }
    558         fputs($fp, $request);
    559         $contents = '';
    560         $debug_contents = '';
    561         $gotFirstLine = false;
    562         $gettingHeaders = true;
    563         while (!feof($fp)) {
    564             $line = fgets($fp, 4096);
    565             if (!$gotFirstLine) {
    566                 // Check line for '200'
    567                 if (strstr($line, '200') === false) {
    568                     $this->error = new IXR_Error(-32301, 'transport error - HTTP status code was not 200');
    569                     return false;
    570                 }
    571                 $gotFirstLine = true;
    572             }
    573             if (trim($line) == '') {
    574                 $gettingHeaders = false;
    575             }
    576             if (!$gettingHeaders) {
    577                 $contents .= trim($line);
    578             }
    579             if ($this->debug) {
    580                 $debug_contents .= $line;
    581             }
    582         }
    583565        if ($this->debug) {
     566            $debug_contents = $response['body'];
    584567            echo '<pre class="ixr_response">'.htmlspecialchars($debug_contents)."\n</pre>\n\n";
    585568        }
    586         // Now parse what we've got back
    587         $this->message = new IXR_Message($contents);
     569        $this->message = new IXR_Message($response['body']);
    588570        if (!$this->message->parse()) {
    589571            // XML error
    590572            $this->error = new IXR_Error(-32700, 'parse error. not well formed');