=400) { $protocol = $_SERVER["SERVER_PROTOCOL"]; if ( ('HTTP/1.1' != $protocol) && ('HTTP/1.0' != $protocol) ) $protocol = 'HTTP/1.0'; header( "$protocol $code $msg", true, $code ); } //todo improve echo $msg; exit; } function parse_request() { global $conf, $page; if ( $conf['question_mark_in_urls']==false and isset($_SERVER["PATH_INFO"]) and !empty($_SERVER["PATH_INFO"]) ) { $req = $_SERVER["PATH_INFO"]; $req = str_replace('//', '/', $req); $path_count = count( explode('/', $req) ); $page['root_path'] = PHPWG_ROOT_PATH.str_repeat('../', $path_count-1); } else { $req = $_SERVER["QUERY_STRING"]; /*foreach (array_keys($_GET) as $keynum => $key) { $req = $key; break; }*/ $page['root_path'] = PHPWG_ROOT_PATH; } $req = ltrim($req, '/'); !preg_match('#[^a-zA-Z0-9/_.-]#', $req) or ierror('Invalid chars in request', 400); $page['derivative_path'] = PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$req; $pos = strrpos($req, '.'); $pos!== false || ierror('Missing .', 400); $ext = substr($req, $pos); $req = substr($req, 0, $pos); $pos = strrpos($req, '-'); $pos!== false || ierror('Missing -', 400); $deriv = substr($req, $pos+1); $req = substr($req, 0, $pos); $deriv = explode('_', $deriv); foreach (ImageStdParams::get_defined_type_map() as $type => $params) { if (substr($type,0,2) == $deriv[0]) { $page['derivative_type'] = $type; $page['derivative_params'] = $params; break; } } if (!isset($page['derivative_type'])) { if (substr(IMG_CUSTOM,0,2) == $deriv[0]) { $page['derivative_type'] = IMG_CUSTOM; } else { ierror('Unknown parsing type', 400); } } array_shift($deriv); $page['coi'] = ''; if (count($deriv) && $deriv[0][0]=='c' && $deriv[0][1]=='i') { $page['coi'] = substr(array_shift($deriv), 2); preg_match('#^[a-z]{4}$#', $page['coi']) or ierror('Invalid center of interest', 400); } if ($page['derivative_type'] == IMG_CUSTOM) { try { $page['derivative_params'] = ImageParams::from_url_tokens($deriv); } catch (Exception $e) { ierror($e->getMessage(), 400); } } if ($req[0]!='g' && $req[0]!='u') $req = '../'.$req; $page['src_location'] = $req.$ext; $page['src_path'] = PHPWG_ROOT_PATH.$page['src_location']; $page['src_url'] = $page['root_path'].$page['src_location']; } $page=array(); include_once( dirname(__FILE__).'/include/derivative_params.inc.php'); include_once( dirname(__FILE__).'/include/derivative_std_params.inc.php'); ImageStdParams::load_from_file(); parse_request(); //var_export($page); $params = $page['derivative_params']; if ($params->sizing->ideal_size[0] < 20 or $params->sizing->ideal_size[1] < 20) { ierror('Invalid size', 400); } if ($params->sizing->max_crop < 0 or $params->sizing->max_crop > 1) { ierror('Invalid crop', 400); } $src_mtime = @filemtime($page['src_path']); if ($src_mtime === false) { ierror('Source not found', 404); } $need_generate = false; $derivative_mtime = @filemtime($page['derivative_path']); if ($derivative_mtime === false or $derivative_mtime < $src_mtime or $derivative_mtime < $params->last_mod_time) { $need_generate = true; } if (!$need_generate) { if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) and strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $derivative_mtime) {// send the last mod time of the file back header('Last-Modified: '.gmdate('D, d M Y H:i:s', $derivative_mtime).' GMT', true, 304); header('Expires: '.gmdate('D, d M Y H:i:s', time()+10*24*3600).' GMT', true, 304); exit; } // todo send pass-through } include_once(PHPWG_ROOT_PATH . 'admin/include/image.class.php'); $image = new pwg_image($page['src_path']); if (!mkgetdir(dirname($page['derivative_path']))) { ierror("dir create error", 500); } $changes = 0; // todo rotate // Crop & scale $params->sizing->compute( array($image->get_width(),$image->get_height()), $page['coi'], $crop_rect, $scale_width ); if ($crop_rect) { $changes++; $image->crop( $crop_rect->width(), $crop_rect->height(), $crop_rect->l, $crop_rect->t); } if ($scale_width) { $changes++; $image->resize( $scale_width[0], $scale_width[1] ); } // no change required - redirect to source if (!$changes) { header("X-i: No change"); ierror( $page['src_url'], 301); } $image->write( $page['derivative_path'] ); $image->destroy(); $fp = fopen($page['derivative_path'], 'rb'); $fstat = fstat($fp); header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fstat['mtime']).' GMT'); header('Expires: '.gmdate('D, d M Y H:i:s', time()+10*24*3600).' GMT'); header('Content-length: '.$fstat['size']); header('Connection: close'); // todo send the right headers header("Content-Type: image/jpeg"); fpassthru($fp); exit; ?>