Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

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