function test_oembed_create_xml()
 {
     $actual = _oembed_create_xml(array('foo' => 'bar', 'bar' => 'baz', 'ping' => 'pong'));
     $expected = '<oembed><foo>bar</foo><bar>baz</bar><ping>pong</ping></oembed>';
     $this->assertStringEndsWith($expected, trim($actual));
     $actual = _oembed_create_xml(array('foo' => array('bar' => 'baz'), 'ping' => 'pong'));
     $expected = '<oembed><foo><bar>baz</bar></foo><ping>pong</ping></oembed>';
     $this->assertStringEndsWith($expected, trim($actual));
     $actual = _oembed_create_xml(array('foo' => array('bar' => array('ping' => 'pong')), 'hello' => 'world'));
     $expected = '<oembed><foo><bar><ping>pong</ping></bar></foo><hello>world</hello></oembed>';
     $this->assertStringEndsWith($expected, trim($actual));
     $actual = _oembed_create_xml(array(array('foo' => array('bar')), 'helloworld'));
     $expected = '<oembed><oembed><foo><oembed>bar</oembed></foo></oembed><oembed>helloworld</oembed></oembed>';
     $this->assertStringEndsWith($expected, trim($actual));
 }
/**
 * Creates an XML string from a given array.
 *
 * @since 4.4.0
 * @access private
 *
 * @param array            $data The original oEmbed response data.
 * @param SimpleXMLElement $node Optional. XML node to append the result to recursively.
 * @return string|false XML string on success, false on error.
 */
function _oembed_create_xml($data, $node = null)
{
    if (!is_array($data) || empty($data)) {
        return false;
    }
    if (null === $node) {
        $node = new SimpleXMLElement('<oembed></oembed>');
    }
    foreach ($data as $key => $value) {
        if (is_numeric($key)) {
            $key = 'oembed';
        }
        if (is_array($value)) {
            $item = $node->addChild($key);
            _oembed_create_xml($value, $item);
        } else {
            $node->addChild($key, esc_html($value));
        }
    }
    return $node->asXML();
}
 /**
  * Print the oEmbed XML response.
  *
  * @since 4.4.0
  *
  * @param array $data The oEmbed response data.
  * @return string The XML response data.
  */
 public function xml_response($data)
 {
     if (!class_exists('SimpleXMLElement')) {
         status_header(501);
         return get_status_header_desc(501);
     }
     $result = _oembed_create_xml($data);
     // Bail if there's no XML.
     if (!$result) {
         status_header(501);
         return get_status_header_desc(501);
     }
     if (!headers_sent()) {
         header('Content-Type: text/xml; charset=' . get_option('blog_charset'));
     }
     return $result;
 }
 /**
  * If oEmbed request wants XML, return XML instead of JSON.
  *
  * Basically a copy of {@link _oembed_rest_pre_serve_request()}. Unfortunate
  * that we have to duplicate this just for a URL check.
  *
  * @since 2.6.0
  *
  * @param bool                      $served  Whether the request has already been served.
  * @param WP_HTTP_ResponseInterface $result  Result to send to the client. Usually a WP_REST_Response.
  * @param WP_REST_Request           $request Request used to generate the response.
  * @param WP_REST_Server            $server  Server instance.
  * @return bool
  */
 public function oembed_xml_request($served, $result, $request, $server)
 {
     $params = $request->get_params();
     if (!isset($params['format']) || 'xml' !== $params['format']) {
         return $served;
     }
     // Validate URL against our oEmbed endpoint. If not valid, bail.
     // This is our mod to _oembed_rest_pre_serve_request().
     $query_params = $request->get_query_params();
     if (false === $this->validate_url_to_item_id($query_params['url'])) {
         return $served;
     }
     // Embed links inside the request.
     $data = $server->response_to_data($result, false);
     if (!class_exists('SimpleXMLElement')) {
         status_header(501);
         die(get_status_header_desc(501));
     }
     $result = _oembed_create_xml($data);
     // Bail if there's no XML.
     if (!$result) {
         status_header(501);
         return get_status_header_desc(501);
     }
     if (!headers_sent()) {
         $server->send_header('Content-Type', 'text/xml; charset=' . get_option('blog_charset'));
     }
     echo $result;
     return true;
 }
 /**
  * Print the oEmbed XML response.
  *
  * @since 4.4.0
  *
  * @param array $data The oEmbed response data.
  * @return string The XML response data.
  */
 public function xml_response($data)
 {
     $result = _oembed_create_xml($data);
     // Bail if there's no XML.
     if (!$result) {
         status_header(501);
         return 'Not implemented';
     }
     if (!headers_sent()) {
         header('Content-Type: text/xml; charset=' . get_option('blog_charset'));
     }
     return $result;
 }