aboutsummaryrefslogtreecommitdiff
path: root/gmap_arcgis.module
diff options
context:
space:
mode:
Diffstat (limited to 'gmap_arcgis.module')
-rw-r--r--gmap_arcgis.module68
1 files changed, 68 insertions, 0 deletions
diff --git a/gmap_arcgis.module b/gmap_arcgis.module
index 76b667e..3387dd7 100644
--- a/gmap_arcgis.module
+++ b/gmap_arcgis.module
@@ -242,3 +242,71 @@ function gmap_arcgis_link_nota_tecnica() {
return l(t('Sources'), 'quem-somos', array('fragment' => 'tabset-tab-3', 'external' => TRUE));
}
+
+/**
+ * Implementation of hook_menu().
+ */
+function gmap_arcgis_menu() {
+ $items['gmap_arcgis/mapserver'] = array(
+ 'title' => 'MapServer Proxy',
+ 'description' => 'Caches requests to a MapServer',
+ 'page callback' => 'gmap_arcgis_mapserver',
+ 'access arguments' => array('access content'),
+ 'type' => MENU_CALLBACK,
+ );
+
+ return $items;
+}
+
+/**
+ * Menu callback.
+ *
+ * Caches dynamic ArcGIS requests by ignoring the timestamp pattern.
+ */
+function gmap_arcgis_mapserver() {
+ header('Content-Type: text/plain;charset=utf-8');
+
+ // The ArcGIS server URL.
+ $base = 'http://gis2.socioambiental.org:8399/arcgis/rest/services/';
+
+ // The dynamic pattern we want to exclude.
+ $pattern = '/_[0-9]*._callback/';
+
+ $dynamic = FALSE;
+ $request = $_SERVER['argv'][0];
+ $query = str_replace('q=gmap_arcgis/mapserver/', '', $request);
+ $query = preg_replace('/&/', '?', $query, 1);
+ $dest = $base . $query;
+ $process = curl_init($dest);
+
+ if (preg_match($pattern, $dest, $timestamp) == 1) {
+ $dynamic = TRUE;
+ $key = sha1(preg_replace($pattern, '', $dest));
+ }
+ else {
+ $key = sha1($dest);
+ }
+
+ $data = cache_get($key, 'cache_page');
+
+ if ($data == 0) {
+ curl_setopt($process, CURLOPT_TIMEOUT, 30);
+ curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
+
+ $return = curl_exec($process);
+ curl_close($process);
+
+ cache_set($key, $return, 'cache_page', CACHE_TEMPORARY);
+ }
+ else {
+ $return = $dynamic == TRUE ? preg_replace($pattern, $timestamp[0], $data->data) : $data->data;
+
+ // Cache expiration.
+ if ($data->created < time() - 1800) {
+ cache_clear_all($key, 'cache_page');
+ }
+ }
+
+ echo $return;
+ exit;
+}