-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxy.php
137 lines (123 loc) · 5.21 KB
/
proxy.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
126
127
128
129
130
131
132
133
134
135
136
137
<?php
/***************************************************************************
* USAGE
* [1] http://<this-proxy-url>?<arcgis-service-url>
* [2] http://<this-proxy-url>?<arcgis-service-url> (with POST body)
* [3] http://<this-proxy-url>?<arcgis-service-url>?token=ABCDEFGH
*
* note: [3] is used when fetching tiles from a secured service and the
* JavaScript app sends the token instead of being set in this proxy
*
* REQUIREMENTS
* - cURL extension for PHP must be installed and loaded. To load it,
* add the following lines to your php.ini file:
* extension_dir = "<your-php-install-location>/ext"
* extension = php_curl.dll
*
* - Turn OFF magic quotes for incoming GET/POST data: add/modify the
* following line to your php.ini file:
* magic_quotes_gpc = Off
*
***************************************************************************/
/***************************************************************************
* <true> to only proxy to the sites listed in '$serverUrls'
* <false> to proxy to any site (are you sure you want to do this?)
*/
$mustMatch = true;
/***************************************************************************
* ArcGIS Server services this proxy will forward requests to
*
* 'url' = location of the ArcGIS Server, either specific URL or stem
* 'matchAll' = <true> to forward any request beginning with the URL
* <false> to forward only the request that exactly matches the url
* 'token' = token to include for secured service, if any, otherwise leave it
* empty
*/
$serverUrls = array(
array( 'url' => 'http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Earthquakes/EarthquakesFromLastSevenDays/FeatureServer/0', 'matchAll' => true, 'token' => ''),
array( 'url' => 'http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/', 'matchAll' => true, 'token' => '' ),
array( 'url' => 'http://sampleserver2.arcgisonline.com/ArcGIS/rest/services/', 'matchAll' => true, 'token' => '' ),
array( 'url' => 'http://sampleserver1a.arcgisonline.com/arcgisoutput/', 'matchAll' => true, 'token' => '' ),
array( 'url' => 'http://sampleserver1b.arcgisonline.com/arcgisoutput/', 'matchAll' => true, 'token' => '' ),
array( 'url' => 'http://sampleserver1c.arcgisonline.com/arcgisoutput/', 'matchAll' => true, 'token' => '' )
);
/***************************************************************************/
function is_url_allowed($allowedServers, $url) {
$isOk = false;
$url = trim($url, "\/");
for ($i = 0, $len = count($allowedServers); $i < $len; $i++) {
$value = $allowedServers[$i];
$allowedUrl = trim($value['url'], "\/");
if ($value['matchAll']) {
if (stripos($url, $allowedUrl) === 0) {
$isOk = $i; // array index that matched
break;
}
}
else {
if ((strcasecmp($url, $allowedUrl) == 0)) {
$isOk = $i; // array index that matched
break;
}
}
}
return $isOk;
}
// check if the curl extension is loaded
if (!extension_loaded("curl")) {
header('Status: 500', true, 500);
echo 'cURL extension for PHP is not loaded! <br/> Add the following lines to your php.ini file: <br/> extension_dir = "<your-php-install-location>/ext" <br/> extension = php_curl.dll';
return;
}
$targetUrl = $_SERVER['QUERY_STRING'];
if (!$targetUrl) {
header('Status: 400', true, 400); // Bad Request
echo 'Target URL is not specified! <br/> Usage: <br/> http://<this-proxy-url>?<target-url>';
return;
}
$parts = preg_split("/\?/", $targetUrl);
$targetPath = $parts[0];
// check if the request URL matches any of the allowed URLs
if ($mustMatch) {
$pos = is_url_allowed($serverUrls, $targetPath);
if ($pos === false) {
header('Status: 403', true, 403); // Forbidden
echo 'Target URL is not allowed! <br/> Consult the documentation for this proxy to add the target URL to its Whitelist.';
return;
}
}
// add token (if any) to the url
$token = $serverUrls[$pos]['token'];
if ($token) {
$targetUrl .= (stripos($targetUrl, "?") !== false ? '&' : '?').'token='.$token;
}
// open the curl session
$session = curl_init();
// set the appropriate options for this request
$options = array(
CURLOPT_URL => $targetUrl,
CURLOPT_HEADER => false,
CURLOPT_HTTPHEADER => array(
'Content-Type: ' . $_SERVER['CONTENT_TYPE'],
'Referer: ' . $_SERVER['HTTP_REFERER']
),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true
);
// put the POST data in the request body
$postData = file_get_contents("php://input");
if (strlen($postData) > 0) {
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = $postData;
}
curl_setopt_array($session, $options);
// make the call
$response = curl_exec($session);
$code = curl_getinfo($session, CURLINFO_HTTP_CODE);
$type = curl_getinfo($session, CURLINFO_CONTENT_TYPE);
curl_close($session);
// set the proper Content-Type
header("Status: ".$code, true, $code);
header("Content-Type: ".$type);
echo $response;
?>