-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcurl.php
executable file
·125 lines (102 loc) · 4.08 KB
/
curl.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
class Curl {
// public $cookie_file = 'curl_cookie.txt';
public $headers = array();
public $options = array();
public $referer = '';
public $user_agent = '';
protected $error = '';
public function __construct() {
$this->user_agent = $_SERVER['HTTP_USER_AGENT'];
}
public function delete($url, $vars = array()) {
return $this->request('DELETE', $url, http_build_query($vars));
}
public function error() {
return $this->error;
}
public function get($url, $vars = array()) {
if (!empty($vars)) {
$url .= (stripos($url, '?') !== false) ? '&' : '?';
$url .= http_build_query($vars);
}
return $this->request('GET', $url);
}
public function post($url, $vars = array()) {
return $this->request('POST', $url, http_build_query($vars));
}
public function put($url, $vars = array()) {
return $this->request('PUT', $url, http_build_query($vars));
}
protected function request($method, $url, $vars = array()) {
$handle = curl_init();
# Set some default CURL options
// curl_setopt($handle, CURLOPT_COOKIEFILE, $this->cookie_file);
// curl_setopt($handle, CURLOPT_COOKIEJAR, $this->cookie_file);
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($handle, CURLOPT_HEADER, true);
curl_setopt($handle, CURLOPT_REFERER, $this->referer);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE);
# Format custom headers for this request and set CURL option
$headers = array();
foreach ($this->headers as $key => $value) {
$headers[] = $key.': '.$value;
}
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
# Determine the request method and set the correct CURL option
switch ($method) {
case 'GET':
curl_setopt($handle, CURLOPT_HTTPGET, true);
break;
case 'POST':
curl_setopt($handle, CURLOPT_POST, true);
break;
default:
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, $method);
}
// Need to set post fields after the request method
if (!empty($vars)) curl_setopt($handle, CURLOPT_POSTFIELDS, $vars);
# Set any custom CURL options
foreach ($this->options as $option => $value) {
curl_setopt($handle, constant('CURLOPT_'.str_replace('CURLOPT_', '', strtoupper($option))), $value);
}
$response = curl_exec($handle);
if ($response) {
$response = new CurlResponse($response);
} else {
$this->error = curl_errno($handle).' - '.curl_error($handle);
}
curl_close($handle);
return $response;
}
}
class CurlResponse {
public $body = '';
public $headers = array();
public function __construct($response) {
# Extract headers from response
$pattern = '#HTTP/\d\.\d.*?$.*?\r\n\r\n#ims';
preg_match_all($pattern, $response, $matches);
$headers = explode("\r\n", str_replace("\r\n\r\n", '', array_pop($matches[0])));
# Extract the version and status from the first header
$version_and_status = array_shift($headers);
preg_match('#HTTP/(\d\.\d)\s(\d\d\d)\s(.*)#', $version_and_status, $matches);
$this->headers['Http-Version'] = $matches[1];
$this->headers['Status-Code'] = $matches[2];
$this->headers['Status'] = $matches[2].' '.$matches[3];
# Convert headers into an associative array
foreach ($headers as $header) {
preg_match('#(.*?)\:\s(.*)#', $header, $matches);
$this->headers[$matches[1]] = $matches[2];
}
# Remove the headers from the response body
$this->body = preg_replace($pattern, '', $response);
}
public function __toString() {
return $this->body;
}
}
?>