You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.5 KiB
155 lines
5.5 KiB
<?php
|
|
/*********************************************************************
|
|
class.http.php
|
|
|
|
Http helper.
|
|
|
|
Peter Rotich <peter@osticket.com>
|
|
Copyright (c) 2006-2013 osTicket
|
|
http://www.osticket.com
|
|
|
|
Released under the GNU General Public License WITHOUT ANY WARRANTY.
|
|
See LICENSE.TXT for details.
|
|
|
|
vim: expandtab sw=4 ts=4 sts=4:
|
|
**********************************************************************/
|
|
class Http {
|
|
|
|
function header_code_verbose($code) {
|
|
switch($code):
|
|
case 200: return '200 OK';
|
|
case 201: return '201 Created';
|
|
case 204: return '204 No Content';
|
|
case 205: return '205 Reset Content';
|
|
case 400: return '400 Bad Request';
|
|
case 401: return '401 Unauthorized';
|
|
case 403: return '403 Forbidden';
|
|
case 404: return '404 Not Found';
|
|
case 405: return '405 Method Not Allowed';
|
|
case 416: return '416 Requested Range Not Satisfiable';
|
|
case 418: return "418 I'm a teapot";
|
|
case 422: return '422 Unprocessable Entity';
|
|
default: return '500 Internal Server Error';
|
|
endswitch;
|
|
}
|
|
|
|
function response($code,$content=false,$contentType='text/html',$charset='UTF-8') {
|
|
|
|
header('HTTP/1.1 '.Http::header_code_verbose($code));
|
|
header('Status: '.Http::header_code_verbose($code)."\r\n");
|
|
header("Connection: Close\r\n");
|
|
$ct = "Content-Type: $contentType";
|
|
if ($charset)
|
|
$ct .= "; charset=$charset";
|
|
header($ct);
|
|
if (is_string($content)) {
|
|
header('Content-Length: '.strlen($content)."\r\n\r\n");
|
|
print $content;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Flush the content to requester without exiting
|
|
*
|
|
*/
|
|
function flush($code, $content, $contentType='text/html', $charset='UTF-8') {
|
|
self::response($code, null, $contentType, $charset);
|
|
header('Cache-Control: no-cache, must-revalidate');
|
|
header('Content-Length: '.strlen($content)."\r\n\r\n");
|
|
print $content;
|
|
// Flush the request buffer
|
|
while(@ob_end_flush());
|
|
flush();
|
|
// Terminate the request
|
|
if (function_exists('fastcgi_finish_request'))
|
|
fastcgi_finish_request();
|
|
}
|
|
|
|
function redirect($url,$delay=0,$msg='') {
|
|
|
|
$iis = strpos($_SERVER['SERVER_SOFTWARE'], 'IIS') !== false;
|
|
@list($name, $version) = explode('/', $_SERVER['SERVER_SOFTWARE']);
|
|
// Legacy code for older versions of IIS that would not emit the
|
|
// correct HTTP status and headers when using the `Location`
|
|
// header alone
|
|
if ($iis && version_compare($version, '7.0', '<')) {
|
|
header("Refresh: $delay; URL=$url");
|
|
}else{
|
|
header("Location: $url");
|
|
}
|
|
print('<html></html>');
|
|
flush();
|
|
ob_flush();
|
|
exit;
|
|
}
|
|
|
|
function cacheable($etag, $modified=false, $ttl=3600) {
|
|
// Thanks, http://stackoverflow.com/a/1583753/1025836
|
|
// Timezone doesn't matter here — but the time needs to be
|
|
// consistent round trip to the browser and back.
|
|
if ($modified) {
|
|
$last_modified = strtotime($modified." GMT");
|
|
header("Last-Modified: ".date('D, d M Y H:i:s', $last_modified)." GMT", false);
|
|
}
|
|
header('ETag: "'.$etag.'"');
|
|
header("Cache-Control: private, max-age=$ttl");
|
|
header('Expires: ' . gmdate('D, d M Y H:i:s', Misc::gmtime() + $ttl)." GMT");
|
|
header('Pragma: private');
|
|
if (($modified && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified)
|
|
|| @trim($_SERVER['HTTP_IF_NONE_MATCH'], '" ') == $etag) {
|
|
header("HTTP/1.1 304 Not Modified");
|
|
exit();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates the filename=... part of the Content-Disposition header. This
|
|
* is browser dependent, so the user agent is inspected to determine the
|
|
* best encoding format for the filename
|
|
*/
|
|
function getDispositionFilename($filename) {
|
|
$user_agent = strtolower ($_SERVER['HTTP_USER_AGENT']);
|
|
if (false !== strpos($user_agent,'msie')
|
|
&& false !== strpos($user_agent,'win'))
|
|
return 'filename='.rawurlencode($filename);
|
|
elseif (false !== strpos($user_agent, 'safari')
|
|
&& false === strpos($user_agent, 'chrome'))
|
|
// Safari and Safari only can handle the filename as is
|
|
return 'filename='.str_replace(',', '', $filename);
|
|
else
|
|
// Use RFC5987
|
|
return "filename*=UTF-8''".rawurlencode($filename);
|
|
}
|
|
|
|
function download($filename, $type, $data=null, $disposition='attachment') {
|
|
if (strpos($type, 'image/') !== false && preg_match('/image\/.*\+.*/', $type))
|
|
$disposition='attachment';
|
|
|
|
header('Pragma: private');
|
|
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
|
header('Cache-Control: private', false);
|
|
header('Content-Type: '.$type);
|
|
header(sprintf('Content-Disposition: %s; %s',
|
|
$disposition,
|
|
self::getDispositionFilename(basename($filename))));
|
|
header('Content-Transfer-Encoding: binary');
|
|
if ($data !== null) {
|
|
header('Content-Length: '.strlen($data));
|
|
print $data;
|
|
exit;
|
|
}
|
|
}
|
|
|
|
static function build_query($vars, $encode=true, $separator='&') {
|
|
|
|
if (!$vars)
|
|
return '';
|
|
|
|
if ($encode)
|
|
$vars = Format::htmlchars($vars);
|
|
|
|
return http_build_query($vars, '', $separator);
|
|
}
|
|
}
|
|
?>
|