https://cactus // 09 Nov 2015 -- bug fix for www.pdb --> www.rcsb // 23 Mar 2015 -- checking for missing :// in queries // 2 Feb 2014 -- stripped of any exec calls and image options-- this was for JSmol image option - abandoned // 30 Oct 2013 -- saveFile should not convert " to _ // 30 Sep 2013 -- adjusted error handling to only report E_ERROR not E_WARNING // 7 Sep 2013 -- adding PHP error handling // //////// note to administrators: // // from http://us3.php.net/file_get_contents: // // A URL can be used as a filename with this function if the fopen wrappers // have been enabled. See fopen() for more details on how to specify the // filename. See the Supported Protocols and Wrappers for links to information // about what abilities the various wrappers have, notes on their usage, and // information on any predefined variables they may provide. /////// // // Server-side Jmol delivers: // simple relay for cross-domain files // // options: // // call // "saveFile" // returns posted data in "data=" with mime type "mimetype=" to file name "filename=" // "getInfoFromDatabase" // returns XML data // requires database="=" (RCSB REST service) // "getRawDataFromDatabase" // "_" // just use $query // (anything else) // use $database.$query // // encoding // "" no encoding (default) // "base64" BASE64-encoded binary files for Chrome synchronous AJAX // prepends ";base64," to encoded output // // simple server tests: // // http://foo.wherever/jsmol.php?call=getRawDataFromDatabase&database=_&query=http://chemapps.stolaf.edu/jmol/data/t.pdb.gz // http://goo.wherever/jsmol.php?call=getRawDataFromDatabase&database=_&query=http://chemapps.stolaf.edu/jmol/data/t.pdb.gz&encoding=base64 $myerror = ""; function handleError($severity, $msg, $filename, $linenum) { global $myerror; switch($severity) { case E_ERROR: $myerror = "PHP error:$severity $msg $filename $linenum"; break; } return true; } set_error_handler("handleError"); function getValueSimple($json, $key, $default) { if ($json == "") { $val = $_REQUEST[$key]; } else { // just do a crude check for "key"..."value" -- nothing more than that; // only for very simple key/value pairs; mostly because we don't have the JSON // module set up for our server. list($junk,$info) = explode('"'.$key.'"', $json, 2); list($junk,$val) = explode('"', $info, 3); if ($val == "") { $val = str_replace('"','_',$_REQUEST[$key]); } } if ($val == "") { $val = $default; } return $val; } if ($_GET['isform']=="true") { $values = ""; } else { $values= file_get_contents("php://input"); } $encoding = getValueSimple($values, "encoding", ""); $call = getValueSimple($values, "call", "getRawDataFromDatabase"); $query = getValueSimple($values, "query", "https://cactus.nci.nih.gov/chemical/structure/ethanol/file?format=sdf&get3d=True"); $database = getValueSimple($values, "database", "_"); $test = getValueSimple($values,"test",""); $imagedata = ""; $contentType = ""; $output = ""; $isBinary = false; $filename = ""; if ($call == "getInfoFromDatabase") { // TODO: add PDBe annotation business here if ($database == '=') { $restQueryUrl = "http://www.rcsb.org/pdb/rest/search"; $restReportUrl = "http://www.rcsb.org/pdb/rest/customReport"; $xml = "org.pdb.query.simple.AdvancedKeywordQueryText Search$query"; $context = stream_context_create(array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $xml)) ); $output = file_get_contents($restQueryUrl, false, $context); $n = strlen($output)/5; if ($n == 0) { $output = "ERROR: \"$query\" not found"; } else { if (strlen($query) == 4 && $n != 1) { $QQQQ = strtoupper($query); if (strpos("123456789", substr($QQQQ, 0, 1)) == 0 && strpos($output, $QQQQ) > 0) { $output = "$QQQQ\n".$output.str_replace("$QQQQ\n", "",$output); } } if ($n > 50) { $output = substr($output, 0, 250); } $output = str_replace("\n",",",$output); //http://www.rcsb.org/pdb/rest/customReport?pdbids=1crn,1d66,1blu,&customReportColumns=structureId,structureTitle $output = $restReportUrl."?pdbids=".$output."&customReportColumns=structureId,structureTitle"; $output = "".file_get_contents($output).""; } } else { $myerror = "jsmol.php cannot use $call with $database"; } } else if ($call == "getRawDataFromDatabase") { $isBinary = (strpos($query, ".gz") >= 0); if ($database != "_") $query = $database.$query; if (strpos(strtolower($query), 'https://') !== 0 && strpos(strtolower($query), 'http://') !== 0) { $output = "invalid url"; } else if (strpos($query, '?POST?') > 0) { list($query,$data) = explode('?POST?', $query, 2); $context = stream_context_create(array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $data)) ); $output = file_get_contents($query, false, $context); } else { $output = file_get_contents($query); if ($test != "") { $output = $query."
".$output; } } } else if ($call == "saveFile") { $imagedata = $_REQUEST["data"];//getValueSimple($values, "data", ""); don't want to convert " to _ here $filename = getValueSimple($values, "filename", ""); $contentType = getValueSimple($values, "mimetype", "application/octet-stream"); if ($encoding == "base64") { $imagedata = base64_decode($imagedata); $encoding = ""; } } else { $myerror = "jsmol.php unrecognized call: $call"; } ob_start(); if ($myerror != "") { $output = $myerror; } else { if ($imagedata != "") { $output = $imagedata; header('Content-Type: '.$contentType); if ($filename != "") { header('Content-Description: File Transfer'); header("Content-Disposition: attachment; filename=\"$filename\""); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); } } else { header('Access-Control-Allow-Origin: *'); if ($isBinary) { header('Content-Type: text/plain; charset=x-user-defined'); } else if (strpos($output, ' 0) { header('Content-type: text/html; charset=utf-8'); } else { header('Content-Type: application/json'); } } if ($encoding == "base64") { $output = ";base64,".base64_encode($output); } } header('Last-Modified: '.date('r')); header('Accept-Ranges: bytes'); header('Content-Length: '.strlen($output)); echo($output); ob_end_flush(); ?>