blob: fe9bfe85754011ed22bbb33518608f2e5eeb26c0 [file] [log] [blame]
<?php
namespace apache\shindig\gadgets\servlet;
use apache\shindig\gadgets\GadgetFeatureRegistry;
use apache\shindig\common\HttpServlet;
use apache\shindig\common\Config;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* This event handler deals with the /js/core:caja:etc.js request which content type=url gadgets can use
* to retrieve our features javascript code, or used to make the most frequently used part of the feature
* library external, and hence cachable by the browser.
*/
class JsServlet extends HttpServlet {
public function doGet() {
$this->noHeaders = true;
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
header("HTTP/1.1 304 Not Modified");
header('Content-Length: 0');
ob_end_clean();
die();
}
$uri = strtolower($_SERVER["REQUEST_URI"]);
$uri = substr($uri, strrpos($uri, '/') + 1);
// remove any params that would confuse our parser
if (strpos($uri, '?')) {
$uri = substr($uri, 0, strpos($uri, '?'));
}
if (strpos($uri, '.js') !== false) {
$uri = substr($uri, 0, strlen($uri) - 3);
}
$needed = array();
if (strpos($uri, ':')) {
$needed = explode(':', $uri);
} else {
$needed[] = $uri;
}
$found = array();
$missing = array();
$contextClass = Config::get('gadget_context_class');
$context = new $contextClass('GADGET');
$registry = new GadgetFeatureRegistry(Config::get('features_path'));
if ($registry->resolveFeatures($needed, $found, $missing)) {
$isGadgetContext = !isset($_GET["c"]) || $_GET['c'] == 0 ? true : false;
$jsData = '';
foreach ($found as $feature) {
$jsData .= $registry->getFeatureContent($feature, $context, $isGadgetContext);
}
if (! strlen($jsData)) {
header("HTTP/1.0 404 Not Found", true);
die();
}
$this->setCachingHeaders();
header("Content-Type: text/javascript");
echo $jsData;
} else {
header("HTTP/1.0 404 Not Found", true);
}
die();
}
private function setCachingHeaders() {
// Expires far into the future
header("Expires: Tue, 01 Jan 2030 00:00:01 GMT");
// IE seems to need this (10 years should be enough).
header("Cache-Control: public,max-age=315360000");
// Firefox requires this for certain cases.
header("Last-Modified: " . gmdate('D, d M Y H:i:s', time()));
}
}