Skip to content
Permalink
Browse files

Fix warnings from file_get_contents() in Xml::build()

Use HttpSocket to get proper exceptions when trying to load XML from
remote servers.

Fixes #3379
  • Loading branch information...
markstory committed Nov 19, 2012
1 parent 6b4afb9 commit fb275c5fa257c98f85883115ae12dbf5671094e1
Showing with 11 additions and 3 deletions.
  1. +1 −0 lib/Cake/Test/Case/Utility/XmlTest.php
  2. +10 −3 lib/Cake/Utility/Xml.php
@@ -177,6 +177,7 @@ public static function invalidDataProvider() {
array(null),
array(false),
array(''),
array('http://localhost/notthere.xml'),
);
}
@@ -18,6 +18,7 @@
* @since CakePHP v .0.10.3.1400
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
App::uses('HttpSocket', 'Network/Http');
/**
* XML handling for Cake.
@@ -97,9 +98,15 @@ public static function build($input, $options = array()) {
return self::fromArray((array)$input, $options);
} elseif (strpos($input, '<') !== false) {
return self::_loadXml($input, $options);
} elseif (file_exists($input) || strpos($input, 'http://') === 0 || strpos($input, 'https://') === 0) {
$input = file_get_contents($input);
return self::_loadXml($input, $options);
} elseif (file_exists($input)) {
return self::_loadXml(file_get_contents($input), $options);
} elseif (strpos($input, 'http://') === 0 || strpos($input, 'https://') === 0) {
$socket = new HttpSocket();
$response = $socket->get($input);
if (!$response->isOk()) {
throw new XmlException(__d('cake_dev', 'XML cannot be read.'));
}
return self::_loadXml($response->body, $options);
} elseif (!is_string($input)) {
throw new XmlException(__d('cake_dev', 'Invalid input.'));
}

4 comments on commit fb275c5

@renan

This comment has been minimized.

Copy link
Member

replied Jan 17, 2013

This introduces a small BC as file_get_contents follow redirects by default and HttpSocket doesn't.

@dereuromark

This comment has been minimized.

Copy link
Member

replied Jan 17, 2013

file_get_contents($input) should probably use the $context (second param) and connection: close, though, as HTTP1.1 now leaves it open with this method if not specifically declared as "closing" in the headers creating an overhead of never-closing connections in some cases.

@markstory

This comment has been minimized.

Copy link
Member Author

replied Jan 17, 2013

file_get_contents() was removed because of shitty error handling, I don't know why we'd add it back. HttpSocket can follow redirects its just a config option.

@markstory

This comment has been minimized.

Copy link
Member Author

replied Jan 17, 2013

Fixed in 689745d

Please sign in to comment.
You can’t perform that action at this time.