Mercurial > hg > ywww
comparison xml/doAmazonRequest.php @ 44:38d209611508
change includes to assume (contra previos ASSUMES) that we have .user.ini which adds /var/test to include_path
| author | Charlie Root |
|---|---|
| date | Sun, 06 Jan 2019 07:17:03 -0500 |
| parents | xml/doAmazonRequest.inc@dbc006408d2b |
| children | a67bf725e87b |
comparison
equal
deleted
inserted
replaced
| 43:dbc006408d2b | 44:38d209611508 |
|---|---|
| 1 <?php | |
| 2 include_once "ywww/dlog.php"; | |
| 3 | |
| 4 include_once "private/web.php"; | |
| 5 include "aws_signed_request.php"; | |
| 6 | |
| 7 function doAmazonRequest($ext, $parameters, $try, $dbl='x', $wantXML=True) | |
| 8 { | |
| 9 global $public_key, $private_key; | |
| 10 $requestURI = $_SERVER['REQUEST_URI']; | |
| 11 $requestIP = $_SERVER['REMOTE_ADDR']; | |
| 12 $file_data=$ext; | |
| 13 ksort($parameters); | |
| 14 foreach ($parameters as $i=>$d) { | |
| 15 $file_data.='&'.$i.'='.$d; | |
| 16 } | |
| 17 $gotit=0; | |
| 18 $url=aws_signed_request($ext,$parameters,$public_key,$private_key); | |
| 19 //dl("search: $ext $public_key $private_key\n$url\n".print_r($parameters,TRUE)."\n"); | |
| 20 for ($i=1; $i<=$try; $i++) { | |
| 21 $crl = curl_init(); | |
| 22 $timeout = 5; | |
| 23 curl_setopt ($crl, CURLOPT_URL,$url); | |
| 24 curl_setopt ($crl, CURLOPT_ENCODING , "gzip"); | |
| 25 curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1); | |
| 26 curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout); | |
| 27 $semaphore = new SyncSemaphore("Amazon"); | |
| 28 $gotit = $semaphore->lock(1000); | |
| 29 if (!$gotit) { | |
| 30 dl("Got it: ".(int)$gotit." $requestIP $dbl\n"); | |
| 31 $gotit=$semaphore->lock(1000); | |
| 32 dl("Got it: ".(int)$gotit." $requestIP $dbl"."a\n"); | |
| 33 } | |
| 34 $output = curl_exec($crl); | |
| 35 //dl("nai2: ".strlen($output)."\n"); | |
| 36 | |
| 37 curl_close($crl); | |
| 38 usleep(500000); | |
| 39 if ($gotit) { | |
| 40 $semaphore->unlock(); | |
| 41 } | |
| 42 else { | |
| 43 dl("W/o lock for $requestIP $dbl"."b\n"); | |
| 44 } | |
| 45 $mm=array(); | |
| 46 $xml = new SimpleXMLElement($output); | |
| 47 if (preg_match("/<Error>/",$output,$mm)) { | |
| 48 $resName=$xml->getName(); | |
| 49 $code=$xml->Error->Code; | |
| 50 if ($code) { | |
| 51 $message=$xml->Error->Message; | |
| 52 } | |
| 53 else { | |
| 54 $code=$xml->Items->Request->Errors->Error->Code; | |
| 55 $message=$xml->Items->Request->Errors->Error->Message; | |
| 56 } | |
| 57 dl("Losing $i: $dbl ". | |
| 58 $mm[0].", $resName, $code, $requestIP, $requestURI\n"); | |
| 59 if ($code!='RequestThrottled') { | |
| 60 dl("message: $message\n"); | |
| 61 if ($code=='AWS.InvalidParameterValue' && strpos($message,"for ItemId.")>0) { | |
| 62 // Check for common problem and try to fix... | |
| 63 $spd=$parameters['ItemId']; | |
| 64 if (strpos($spd,'/')>0) { | |
| 65 $isbnMaybe=substr($spd,0,strpos($spd,'/')); | |
| 66 $parameters['ItemId']=$isbnMaybe; | |
| 67 if (isset($parameters['Keywords'])) { | |
| 68 $parameters['Keywords']=urlencode($isbnMaybe); | |
| 69 } | |
| 70 dl("retrying with $isbnMaybe\n"); | |
| 71 return doAmazonRequest($ext,$parameters,$try,$dbl); | |
| 72 } | |
| 73 } | |
| 74 if ($code=="") { | |
| 75 dl("error elt:\n$output\n"); | |
| 76 } | |
| 77 throw new Exception($code); | |
| 78 } | |
| 79 } | |
| 80 else { | |
| 81 if ($wantXML) { | |
| 82 return $xml; | |
| 83 } | |
| 84 else { | |
| 85 //dl("returning ".strlen($output)."\n"); | |
| 86 return $output; | |
| 87 } | |
| 88 } | |
| 89 usleep(100000*$i); // Try to reduce throttling until we get a | |
| 90 // principled solution in place | |
| 91 } | |
| 92 throw new Exception("ThrottledRepeatedly"); | |
| 93 } | |
| 94 ?> |
