201 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | /** | ||
|  |  * Licensed to Jasig under one or more contributor license | ||
|  |  * agreements. See the NOTICE file distributed with this work for | ||
|  |  * additional information regarding copyright ownership. | ||
|  |  * | ||
|  |  * Jasig licenses this file to you under the Apache License, | ||
|  |  * Version 2.0 (the "License"); you may not use this file except in | ||
|  |  * compliance with the License. You may obtain a copy of the License at: | ||
|  |  * | ||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||
|  |  * | ||
|  |  * Unless required by applicable law or agreed to in writing, software | ||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
|  |  * See the License for the specific language governing permissions and | ||
|  |  * limitations under the License. | ||
|  |  * | ||
|  |  * PHP Version 5 | ||
|  |  * | ||
|  |  * @file     CAS/Request/CurlRequest.php | ||
|  |  * @category Authentication | ||
|  |  * @package  PhpCAS | ||
|  |  * @author   Adam Franco <afranco@middlebury.edu> | ||
|  |  * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0 | ||
|  |  * @link     https://wiki.jasig.org/display/CASC/phpCAS | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * Provides support for performing web-requests via curl | ||
|  |  * | ||
|  |  * @class    CAS_Request_CurlRequest | ||
|  |  * @category Authentication | ||
|  |  * @package  PhpCAS | ||
|  |  * @author   Adam Franco <afranco@middlebury.edu> | ||
|  |  * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0 | ||
|  |  * @link     https://wiki.jasig.org/display/CASC/phpCAS | ||
|  |  */ | ||
|  | class CAS_Request_CurlRequest | ||
|  | extends CAS_Request_AbstractRequest | ||
|  | implements CAS_Request_RequestInterface | ||
|  | { | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Set additional curl options | ||
|  |      * | ||
|  |      * @param array $options option to set | ||
|  |      * | ||
|  |      * @return void | ||
|  |      */ | ||
|  |     public function setCurlOptions (array $options) | ||
|  |     { | ||
|  |         $this->_curlOptions = $options; | ||
|  |     } | ||
|  |     private $_curlOptions = array(); | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Send the request and store the results. | ||
|  |      * | ||
|  |      * @return bool true on success, false on failure. | ||
|  |      */ | ||
|  |     protected function sendRequest () | ||
|  |     { | ||
|  |         phpCAS::traceBegin(); | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * initialize the CURL session | ||
|  |         *********************************************************/ | ||
|  |         $ch = $this->initAndConfigure(); | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * Perform the query | ||
|  |         *********************************************************/ | ||
|  |         $buf = curl_exec($ch); | ||
|  |         if ( $buf === false ) { | ||
|  |             phpCAS::trace('curl_exec() failed'); | ||
|  |             $this->storeErrorMessage( | ||
|  |                 'CURL error #'.curl_errno($ch).': '.curl_error($ch) | ||
|  |             ); | ||
|  |             $res = false; | ||
|  |         } else { | ||
|  |             $this->storeResponseBody($buf); | ||
|  |             phpCAS::trace("Response Body: \n".$buf."\n"); | ||
|  |             $res = true; | ||
|  | 
 | ||
|  |         } | ||
|  |         // close the CURL session
 | ||
|  |         curl_close($ch); | ||
|  | 
 | ||
|  |         phpCAS::traceEnd($res); | ||
|  |         return $res; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Internal method to initialize our cURL handle and configure the request. | ||
|  |      * This method should NOT be used outside of the CurlRequest or the | ||
|  |      * CurlMultiRequest. | ||
|  |      * | ||
|  |      * @return resource|false The cURL handle on success, false on failure | ||
|  |      */ | ||
|  |     public function initAndConfigure() | ||
|  |     { | ||
|  |         /********************************************************* | ||
|  |          * initialize the CURL session | ||
|  |         *********************************************************/ | ||
|  |         $ch = curl_init($this->url); | ||
|  | 
 | ||
|  |         if (version_compare(PHP_VERSION, '5.1.3', '>=')) { | ||
|  |             //only avaible in php5
 | ||
|  |             curl_setopt_array($ch, $this->_curlOptions); | ||
|  |         } else { | ||
|  |             foreach ($this->_curlOptions as $key => $value) { | ||
|  |                 curl_setopt($ch, $key, $value); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * Set SSL configuration | ||
|  |         *********************************************************/ | ||
|  |         if ($this->caCertPath) { | ||
|  |             if ($this->validateCN) { | ||
|  |                 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); | ||
|  |             } else { | ||
|  |                 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | ||
|  |             } | ||
|  |             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); | ||
|  |             curl_setopt($ch, CURLOPT_CAINFO, $this->caCertPath); | ||
|  |             phpCAS::trace('CURL: Set CURLOPT_CAINFO ' . $this->caCertPath); | ||
|  |         } else { | ||
|  |             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); | ||
|  |             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); | ||
|  |         } | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * Configure curl to capture our output. | ||
|  |         *********************************************************/ | ||
|  |         // return the CURL output into a variable
 | ||
|  |         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||
|  | 
 | ||
|  |         // get the HTTP header with a callback
 | ||
|  |         curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, '_curlReadHeaders')); | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * Add cookie headers to our request. | ||
|  |         *********************************************************/ | ||
|  |         if (count($this->cookies)) { | ||
|  |             $cookieStrings = array(); | ||
|  |             foreach ($this->cookies as $name => $val) { | ||
|  |                 $cookieStrings[] = $name.'='.$val; | ||
|  |             } | ||
|  |             curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookieStrings)); | ||
|  |         } | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * Add any additional headers | ||
|  |         *********************************************************/ | ||
|  |         if (count($this->headers)) { | ||
|  |             curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers); | ||
|  |         } | ||
|  | 
 | ||
|  |         /********************************************************* | ||
|  |          * Flag and Body for POST requests | ||
|  |         *********************************************************/ | ||
|  |         if ($this->isPost) { | ||
|  |             curl_setopt($ch, CURLOPT_POST, 1); | ||
|  |             curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postBody); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $ch; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Store the response body. | ||
|  |      * This method should NOT be used outside of the CurlRequest or the | ||
|  |      * CurlMultiRequest. | ||
|  |      * | ||
|  |      * @param string $body body to stor | ||
|  |      * | ||
|  |      * @return void | ||
|  |      */ | ||
|  |     private function _storeResponseBody ($body) | ||
|  |     { | ||
|  |         $this->storeResponseBody($body); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Internal method for capturing the headers from a curl request. | ||
|  |      * | ||
|  |      * @param resource $ch     handle of curl | ||
|  |      * @param string $header header | ||
|  |      * | ||
|  |      * @return int | ||
|  |      */ | ||
|  |     private function _curlReadHeaders ($ch, $header) | ||
|  |     { | ||
|  |         $this->storeResponseHeader($header); | ||
|  |         return strlen($header); | ||
|  |     } | ||
|  | } |