xref: /plugin/authssocas/vendor/apereo/phpcas/source/CAS/Request/CurlRequest.php (revision d10b5556242e78d8a430c323b91984ec16415a46)
1*d10b5556SXylle<?php
2*d10b5556SXylle
3*d10b5556SXylle/**
4*d10b5556SXylle * Licensed to Jasig under one or more contributor license
5*d10b5556SXylle * agreements. See the NOTICE file distributed with this work for
6*d10b5556SXylle * additional information regarding copyright ownership.
7*d10b5556SXylle *
8*d10b5556SXylle * Jasig licenses this file to you under the Apache License,
9*d10b5556SXylle * Version 2.0 (the "License"); you may not use this file except in
10*d10b5556SXylle * compliance with the License. You may obtain a copy of the License at:
11*d10b5556SXylle *
12*d10b5556SXylle * http://www.apache.org/licenses/LICENSE-2.0
13*d10b5556SXylle *
14*d10b5556SXylle * Unless required by applicable law or agreed to in writing, software
15*d10b5556SXylle * distributed under the License is distributed on an "AS IS" BASIS,
16*d10b5556SXylle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17*d10b5556SXylle * See the License for the specific language governing permissions and
18*d10b5556SXylle * limitations under the License.
19*d10b5556SXylle *
20*d10b5556SXylle * PHP Version 7
21*d10b5556SXylle *
22*d10b5556SXylle * @file     CAS/Request/CurlRequest.php
23*d10b5556SXylle * @category Authentication
24*d10b5556SXylle * @package  PhpCAS
25*d10b5556SXylle * @author   Adam Franco <afranco@middlebury.edu>
26*d10b5556SXylle * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0
27*d10b5556SXylle * @link     https://wiki.jasig.org/display/CASC/phpCAS
28*d10b5556SXylle */
29*d10b5556SXylle
30*d10b5556SXylle/**
31*d10b5556SXylle * Provides support for performing web-requests via curl
32*d10b5556SXylle *
33*d10b5556SXylle * @class    CAS_Request_CurlRequest
34*d10b5556SXylle * @category Authentication
35*d10b5556SXylle * @package  PhpCAS
36*d10b5556SXylle * @author   Adam Franco <afranco@middlebury.edu>
37*d10b5556SXylle * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License 2.0
38*d10b5556SXylle * @link     https://wiki.jasig.org/display/CASC/phpCAS
39*d10b5556SXylle */
40*d10b5556SXylleclass CAS_Request_CurlRequest
41*d10b5556SXylleextends CAS_Request_AbstractRequest
42*d10b5556SXylleimplements CAS_Request_RequestInterface
43*d10b5556SXylle{
44*d10b5556SXylle
45*d10b5556SXylle    /**
46*d10b5556SXylle     * Set additional curl options
47*d10b5556SXylle     *
48*d10b5556SXylle     * @param array $options option to set
49*d10b5556SXylle     *
50*d10b5556SXylle     * @return void
51*d10b5556SXylle     */
52*d10b5556SXylle    public function setCurlOptions (array $options)
53*d10b5556SXylle    {
54*d10b5556SXylle        $this->_curlOptions = $options;
55*d10b5556SXylle    }
56*d10b5556SXylle    private $_curlOptions = array();
57*d10b5556SXylle
58*d10b5556SXylle    /**
59*d10b5556SXylle     * Send the request and store the results.
60*d10b5556SXylle     *
61*d10b5556SXylle     * @return bool true on success, false on failure.
62*d10b5556SXylle     */
63*d10b5556SXylle    protected function sendRequest ()
64*d10b5556SXylle    {
65*d10b5556SXylle        phpCAS::traceBegin();
66*d10b5556SXylle
67*d10b5556SXylle        /*********************************************************
68*d10b5556SXylle         * initialize the CURL session
69*d10b5556SXylle        *********************************************************/
70*d10b5556SXylle        $ch = $this->initAndConfigure();
71*d10b5556SXylle
72*d10b5556SXylle        /*********************************************************
73*d10b5556SXylle         * Perform the query
74*d10b5556SXylle        *********************************************************/
75*d10b5556SXylle        $buf = curl_exec($ch);
76*d10b5556SXylle        if ( $buf === false ) {
77*d10b5556SXylle            phpCAS::trace('curl_exec() failed');
78*d10b5556SXylle            $this->storeErrorMessage(
79*d10b5556SXylle                'CURL error #'.curl_errno($ch).': '.curl_error($ch)
80*d10b5556SXylle            );
81*d10b5556SXylle            $res = false;
82*d10b5556SXylle        } else {
83*d10b5556SXylle            $this->storeResponseBody($buf);
84*d10b5556SXylle            phpCAS::trace("Response Body: \n".$buf."\n");
85*d10b5556SXylle            $res = true;
86*d10b5556SXylle
87*d10b5556SXylle        }
88*d10b5556SXylle        // close the CURL session
89*d10b5556SXylle        curl_close($ch);
90*d10b5556SXylle
91*d10b5556SXylle        phpCAS::traceEnd($res);
92*d10b5556SXylle        return $res;
93*d10b5556SXylle    }
94*d10b5556SXylle
95*d10b5556SXylle    /**
96*d10b5556SXylle     * Internal method to initialize our cURL handle and configure the request.
97*d10b5556SXylle     * This method should NOT be used outside of the CurlRequest or the
98*d10b5556SXylle     * CurlMultiRequest.
99*d10b5556SXylle     *
100*d10b5556SXylle     * @return resource|false The cURL handle on success, false on failure
101*d10b5556SXylle     */
102*d10b5556SXylle    public function initAndConfigure()
103*d10b5556SXylle    {
104*d10b5556SXylle        /*********************************************************
105*d10b5556SXylle         * initialize the CURL session
106*d10b5556SXylle        *********************************************************/
107*d10b5556SXylle        $ch = curl_init($this->url);
108*d10b5556SXylle
109*d10b5556SXylle        curl_setopt_array($ch, $this->_curlOptions);
110*d10b5556SXylle
111*d10b5556SXylle        /*********************************************************
112*d10b5556SXylle         * Set SSL configuration
113*d10b5556SXylle        *********************************************************/
114*d10b5556SXylle        if ($this->caCertPath) {
115*d10b5556SXylle            if ($this->validateCN) {
116*d10b5556SXylle                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
117*d10b5556SXylle            } else {
118*d10b5556SXylle                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
119*d10b5556SXylle            }
120*d10b5556SXylle            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
121*d10b5556SXylle            curl_setopt($ch, CURLOPT_CAINFO, $this->caCertPath);
122*d10b5556SXylle            phpCAS::trace('CURL: Set CURLOPT_CAINFO ' . $this->caCertPath);
123*d10b5556SXylle        } else {
124*d10b5556SXylle            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
125*d10b5556SXylle            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
126*d10b5556SXylle        }
127*d10b5556SXylle
128*d10b5556SXylle        /*********************************************************
129*d10b5556SXylle         * Configure curl to capture our output.
130*d10b5556SXylle        *********************************************************/
131*d10b5556SXylle        // return the CURL output into a variable
132*d10b5556SXylle        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
133*d10b5556SXylle
134*d10b5556SXylle        // get the HTTP header with a callback
135*d10b5556SXylle        curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, '_curlReadHeaders'));
136*d10b5556SXylle
137*d10b5556SXylle        /*********************************************************
138*d10b5556SXylle         * Add cookie headers to our request.
139*d10b5556SXylle        *********************************************************/
140*d10b5556SXylle        if (count($this->cookies)) {
141*d10b5556SXylle            $cookieStrings = array();
142*d10b5556SXylle            foreach ($this->cookies as $name => $val) {
143*d10b5556SXylle                $cookieStrings[] = $name.'='.$val;
144*d10b5556SXylle            }
145*d10b5556SXylle            curl_setopt($ch, CURLOPT_COOKIE, implode(';', $cookieStrings));
146*d10b5556SXylle        }
147*d10b5556SXylle
148*d10b5556SXylle        /*********************************************************
149*d10b5556SXylle         * Add any additional headers
150*d10b5556SXylle        *********************************************************/
151*d10b5556SXylle        if (count($this->headers)) {
152*d10b5556SXylle            curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
153*d10b5556SXylle        }
154*d10b5556SXylle
155*d10b5556SXylle        /*********************************************************
156*d10b5556SXylle         * Flag and Body for POST requests
157*d10b5556SXylle        *********************************************************/
158*d10b5556SXylle        if ($this->isPost) {
159*d10b5556SXylle            curl_setopt($ch, CURLOPT_POST, 1);
160*d10b5556SXylle            curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postBody);
161*d10b5556SXylle        }
162*d10b5556SXylle
163*d10b5556SXylle        /*********************************************************
164*d10b5556SXylle         * Set User Agent
165*d10b5556SXylle         *********************************************************/
166*d10b5556SXylle        curl_setopt($ch, CURLOPT_USERAGENT, 'phpCAS/' . phpCAS::getVersion());
167*d10b5556SXylle
168*d10b5556SXylle        return $ch;
169*d10b5556SXylle    }
170*d10b5556SXylle
171*d10b5556SXylle    /**
172*d10b5556SXylle     * Store the response body.
173*d10b5556SXylle     * This method should NOT be used outside of the CurlRequest or the
174*d10b5556SXylle     * CurlMultiRequest.
175*d10b5556SXylle     *
176*d10b5556SXylle     * @param string $body body to stor
177*d10b5556SXylle     *
178*d10b5556SXylle     * @return void
179*d10b5556SXylle     */
180*d10b5556SXylle    public function _storeResponseBody ($body)
181*d10b5556SXylle    {
182*d10b5556SXylle        $this->storeResponseBody($body);
183*d10b5556SXylle    }
184*d10b5556SXylle
185*d10b5556SXylle    /**
186*d10b5556SXylle     * Internal method for capturing the headers from a curl request.
187*d10b5556SXylle     *
188*d10b5556SXylle     * @param resource $ch     handle of curl
189*d10b5556SXylle     * @param string $header header
190*d10b5556SXylle     *
191*d10b5556SXylle     * @return int
192*d10b5556SXylle     */
193*d10b5556SXylle    public function _curlReadHeaders ($ch, $header)
194*d10b5556SXylle    {
195*d10b5556SXylle        $this->storeResponseHeader($header);
196*d10b5556SXylle        return strlen($header);
197*d10b5556SXylle    }
198*d10b5556SXylle}
199