summaryrefslogtreecommitdiff
path: root/Apache/Solr/HttpTransport
diff options
context:
space:
mode:
Diffstat (limited to 'Apache/Solr/HttpTransport')
-rwxr-xr-xApache/Solr/HttpTransport/Abstract.php89
-rwxr-xr-xApache/Solr/HttpTransport/Curl.php198
-rwxr-xr-xApache/Solr/HttpTransport/CurlNoReuse.php196
-rwxr-xr-xApache/Solr/HttpTransport/FileGetContents.php216
-rwxr-xr-xApache/Solr/HttpTransport/Interface.php94
-rwxr-xr-xApache/Solr/HttpTransport/Response.php255
6 files changed, 1048 insertions, 0 deletions
diff --git a/Apache/Solr/HttpTransport/Abstract.php b/Apache/Solr/HttpTransport/Abstract.php
new file mode 100755
index 0000000..cf9f76d
--- /dev/null
+++ b/Apache/Solr/HttpTransport/Abstract.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Copyright (c) 2007-2011, Servigistics, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Servigistics, Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @copyright Copyright 2007-2011 Servigistics, Inc. (http://servigistics.com)
+ * @license http://solr-php-client.googlecode.com/svn/trunk/COPYING New BSD
+ * @version $Id: $
+ *
+ * @package Apache
+ * @subpackage Solr
+ * @author Timo Schmidt <timo.schmidt@aoemedia.de>, Donovan Jimenez <djimenez@conduit-it.com>
+ */
+
+/**
+ * Convenience class that implements the transport implementation. Can be extended by
+ * real implementations to do some of the common book keeping
+ */
+abstract class Apache_Solr_HttpTransport_Abstract implements Apache_Solr_HttpTransport_Interface
+{
+ /**
+ * Our default timeout value for requests that don't specify a timeout
+ *
+ * @var float
+ */
+ private $_defaultTimeout = false;
+
+ /**
+ * Get the current default timeout setting (initially the default_socket_timeout ini setting)
+ * in seconds
+ *
+ * @return float
+ */
+ public function getDefaultTimeout()
+ {
+ // lazy load the default timeout from the ini settings
+ if ($this->_defaultTimeout === false)
+ {
+ $this->_defaultTimeout = (int) ini_get('default_socket_timeout');
+
+ // double check we didn't get 0 for a timeout
+ if ($this->_defaultTimeout <= 0)
+ {
+ $this->_defaultTimeout = 60;
+ }
+ }
+
+ return $this->_defaultTimeout;
+ }
+
+ /**
+ * Set the current default timeout for all HTTP requests
+ *
+ * @param float $timeout
+ */
+ public function setDefaultTimeout($timeout)
+ {
+ $timeout = (float) $timeout;
+
+ if ($timeout >= 0)
+ {
+ $this->_defaultTimeout = $timeout;
+ }
+ }
+} \ No newline at end of file
diff --git a/Apache/Solr/HttpTransport/Curl.php b/Apache/Solr/HttpTransport/Curl.php
new file mode 100755
index 0000000..7cb7743
--- /dev/null
+++ b/Apache/Solr/HttpTransport/Curl.php
@@ -0,0 +1,198 @@
+<?php
+/**
+ * Copyright (c) 2007-2011, Servigistics, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Servigistics, Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @copyright Copyright 2007-2011 Servigistics, Inc. (http://servigistics.com)
+ * @license http://solr-php-client.googlecode.com/svn/trunk/COPYING New BSD
+ * @version $Id: $
+ *
+ * @package Apache
+ * @subpackage Solr
+ * @author Timo Schmidt <timo.schmidt@aoemedia.de>, Donovan Jimenez <djimenez@conduit-it.com>
+ */
+
+// Require Apache_Solr_HttpTransport_Abstract
+require_once(dirname(__FILE__) . '/Abstract.php');
+
+/**
+ * A Curl based HTTP transport. Uses a single curl session for all requests.
+ */
+class Apache_Solr_HttpTransport_Curl extends Apache_Solr_HttpTransport_Abstract
+{
+ /**
+ * SVN Revision meta data for this class
+ */
+ const SVN_REVISION = '$Revision:$';
+
+ /**
+ * SVN ID meta data for this class
+ */
+ const SVN_ID = '$Id:$';
+
+ /**
+ * Curl Session Handle
+ *
+ * @var resource
+ */
+ private $_curl;
+
+ /**
+ * Initializes a curl session
+ */
+ public function __construct()
+ {
+ // initialize a CURL session
+ $this->_curl = curl_init();
+
+ // set common options that will not be changed during the session
+ curl_setopt_array($this->_curl, array(
+ // return the response body from curl_exec
+ CURLOPT_RETURNTRANSFER => true,
+
+ // get the output as binary data
+ CURLOPT_BINARYTRANSFER => true,
+
+ // we do not need the headers in the output, we get everything we need from curl_getinfo
+ CURLOPT_HEADER => false
+ ));
+ }
+
+ /**
+ * Closes a curl session
+ */
+ function __destruct()
+ {
+ // close our curl session
+ curl_close($this->_curl);
+ }
+
+ public function performGetRequest($url, $timeout = false)
+ {
+ // check the timeout value
+ if ($timeout === false || $timeout <= 0.0)
+ {
+ // use the default timeout
+ $timeout = $this->getDefaultTimeout();
+ }
+
+ // set curl GET options
+ curl_setopt_array($this->_curl, array(
+ // make sure we're returning the body
+ CURLOPT_NOBODY => false,
+
+ // make sure we're GET
+ CURLOPT_HTTPGET => true,
+
+ // set the URL
+ CURLOPT_URL => $url,
+
+ // set the timeout
+ CURLOPT_TIMEOUT => $timeout
+ ));
+
+ // make the request
+ $responseBody = curl_exec($this->_curl);
+
+ // get info from the transfer
+ $statusCode = curl_getinfo($this->_curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($this->_curl, CURLINFO_CONTENT_TYPE);
+
+ return new Apache_Solr_HttpTransport_Response($statusCode, $contentType, $responseBody);
+ }
+
+ public function performHeadRequest($url, $timeout = false)
+ {
+ // check the timeout value
+ if ($timeout === false || $timeout <= 0.0)
+ {
+ // use the default timeout
+ $timeout = $this->getDefaultTimeout();
+ }
+
+ // set curl HEAD options
+ curl_setopt_array($this->_curl, array(
+ // this both sets the method to HEAD and says not to return a body
+ CURLOPT_NOBODY => true,
+
+ // set the URL
+ CURLOPT_URL => $url,
+
+ // set the timeout
+ CURLOPT_TIMEOUT => $timeout
+ ));
+
+ // make the request
+ $responseBody = curl_exec($this->_curl);
+
+ // get info from the transfer
+ $statusCode = curl_getinfo($this->_curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($this->_curl, CURLINFO_CONTENT_TYPE);
+
+ return new Apache_Solr_HttpTransport_Response($statusCode, $contentType, $responseBody);
+ }
+
+ public function performPostRequest($url, $postData, $contentType, $timeout = false)
+ {
+ // check the timeout value
+ if ($timeout === false || $timeout <= 0.0)
+ {
+ // use the default timeout
+ $timeout = $this->getDefaultTimeout();
+ }
+
+ // set curl POST options
+ curl_setopt_array($this->_curl, array(
+ // make sure we're returning the body
+ CURLOPT_NOBODY => false,
+
+ // make sure we're POST
+ CURLOPT_POST => true,
+
+ // set the URL
+ CURLOPT_URL => $url,
+
+ // set the post data
+ CURLOPT_POSTFIELDS => $postData,
+
+ // set the content type
+ CURLOPT_HTTPHEADER => array("Content-Type: {$contentType}"),
+
+ // set the timeout
+ CURLOPT_TIMEOUT => $timeout
+ ));
+
+ // make the request
+ $responseBody = curl_exec($this->_curl);
+
+ // get info from the transfer
+ $statusCode = curl_getinfo($this->_curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($this->_curl, CURLINFO_CONTENT_TYPE);
+
+ return new Apache_Solr_HttpTransport_Response($statusCode, $contentType, $responseBody);
+ }
+} \ No newline at end of file
diff --git a/Apache/Solr/HttpTransport/CurlNoReuse.php b/Apache/Solr/HttpTransport/CurlNoReuse.php
new file mode 100755
index 0000000..1454958
--- /dev/null
+++ b/Apache/Solr/HttpTransport/CurlNoReuse.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Copyright (c) 2007-2011, Servigistics, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Servigistics, Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @copyright Copyright 2007-2011 Servigistics, Inc. (http://servigistics.com)
+ * @license http://solr-php-client.googlecode.com/svn/trunk/COPYING New BSD
+ * @version $Id: $
+ *
+ * @package Apache
+ * @subpackage Solr
+ * @author Timo Schmidt <timo.schmidt@aoemedia.de>, Donovan Jimenez <djimenez@conduit-it.com>
+ */
+
+// Require Apache_Solr_HttpTransport_Abstract
+require_once(dirname(__FILE__) . '/Abstract.php');
+
+/**
+ * An alternative Curl HTTP transport that opens and closes a curl session for
+ * every request. This isn't the recommended way to use curl, but some version of
+ * PHP have memory issues.
+ */
+class Apache_Solr_HttpTransport_CurlNoReuse extends Apache_Solr_HttpTransport_Abstract
+{
+ /**
+ * SVN Revision meta data for this class
+ */
+ const SVN_REVISION = '$Revision:$';
+
+ /**
+ * SVN ID meta data for this class
+ */
+ const SVN_ID = '$Id:$';
+
+ public function performGetRequest($url, $timeout = false)
+ {
+ // check the timeout value
+ if ($timeout === false || $timeout <= 0.0)
+ {
+ // use the default timeout
+ $timeout = $this->getDefaultTimeout();
+ }
+
+ $curl = curl_init();
+
+ // set curl GET options
+ curl_setopt_array($curl, array(
+ // return the response body from curl_exec
+ CURLOPT_RETURNTRANSFER => true,
+
+ // get the output as binary data
+ CURLOPT_BINARYTRANSFER => true,
+
+ // we do not need the headers in the output, we get everything we need from curl_getinfo
+ CURLOPT_HEADER => false,
+
+ // set the URL
+ CURLOPT_URL => $url,
+
+ // set the timeout
+ CURLOPT_TIMEOUT => $timeout
+ ));
+
+ // make the request
+ $responseBody = curl_exec($curl);
+
+ // get info from the transfer
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
+
+ // close our curl session - we're done with it
+ curl_close($curl);
+
+ return new Apache_Solr_HttpTransport_Response($statusCode, $contentType, $responseBody);
+ }
+
+ public function performHeadRequest($url, $timeout = false)
+ {
+ // check the timeout value
+ if ($timeout === false || $timeout <= 0.0)
+ {
+ // use the default timeout
+ $timeout = $this->getDefaultTimeout();
+ }
+
+ $curl = curl_init();
+
+ // set curl HEAD options
+ curl_setopt_array($curl, array(
+ // return the response body from curl_exec
+ CURLOPT_RETURNTRANSFER => true,
+
+ // get the output as binary data
+ CURLOPT_BINARYTRANSFER => true,
+
+ // we do not need the headers in the output, we get everything we need from curl_getinfo
+ CURLOPT_HEADER => false,
+
+ // this both sets the method to HEAD and says not to return a body
+ CURLOPT_NOBODY => true,
+
+ // set the URL
+ CURLOPT_URL => $url,
+
+ // set the timeout
+ CURLOPT_TIMEOUT => $timeout
+ ));
+
+ // make the request
+ $responseBody = curl_exec($curl);
+
+ // get info from the transfer
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
+
+ // close our curl session - we're done with it
+ curl_close($curl);
+
+ return new Apache_Solr_HttpTransport_Response($statusCode, $contentType, $responseBody);
+ }
+
+ public function performPostRequest($url, $postData, $contentType, $timeout = false)
+ {
+ // check the timeout value
+ if ($timeout === false || $timeout <= 0.0)
+ {
+ // use the default timeout
+ $timeout = $this->getDefaultTimeout();
+ }
+
+ $curl = curl_init();
+
+ // set curl POST options
+ curl_setopt_array($curl, array(
+ // return the response body from curl_exec
+ CURLOPT_RETURNTRANSFER => true,
+
+ // get the output as binary data
+ CURLOPT_BINARYTRANSFER => true,
+
+ // we do not need the headers in the output, we get everything we need from curl_getinfo
+ CURLOPT_HEADER => false,
+
+ // make sure we're POST
+ CURLOPT_POST => true,
+
+ // set the URL
+ CURLOPT_URL => $url,
+
+ // set the post data
+ CURLOPT_POSTFIELDS => $postData,
+
+ // set the content type
+ CURLOPT_HTTPHEADER => array("Content-Type: {$contentType}"),
+
+ // set the timeout
+ CURLOPT_TIMEOUT => $timeout
+ ));
+
+ // make the request
+ $responseBody = curl_exec($curl);
+
+ // get info from the transfer
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
+
+ // close our curl session - we're done with it
+ curl_close($curl);
+
+ return new Apache_Solr_HttpTransport_Response($statusCode, $contentType, $responseBody);
+ }
+} \ No newline at end of file
diff --git a/Apache/Solr/HttpTransport/FileGetContents.php b/Apache/Solr/HttpTransport/FileGetContents.php
new file mode 100755
index 0000000..5e01775
--- /dev/null
+++ b/Apache/Solr/HttpTransport/FileGetContents.php
@@ -0,0 +1,216 @@
+<?php
+/**
+ * Copyright (c) 2007-2011, Servigistics, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Servigistics, Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @copyright Copyright 2007-2011 Servigistics, Inc. (http://servigistics.com)
+ * @license http://solr-php-client.googlecode.com/svn/trunk/COPYING New BSD
+ * @version $Id: $
+ *
+ * @package Apache
+ * @subpackage Solr
+ * @author Donovan Jimenez <djimenez@conduit-it.com>
+ */
+
+// Require Apache_Solr_HttpTransport_Abstract
+require_once(dirname(__FILE__) . '/Abstract.php');
+
+/**
+ * HTTP Transport implemenation that uses the builtin http URL wrappers and file_get_contents
+ */
+class Apache_Solr_HttpTransport_FileGetContents extends Apache_Solr_HttpTransport_Abstract
+{
+ /**
+ * SVN Revision meta data for this class
+ */
+ const SVN_REVISION = '$Revision: $';
+
+ /**
+ * SVN ID meta data for this class
+ */
+ const SVN_ID = '$Id: $';
+
+ /**
+ * Reusable stream context resources for GET and POST operations
+ *
+ * @var resource
+ */
+ private $_getContext, $_headContext, $_postContext;
+
+ /**
+ * Initializes our reuseable get and post stream contexts
+ */
+ public function __construct()
+ {
+ $this->_getContext = stream_context_create();
+ $this->_headContext = stream_context_create();
+ $this->_postContext = stream_context_create();
+ }
+
+ public function performGetRequest($url, $timeout = false)
+ {
+ // set the timeout if specified
+ if ($timeout !== FALSE && $timeout > 0.0)
+ {
+ // timeouts with file_get_contents seem to need
+ // to be halved to work as expected
+ $timeout = (float) $timeout / 2;
+
+ stream_context_set_option($this->_getContext, 'http', 'timeout', $timeout);
+ }
+ else
+ {
+ // use the default timeout pulled from default_socket_timeout otherwise
+ stream_context_set_option($this->_getContext, 'http', 'timeout', $this->getDefaultTimeout());
+ }
+
+ // $http_response_headers will be updated by the call to file_get_contents later
+ // see http://us.php.net/manual/en/wrappers.http.php for documentation
+ // Unfortunately, it will still create a notice in analyzers if we don't set it here
+ $http_response_header = null;
+ $responseBody = @file_get_contents($url, false, $this->_getContext);
+
+ return $this->_getResponseFromParts($responseBody, $http_response_header);
+ }
+
+ public function performHeadRequest($url, $timeout = false)
+ {
+ stream_context_set_option($this->_headContext, array(
+ 'http' => array(
+ // set HTTP method
+ 'method' => 'HEAD',
+
+ // default timeout
+ 'timeout' => $this->getDefaultTimeout()
+ )
+ )
+ );
+
+ // set the timeout if specified
+ if ($timeout !== FALSE && $timeout > 0.0)
+ {
+ // timeouts with file_get_contents seem to need
+ // to be halved to work as expected
+ $timeout = (float) $timeout / 2;
+
+ stream_context_set_option($this->_headContext, 'http', 'timeout', $timeout);
+ }
+
+ // $http_response_headers will be updated by the call to file_get_contents later
+ // see http://us.php.net/manual/en/wrappers.http.php for documentation
+ // Unfortunately, it will still create a notice in analyzers if we don't set it here
+ $http_response_header = null;
+ $responseBody = @file_get_contents($url, false, $this->_headContext);
+
+ return $this->_getResponseFromParts($responseBody, $http_response_header);
+ }
+
+ public function performPostRequest($url, $rawPost, $contentType, $timeout = false)
+ {
+ stream_context_set_option($this->_postContext, array(
+ 'http' => array(
+ // set HTTP method
+ 'method' => 'POST',
+
+ // Add our posted content type
+ 'header' => "Content-Type: $contentType",
+
+ // the posted content
+ 'content' => $rawPost,
+
+ // default timeout
+ 'timeout' => $this->getDefaultTimeout()
+ )
+ )
+ );
+
+ // set the timeout if specified
+ if ($timeout !== FALSE && $timeout > 0.0)
+ {
+ // timeouts with file_get_contents seem to need
+ // to be halved to work as expected
+ $timeout = (float) $timeout / 2;
+
+ stream_context_set_option($this->_postContext, 'http', 'timeout', $timeout);
+ }
+
+ // $http_response_header will be updated by the call to file_get_contents later
+ // see http://us.php.net/manual/en/wrappers.http.php for documentation
+ // Unfortunately, it will still create a notice in analyzers if we don't set it here
+ $http_response_header = null;
+ $responseBody = @file_get_contents($url, false, $this->_postContext);
+
+ // reset content of post context to reclaim memory
+ stream_context_set_option($this->_postContext, 'http', 'content', '');
+
+ return $this->_getResponseFromParts($responseBody, $http_response_header);
+ }
+
+ private function _getResponseFromParts($rawResponse, $httpHeaders)
+ {
+ //Assume 0, false as defaults
+ $status = 0;
+ $contentType = false;
+
+ //iterate through headers for real status, type, and encoding
+ if (is_array($httpHeaders) && count($httpHeaders) > 0)
+ {
+ //look at the first headers for the HTTP status code
+ //and message (errors are usually returned this way)
+ //
+ //HTTP 100 Continue response can also be returned before
+ //the REAL status header, so we need look until we find
+ //the last header starting with HTTP
+ //
+ //the spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.1
+ //
+ //Thanks to Daniel Andersson for pointing out this oversight
+ while (isset($httpHeaders[0]) && substr($httpHeaders[0], 0, 4) == 'HTTP')
+ {
+ // we can do a intval on status line without the "HTTP/1.X " to get the code
+ $status = intval(substr($httpHeaders[0], 9));
+
+ // remove this from the headers so we can check for more
+ array_shift($httpHeaders);
+ }
+
+ //Look for the Content-Type response header and determine type
+ //and encoding from it (if possible - such as 'Content-Type: text/plain; charset=UTF-8')
+ foreach ($httpHeaders as $header)
+ {
+ // look for the header that starts appropriately
+ if (strncasecmp($header, 'Content-Type:', 13) == 0)
+ {
+ $contentType = substr($header, 13);
+ break;
+ }
+ }
+ }
+
+ return new Apache_Solr_HttpTransport_Response($status, $contentType, $rawResponse);
+ }
+} \ No newline at end of file
diff --git a/Apache/Solr/HttpTransport/Interface.php b/Apache/Solr/HttpTransport/Interface.php
new file mode 100755
index 0000000..090fc27
--- /dev/null
+++ b/Apache/Solr/HttpTransport/Interface.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Copyright (c) 2007-2011, Servigistics, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Servigistics, Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @copyright Copyright 2007-2011 Servigistics, Inc. (http://servigistics.com)
+ * @license http://solr-php-client.googlecode.com/svn/trunk/COPYING New BSD
+ * @version $Id: $
+ *
+ * @package Apache
+ * @subpackage Solr
+ * @author Timo Schmidt <timo.schmidt@aoemedia.de>, Donovan Jimenez <djimenez@conduit-it.com>
+ */
+
+// require Apache_Solr_HttpTransport_Response
+require_once(dirname(__FILE__) . '/Response.php');
+
+/**
+ * Interface that all Transport (HTTP Requester) implementations must implement. These
+ * Implementations can then be plugged into the Service instance in order to user their
+ * the desired method for making HTTP requests
+ */
+interface Apache_Solr_HttpTransport_Interface
+{
+ /**
+ * Get the current default timeout for all HTTP requests
+ *
+ * @return float
+ */
+ public function getDefaultTimeout();
+
+ /**
+ * Set the current default timeout for all HTTP requests
+ *
+ * @param float $timeout
+ */
+ public function setDefaultTimeout($timeout);
+
+ /**
+ * Perform a GET HTTP operation with an optional timeout and return the response
+ * contents, use getLastResponseHeaders to retrieve HTTP headers
+ *
+ * @param string $url
+ * @param float $timeout
+ * @return Apache_Solr_HttpTransport_Response HTTP response
+ */
+ public function performGetRequest($url, $timeout = false);
+
+ /**
+ * Perform a HEAD HTTP operation with an optional timeout and return the response
+ * headers - NOTE: head requests have no response body
+ *
+ * @param string $url
+ * @param float $timeout
+ * @return Apache_Solr_HttpTransport_Response HTTP response
+ */
+ public function performHeadRequest($url, $timeout = false);
+
+ /**
+ * Perform a POST HTTP operation with an optional timeout and return the response
+ * contents, use getLastResponseHeaders to retrieve HTTP headers
+ *
+ * @param string $url
+ * @param string $rawPost
+ * @param string $contentType
+ * @param float $timeout
+ * @return Apache_Solr_HttpTransport_Response HTTP response
+ */
+ public function performPostRequest($url, $rawPost, $contentType, $timeout = false);
+} \ No newline at end of file
diff --git a/Apache/Solr/HttpTransport/Response.php b/Apache/Solr/HttpTransport/Response.php
new file mode 100755
index 0000000..3f113ae
--- /dev/null
+++ b/Apache/Solr/HttpTransport/Response.php
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Copyright (c) 2007-2011, Servigistics, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of Servigistics, Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @copyright Copyright 2007-2011 Servigistics, Inc. (http://servigistics.com)
+ * @license http://solr-php-client.googlecode.com/svn/trunk/COPYING New BSD
+ * @version $Id: $
+ *
+ * @package Apache
+ * @subpackage Solr
+ * @author Donovan Jimenez <djimenez@conduit-it.com>
+ */
+
+/**
+ * Represents the required pieces of an HTTP response provided by HTTP transport
+ * implementations and then consumed by the Apache_Solr_Response class which provides
+ * decoding
+ */
+class Apache_Solr_HttpTransport_Response
+{
+ /**
+ * Status Messages indexed by Status Code
+ * Obtained from: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ *
+ * @var array
+ */
+ static private $_defaultStatusMessages = array(
+ // Specific to PHP Solr Client
+ 0 => "Communication Error",
+
+ // Informational 1XX
+ 100 => "Continue",
+ 101 => "Switching Protocols",
+
+ // Successful 2XX
+ 200 => "OK",
+ 201 => "Created",
+ 202 => "Accepted",
+ 203 => "Non-Authoritative Information",
+ 204 => "No Content",
+ 205 => "Reset Content",
+ 206 => "Partial Content",
+
+ // Redirection 3XX
+ 300 => "Multiple Choices",
+ 301 => "Moved Permanently",
+ 302 => "Found",
+ 303 => "See Other",
+ 304 => "Not Modified",
+ 305 => "Use Proxy",
+ 307 => "Temporary Redirect",
+
+ // Client Error 4XX
+ 400 => "Bad Request",
+ 401 => "Unauthorized",
+ 402 => "Payment Required",
+ 403 => "Forbidden",
+ 404 => "Not Found",
+ 405 => "Method Not Allowed",
+ 406 => "Not Acceptable",
+ 407 => "Proxy Authentication Required",
+ 408 => "Request Timeout",
+ 409 => "Conflict",
+ 410 => "Gone",
+ 411 => "Length Required",
+ 412 => "Precondition Failed",
+ 413 => "Request Entity Too Large",
+ 414 => "Request-URI Too Long",
+ 415 => "Unsupported Media Type",
+ 416 => "Request Range Not Satisfiable",
+ 417 => "Expectation Failed",
+
+ // Server Error 5XX
+ 500 => "Internal Server Error",
+ 501 => "Not Implemented",
+ 502 => "Bad Gateway",
+ 503 => "Service Unavailable",
+ 504 => "Gateway Timeout",
+ 505 => "HTTP Version Not Supported"
+ );
+
+ /**
+ * Get the HTTP status message based on status code
+ *
+ * @return string
+ */
+ public static function getDefaultStatusMessage($statusCode)
+ {
+ $statusCode = (int) $statusCode;
+
+ if (isset(self::$_defaultStatusMessages[$statusCode]))
+ {
+ return self::$_defaultStatusMessages[$statusCode];
+ }
+
+ return "Unknown Status";
+ }
+
+ /**
+ * The response's HTTP status code
+ *
+ * @var integer
+ */
+ private $_statusCode;
+
+ /**
+ * The response's HTTP status message
+ *
+ * @var string
+ */
+ private $_statusMessage;
+
+ /**
+ * The response's mime type
+ *
+ * @var string
+ */
+ private $_mimeType;
+
+ /**
+ * The response's character encoding
+ *
+ * @var string
+ */
+ private $_encoding;
+
+ /**
+ * The response's data
+ *
+ * @var string
+ */
+ private $_responseBody;
+
+ /**
+ * Construct a HTTP transport response
+ *
+ * @param integer $statusCode The HTTP status code
+ * @param string $contentType The VALUE of the Content-Type HTTP header
+ * @param string $responseBody The body of the HTTP response
+ */
+ public function __construct($statusCode, $contentType, $responseBody)
+ {
+ // set the status code, make sure its an integer
+ $this->_statusCode = (int) $statusCode;
+
+ // lookup up status message based on code
+ $this->_statusMessage = self::getDefaultStatusMessage($this->_statusCode);
+
+ // set the response body, it should always be a string
+ $this->_responseBody = (string) $responseBody;
+
+ // parse the content type header value for mimetype and encoding
+ // first set default values that will remain if we can't find
+ // what we're looking for in the content type
+ $this->_mimeType = "text/plain";
+ $this->_encoding = "UTF-8";
+
+ if ($contentType)
+ {
+ // now break apart the header to see if there's character encoding
+ $contentTypeParts = explode(';', $contentType, 2);
+
+ if (isset($contentTypeParts[0]))
+ {
+ $this->_mimeType = trim($contentTypeParts[0]);
+ }
+
+ if (isset($contentTypeParts[1]))
+ {
+ // we have a second part, split it further
+ $contentTypeParts = explode('=', $contentTypeParts[1]);
+
+ if (isset($contentTypeParts[1]))
+ {
+ $this->_encoding = trim($contentTypeParts[1]);
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the status code of the response
+ *
+ * @return integer
+ */
+ public function getStatusCode()
+ {
+ return $this->_statusCode;
+ }
+
+ /**
+ * Get the status message of the response
+ *
+ * @return string
+ */
+ public function getStatusMessage()
+ {
+ return $this->_statusMessage;
+ }
+
+ /**
+ * Get the mimetype of the response body
+ *
+ * @return string
+ */
+ public function getMimeType()
+ {
+ return $this->_mimeType;
+ }
+
+ /**
+ * Get the charset encoding of the response body.
+ *
+ * @return string
+ */
+ public function getEncoding()
+ {
+ return $this->_encoding;
+ }
+
+ /**
+ * Get the raw response body
+ *
+ * @return string
+ */
+ public function getBody()
+ {
+ return $this->_responseBody;
+ }
+}