changeset 43:dbc006408d2b

ASSUMES we have SetEnv PHP_VALUE "include_path =.:/var/test/private:/var/test/ywww:/usr/share/php" in apache2/.../test.conf use dl(...) for debug logging, defined in dlog.php use doAmazonRequest in amazonBookSearch use ../private/web.php (q.v., not in mercurial) for Aserver and Aassociates Started by updating from 40:c24ae74bf6d5, i.e. just before the bug on the main line
author Charlie Root
date Sat, 05 Jan 2019 18:00:10 -0500
parents 3f400072bf14
children 38d209611508
files dlog.php index.php php/read/aws_signed_request.php php/read/getBookDetails.php us/index.php xml/amazonBookSearch.php xml/doAmazonRequest.inc xml/getAmazonInfo.php
diffstat 8 files changed, 657 insertions(+), 814 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dlog.php	Sat Jan 05 18:00:10 2019 -0500
@@ -0,0 +1,12 @@
+<?php
+if (isset($_SERVER['DOCUMENT_ROOT'])) {
+  $logfile=$_SERVER['DOCUMENT_ROOT']."/debug/debug.log";
+}
+ else {
+   $logfile="/tmp/php_debug.log";
+ }
+
+function dl($s) {
+  global $logfile;
+  file_put_contents($logfile,$s,FILE_APPEND);
+}
\ No newline at end of file
--- a/index.php	Sat Jan 05 06:21:12 2019 -0500
+++ b/index.php	Sat Jan 05 18:00:10 2019 -0500
@@ -1,4 +1,5 @@
 <?php
+include_once "dlog.php";
 
 if (isset($_SERVER["GEOIP_COUNTRY_CODE"])) {
 $country_code = $_SERVER["GEOIP_COUNTRY_CODE"];
@@ -7,34 +8,33 @@
 $country_code = $_SERVER["REDIRECT_GEOIP_COUNTRY_CODE"];
  }
  else {$country_code = "US" ; }
-file_put_contents('/var/ywww/debug/phpDebug',
-		  "cc: $country_code\n",
-		  FILE_APPEND);
+
+dl("cc: $country_code\n");
    
 switch($country_code) {
  case "CA":
    Header( "HTTP/1.1 301 Moved Permanently" );
-   Header ("Location: http://www.yournextread.com/ca/" );
+   Header ("Location: http://test.markup.co.uk/ywww/ca/" );
    break;
  case "DE":
    Header( "HTTP/1.1 301 Moved Permanently" );
-   Header ("Location: http://www.yournextread.com/de/" );
+   Header ("Location: http://test.markup.co.uk/ywww/de/" );
    break;
  case "FR":
    Header( "HTTP/1.1 301 Moved Permanently" );
-   Header ("Location: http://www.yournextread.com/fr/" );
+   Header ("Location: http://test.markup.co.uk/ywww/fr/" );
    break;			
  case "GB":
    Header( "HTTP/1.1 301 Moved Permanently" );
-   Header ("Location: http://www.yournextread.com/uk/" );
+   Header ("Location: http://test.markup.co.uk/ywww/uk/" );
    break;
  case "US":
    Header( "HTTP/1.1 301 Moved Permanently" );
-   Header ("Location: http://www.yournextread.com/us/" );
+   Header ("Location: http://test.markup.co.uk/ywww/us/" );
    break;
  default:
    Header( "HTTP/1.1 301 Moved Permanently" );
-   Header ("Location: http://www.yournextread.com/us/" );
+   Header ("Location: http://test.markup.co.uk/ywww/us/" );
    break;	
  }	  
 	?>
--- a/php/read/aws_signed_request.php	Sat Jan 05 06:21:12 2019 -0500
+++ b/php/read/aws_signed_request.php	Sat Jan 05 18:00:10 2019 -0500
@@ -3,49 +3,6 @@
 //20090627/Jaap van Ganswijk: This is a modified version, see the
 //return statement some lines before the end of the last function.
 
-
-$Aassociates_id=array(
-		      'uk' => 'bookwhack-21',
-		      'us' => 'your02b-20',
-		      'ca' => 'book009-20',
-		      'de' => 'book04c-21',
-		      'fr' => 'book07f-21',
-		      );
-
-$Aserver=array(
-	       'ca' => array(
-			     'ext' => 'ca'                      ,  //Canadian normal server
-			     'nor' => 'http://www.amazon.ca'    ,  //Canadian normal server
-			     'xml' => 'http://xml.amazon.com'   ,  //Canadian xml server
-			     ),
-	       'de' => array(
-			     'ext' => 'de'                      ,  //German normal server
-			     'nor' => 'http://www.amazon.de'    ,  //German normal server
-			     'xml' => 'http://xml-eu.amazon.com',  //German xml server
-			     ),
-	       'fr' => array(
-			     'ext' => 'fr'                      ,  //French normal server
-			     'nor' => 'http://www.amazon.fr'    ,  //French normal server
-			     'xml' => 'http://xml-eu.amazon.com',  //French xml server
-			     ),
-	       'jp' => array(
-			     'ext' => 'jp'                      ,  //Japanese normal server, not co.jp!
-			     'nor' => 'http://www.amazon.co.jp' ,  //Japanese normal server
-			     'xml' => 'http://xml.amazon.com'   ,  //Japanese xml server
-			     ),
-	       'uk' => array(
-			     'ext' => 'co.uk'                   ,  //UK normal server
-			     'nor' => 'http://www.amazon.co.uk' ,  //UK normal server
-			     'xml' => 'http://xml-eu.amazon.com',  //UK xml server
-			     ),
-	       'us' => array(
-			     'ext' => 'com'                     ,  //USA normal server
-			     'nor' => 'http://www.amazon.com'   ,  //USA normal server
-			     'xml' => 'http://xml.amazon.com'   ,  //USA xml server
-			     ),
-	       );
-
-
 if (!function_exists("aws_signed_request")) {
 function aws_signed_request($region, $params, $public_key, $private_key)
 {
--- a/php/read/getBookDetails.php	Sat Jan 05 06:21:12 2019 -0500
+++ b/php/read/getBookDetails.php	Sat Jan 05 18:00:10 2019 -0500
@@ -1,5 +1,7 @@
 <?php
+include_once "dlog.php";
 
+include_once "web.php";
 function findGenre($browseNode, &$ID, &$gen)
 {
 	if($browseNode->Name == "Subjects")
@@ -23,7 +25,7 @@
 	}
 }
 
-global $out,$isbn;
+global $out,$isbn,$Aserver,$Aassociates_id;
 if(isset($_GET['isbn'])){
 	$isbn = $_GET['isbn'];
 	if(isset($_GET['locale'])){
@@ -106,9 +108,7 @@
 	  {
 	    include "aws_signed_request.php";
 	    include_once "../../xml/doAmazonRequest.inc";
-	    file_put_contents('/var/ywww/debug/phpDebug',
-			      "nbd proceeding: $isbn\n",
-			      FILE_APPEND);
+	    dl("nbd proceeding: $isbn\n");
 
 	    //book does not exist already so look up all the info from browse nodes....
 
@@ -128,46 +128,6 @@
 			    );
 	    //change the debug options to true if you want to activate them or call the script with '?show_array=true' to see what actual information you're getting from Amazon and how little my standard script is actually showing of it
 
-	    $Aassociates_id=array(
-				  'uk' => 'bookwhack-21',
-				  'us' => 'your02b-20',
-				  'ca' => 'book009-20',
-				  'de' => 'book04c-21',
-				  'fr' => 'book07f-21',
-				  );
-
-	    $Aserver=array(
-			   'ca' => array(
-					 'ext' => 'ca'                      ,  //Canadian normal server
-					 'nor' => 'http://www.amazon.ca'    ,  //Canadian normal server
-					 'xml' => 'http://xml.amazon.com'   ,  //Canadian xml server
-					 ),
-			   'de' => array(
-					 'ext' => 'de'                      ,  //German normal server
-					 'nor' => 'http://www.amazon.de'    ,  //German normal server
-					 'xml' => 'http://xml-eu.amazon.com',  //German xml server
-					 ),
-			   'fr' => array(
-					 'ext' => 'fr'                      ,  //French normal server
-					 'nor' => 'http://www.amazon.fr'    ,  //French normal server
-					 'xml' => 'http://xml-eu.amazon.com',  //French xml server
-					 ),
-			   'jp' => array(
-					 'ext' => 'jp'                      ,  //Japanese normal server, not co.jp!
-					 'nor' => 'http://www.amazon.co.jp' ,  //Japanese normal server
-					 'xml' => 'http://xml.amazon.com'   ,  //Japanese xml server
-					 ),
-			   'uk' => array(
-					 'ext' => 'co.uk'                   ,  //UK normal server
-					 'nor' => 'http://www.amazon.co.uk' ,  //UK normal server
-					 'xml' => 'http://xml-eu.amazon.com',  //UK xml server
-					 ),
-			   'us' => array(
-					 'ext' => 'com'                     ,  //USA normal server
-					 'nor' => 'http://www.amazon.com'   ,  //USA normal server
-					 'xml' => 'http://xml.amazon.com'   ,  //USA xml server
-					 ),
-			   );
 
 	    //for all parameters see if the user has overruled it or use the default
 	    foreach ($Adefault as $i=>$d) {
@@ -192,14 +152,10 @@
 	      //use this xml to pull out the necessary information and save it
 	      set_error_handler(function () {
 		  global $out,$isbn;
-		  file_put_contents('/var/ywww/debug/phpDebug',
-				    "Caught one bd: ".$isbn,
-				    FILE_APPEND);
-		  file_put_contents('/var/ywww/debug/phpDebug',
-				    print_r($out, TRUE)."\n",
-				    FILE_APPEND);
+		  dl("Caught one bd: $isbn\n");
+		  dl(print_r($out, TRUE)."\n");
 		} );
-	      include "../../../private/db.php";
+	      include "db.php";
 	
 	      $title="";
 	      $author="";
@@ -317,9 +273,7 @@
 	      if (!$res) {
 		$err=mysqli_error( $link );
 		mysqli_close($link);
-		file_put_contents('/var/ywww/debug/phpDebug',
-				  "anb failed: $err, $pubDate, $g2, $publisher, $title\n",
-				  FILE_APPEND);
+		dl("anb failed: $err, $pubDate, $g2, $publisher, $title\n");
 		exit($err);
 	      }
 	      mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop		
@@ -340,9 +294,7 @@
 	      $output .=  "<ProductGroup>Book</ProductGroup>";
 	    }
 	    catch (Exception $e) {
-	      file_put_contents('/var/ywww/debug/phpDebug',
-				"gBD: dAR failed:".$e->getMessage()."\n",
-				FILE_APPEND);
+	      dl("gBD: dAR failed:".$e->getMessage()."\n");
 	    }
 	  }
 	$output .=  "</BookDetails>";
--- a/us/index.php	Sat Jan 05 06:21:12 2019 -0500
+++ b/us/index.php	Sat Jan 05 18:00:10 2019 -0500
@@ -1,6 +1,7 @@
 <?PHP
+include_once "dlog.php";
 session_start();
-  
+
 	function uniqueRand($n, $min = 0, $max = null)
 	{
 		if($max === null)
@@ -79,7 +80,7 @@
 				<li><a href=\"http://support.microsoft.com/gp/howtoscript\">Internet Explorer</a></li>
 				</ul>
 				<p>Thank you for using YourNextRead<p>
-				<img src=\"http://www.yournextread.com/images/topleft.gif\" alt=\"YourNextRead\"/>
+				<img src=\"http://test.markup.co.uk/ywww/images/topleft.gif\" alt=\"YourNextRead\"/>
 				</noscript>";
 				if($iPhone && !$iPad)
 				{
@@ -111,7 +112,7 @@
 					for($i=0;$i<sizeof($xml->List[$id]->ListDetails->Book);$i++){
 						$bookTitle = $xml->List[$id]->ListDetails->Book[$i]->BookTitle;
 						$isbn = $xml->List[$id]->ListDetails->Book[$i]->ISBN;
-						echo "<a href=http://www.YourNextRead.com/us/#!isbn=$isbn>$bookTitle</a> ";
+						echo "<a href=http://test.markup.co.uk/ywww/us/#!isbn=$isbn>$bookTitle</a> ";
 					}
 				}		
 			}
@@ -146,8 +147,7 @@
 					if (preg_match("/<Error>/",$bookDetails)) {
 					  $resName=$bookXML->getName();
 					  $code=$bookXML->Error->Code;
-					  file_put_contents('/var/ywww/debug/phpDebug',"Losing 3: $resName, ".
-							    $code."\n",FILE_APPEND);
+					  dl("Losing 3: $resName, $code\n");
 					  if ($code=='RequestThrottled') {
 					    usleep(200000); // Try to reduce throttling until we get a 
 					    // principled solution in place
@@ -183,9 +183,7 @@
 				$xml = new SimpleXMLElement($linkedBooks);
 				}
 				catch (Exception $e) {
-				  file_put_contents('/var/ywww/debug/phpDebug',
-						    "Bad XML?: ".$linkedBooks,
-						    FILE_APPEND);
+				  dl("Bad XML?: ".$linkedBooks."\n");
 				  throw $e;
 				}
 				$recommended = "";
@@ -198,12 +196,7 @@
 				  $res = mysqli_query($link, $query) or exit( mysqli_error( $link ));
 				  set_error_handler(function () {
 				      global $bookLDetails, $linkedISBN;
-				      file_put_contents('/var/ywww/debug/phpDebug',
-							"Caught other one?: ".$linkedISBN,
-							FILE_APPEND);
-				      //file_put_contents('/var/ywww/debug/phpDebug',
-				      //		print_r($bookLDetails, TRUE)."\n",
-				      //		FILE_APPEND);
+				      dl("Caught other one?: $linkedISBN\n");
 				    } );
 				  if ( mysqli_num_rows( $res ) > 0 )
 				    {
@@ -221,8 +214,7 @@
 				      if (preg_match("/<Error>/",$bookLDetails)) {
 					$resName=$bookLXML->getName();
 					$code=$bookLXML->Error->Code;
-					file_put_contents('/var/ywww/debug/phpDebug',"Losing 2: $resName, ".
-							  $code."\n",FILE_APPEND);
+					dl("Losing 2: $resName, $code\n");
 					if ($code=='RequestThrottled') {
 					  usleep(200000); // Try to reduce throttling until we get a 
 					  // principled solution in place
@@ -253,7 +245,7 @@
 				      $recommended .= " $titleL by $authorL,";
 				      $underAuthor = str_replace(" ","_",$authorL);
 				      $underTitle = str_replace(" ","_",$titleL);
-				      $linkedRecommended .= "<a href=\"http://www.YourNextRead.com/us/#!isbn=$linkedISBN/$underTitle" . "_by_$authorL\">$titleL by $authorL</a>, ";		
+				      $linkedRecommended .= "<a href=\"http://test.markup.co.uk/ywww/us/#!isbn=$linkedISBN/$underTitle" . "_by_$authorL\">$titleL by $authorL</a>, ";		
 				    }					
 				}
 				
@@ -271,7 +263,7 @@
 				<li><a href=\"http://support.microsoft.com/gp/howtoscript\">Internet Explorer</a></li>
 				</ul>
 				<p>Thank you for using YourNextRead<p>
-				<img src=\"http://www.yournextread.com/images/topleft.gif\" alt=\"YourNextRead\"/>
+				<img src=\"http://test.markup.co.uk/ywww/images/topleft.gif\" alt=\"YourNextRead\"/>
 				</noscript>";
 				if($iPhone && !$iPad)
 				{
@@ -291,10 +283,10 @@
 				echo $linkedRecommended . "</p>";
 				echo "<p>" . $vote . "</p>";
 				
-				echo "Change to <a href=\"http://www.YourNextRead.com/de/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead Germany</a>, ";
-				echo "Change to <a href=\"http://www.YourNextRead.com/ca/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead Canada</a>, ";
-				echo "Change to <a href=\"http://www.YourNextRead.com/fr/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead France</a>, ";				
-				echo "Change to <a href=\"http://www.YourNextRead.com/us/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead USA</a>";
+				echo "Change to <a href=\"http://test.markup.co.uk/ywww/de/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead Germany</a>, ";
+				echo "Change to <a href=\"http://test.markup.co.uk/ywww/ca/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead Canada</a>, ";
+				echo "Change to <a href=\"http://test.markup.co.uk/ywww/fr/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead France</a>, ";				
+				echo "Change to <a href=\"http://test.markup.co.uk/ywww/us/#!isbn=$isbn/$title" . "_by_$author\">YourNextRead USA</a>";
 				echo ", See this on <a href=\"http://www.YourNextPresent.com/us/#!isbn=$isbn\">YourNextPresent</a>, ";
 				echo "Switch to <a href=\"http://www.YourNextFilm.com/us/\">YourNextFilm</a>, ";
 				echo "Switch to <a href=\"http://www.YourNextGame.com/us/\">YourNextGame</a>";
@@ -320,7 +312,7 @@
 			<li><a href=\"http://support.microsoft.com/gp/howtoscript\">Internet Explorer</a></li>
 			</ul>
 			<p>Thank you for using YourNextRead<p>
-			<img src=\"http://www.yournextread.com/images/topleft.gif\" alt=\"YourNextRead\"/>
+			<img src=\"http://test.markup.co.uk/ywww/images/topleft.gif\" alt=\"YourNextRead\"/>
 			</noscript>";
 			if($iPhone && !$iPad)
 			{
--- a/xml/amazonBookSearch.php	Sat Jan 05 06:21:12 2019 -0500
+++ b/xml/amazonBookSearch.php	Sat Jan 05 18:00:10 2019 -0500
@@ -1,5 +1,9 @@
 <?php
 
+include_once "dlog.php";
+
+include_once "doAmazonRequest.inc";
+
 $Adefault=array(
   'language'           =>'en',           //what language to render the page in
   'locale'             =>'us',           //which server's products? available: ca,de,fr,jp,uk,us
@@ -12,51 +16,6 @@
   'show_url'           =>false,          //debug: show XML request url to be send to Amazon?
 );
 
-$Aassociates_id=array(
-  'uk' => 'bookwhack-21',
-  'us' => 'your02b-20',
-  'ca' => 'book009-20',
-  'de' => 'book04c-21',
-  'fr' => 'book07f-21',
-);
-
-$Aserver=array(
-  'ca' => array(
-    'ext' => 'ca'                      ,  //Canadian normal server
-    'nor' => 'http://www.amazon.ca'    ,  //Canadian normal server
-    'xml' => 'http://xml.amazon.com'   ,  //Canadian xml server
-  ),
-  'de' => array(
-    'ext' => 'de'                      ,  //German normal server
-    'nor' => 'http://www.amazon.de'    ,  //German normal server
-    'xml' => 'http://xml-eu.amazon.com',  //German xml server
-  ),
-  'fr' => array(
-    'ext' => 'fr'                      ,  //French normal server
-    'nor' => 'http://www.amazon.fr'    ,  //French normal server
-    'xml' => 'http://xml-eu.amazon.com',  //French xml server
-  ),
-  'jp' => array(
-    'ext' => 'jp'                      ,  //Japanese normal server, not co.jp!
-    'nor' => 'http://www.amazon.co.jp' ,  //Japanese normal server
-    'xml' => 'http://xml.amazon.com'   ,  //Japanese xml server
-  ),
-  'uk' => array(
-    'ext' => 'co.uk'                   ,  //UK normal server
-    'nor' => 'http://www.amazon.co.uk' ,  //UK normal server
-    'xml' => 'http://xml-eu.amazon.com',  //UK xml server
-  ),
-  'us' => array(
-    'ext' => 'com'                     ,  //USA normal server
-    'nor' => 'http://www.amazon.com'   ,  //USA normal server
-    'xml' => 'http://xml.amazon.com'   ,  //USA xml server
-  ),
-);
-
-include "aws_signed_request.php";  
-$public_key ="AKIAIHTNWC7L6LOUY4LQ";
-$private_key="zWQlIzndJDtXNfxEXH7K7YR7hzv3u77lOcqfqPde";
-
 //for all parameters see if the user has overruled it or use the default
 foreach ($Adefault as $i=>$d) {
   $$i=isset($_GET[$i])?$_GET[$i]:$d;
@@ -77,39 +36,17 @@
     'ResponseGroup'   =>'Images,ItemAttributes'                ,  //Small, Medium, Large or SellerListing
   );
 
-$ext=$Aserver[$locale]['ext'];  
-$file_data=$ext;
-ksort($parameters);
-foreach ($parameters as $i=>$d) {
-  $file_data.='&'.$i.'='.$d;
+
+try {
+  $ret=doAmazonRequest($Aserver[$locale]['ext'],$parameters,3,'s',False);
 }
-
-$url=aws_signed_request($ext,$parameters,$public_key,$private_key);  
-//echo $url;
-
-        $crl = curl_init();
-        $timeout = 5;
-        curl_setopt ($crl, CURLOPT_URL,$url);
-        curl_setopt ($crl, CURLOPT_ENCODING , "gzip");
-	curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
-	$gotit=0;
-	  $semaphore = new SyncSemaphore("Amazon");
-	  $gotit = $semaphore->lock(1000);
-          if (!$gotit) {
-	    file_put_contents('/var/ywww/debug/phpDebug',
-			      "Got it: ".(int)$gotit." 3\n",FILE_APPEND);
-	    $gotit=$semaphore->lock(1000);
-	    file_put_contents('/var/ywww/debug/phpDebug',
-			      "Got it: ".(int)$gotit." 3a\n",FILE_APPEND);
-	  }
-        $ret = curl_exec($crl);
-        curl_close($crl);
-        usleep(500000);
-	if ($gotit) {
-	  $semaphore->unlock();
-	}
-        else {
-	  file_put_contents('/var/ywww/debug/phpDebug',"W/o lock 3b\n",FILE_APPEND);
-        }
-        echo $ret;
+catch (Exception $e) {
+  if ($e->getMessage()=='AWS.ECommerceService.NoExactMatches') {
+    // Seems to be an 'OK' thing...
+    $ret='<?xml version="1.0" ?><ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><RequestId>0e41c74c-eeff-4f24-a761-9537cfebea21</RequestId></OperationRequest><Items><Request><IsValid>True</IsValid></Request><TotalResults>0</TotalResults><TotalPages>0</TotalPages></Items></ItemSearchResponse>';
+  }
+  else {
+    $ret='<?xml version="1.0" ?><ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"><OperationRequest><RequestId>0e41c74c-eeff-4f24-a761-9537cfebea21</RequestId></OperationRequest><Items><Request><IsValid>True</IsValid><Errors><Error><Code>'.$code.'</Code><Message>[lost]</Message></Error></Errors></Request><TotalResults>0</TotalResults><TotalPages>0</TotalPages></Items></ItemSearchResponse>';
+  }
+}
+echo $ret;
--- a/xml/doAmazonRequest.inc	Sat Jan 05 06:21:12 2019 -0500
+++ b/xml/doAmazonRequest.inc	Sat Jan 05 18:00:10 2019 -0500
@@ -1,9 +1,12 @@
 <?php
+include_once "dlog.php";
 
-function doAmazonRequest($ext, $parameters, $try, $dbl='x')
+include_once "web.php";
+include "aws_signed_request.php";  
+
+function doAmazonRequest($ext, $parameters, $try, $dbl='x', $wantXML=True)
 {
-  $public_key ="AKIAIHTNWC7L6LOUY4LQ";
-  $private_key="zWQlIzndJDtXNfxEXH7K7YR7hzv3u77lOcqfqPde";
+  global $public_key, $private_key;
   $requestURI = $_SERVER['REQUEST_URI'];
   $requestIP = $_SERVER['REMOTE_ADDR'];
   $file_data=$ext;
@@ -11,10 +14,9 @@
   foreach ($parameters as $i=>$d) {
     $file_data.='&'.$i.'='.$d;
   }
-  //file_put_contents('/var/ywww/debug/phpDebug',
-  //		"nai1: $requestIP $file_data\n",FILE_APPEND);
   $gotit=0;
   $url=aws_signed_request($ext,$parameters,$public_key,$private_key);  
+  //dl("search: $ext $public_key $private_key\n$url\n".print_r($parameters,TRUE)."\n");
   for ($i=1; $i<=$try; $i++) {
     $crl = curl_init();
     $timeout = 5;
@@ -25,15 +27,12 @@
     $semaphore = new SyncSemaphore("Amazon");
     $gotit = $semaphore->lock(1000);
     if (!$gotit) {
-      file_put_contents('/var/ywww/debug/phpDebug',
-			"Got it: ".(int)$gotit." $requestIP $dbl\n",FILE_APPEND);
+      dl("Got it: ".(int)$gotit." $requestIP $dbl\n");
       $gotit=$semaphore->lock(1000);
-      file_put_contents('/var/ywww/debug/phpDebug',
-			"Got it: ".(int)$gotit." $requestIP $dbl"."a\n",FILE_APPEND);
+      dl("Got it: ".(int)$gotit." $requestIP $dbl"."a\n");
     }
     $output = curl_exec($crl);
-    //file_put_contents('/var/ywww/debug/phpDebug',
-    //	      "nai2: ".strlen($output)."\n",FILE_APPEND);
+    //dl("nai2: ".strlen($output)."\n");
 
     curl_close($crl);
     usleep(500000);
@@ -41,8 +40,7 @@
       $semaphore->unlock();
     }
     else {
-      file_put_contents('/var/ywww/debug/phpDebug',
-			"W/o lock for $requestIP $dbl"."b\n",FILE_APPEND);
+      dl("W/o lock for $requestIP $dbl"."b\n");
     }
     $mm=array();
     $xml = new SimpleXMLElement($output);	
@@ -56,9 +54,10 @@
 	$code=$xml->Items->Request->Errors->Error->Code;
 	$message=$xml->Items->Request->Errors->Error->Message;
       }
-      file_put_contents('/var/ywww/debug/phpDebug',"Losing $i: $dbl ".$mm[0].", $resName, $code, $requestIP, $requestURI\n",FILE_APPEND);
+      dl("Losing $i: $dbl ".
+	 $mm[0].", $resName, $code, $requestIP, $requestURI\n");
       if ($code!='RequestThrottled') {
-	file_put_contents('/var/ywww/debug/phpDebug',"message: $message\n",FILE_APPEND);
+	dl("message: $message\n");
 	if ($code=='AWS.InvalidParameterValue' && strpos($message,"for ItemId.")>0) {
 	  // Check for common problem and try to fix...
 	  $spd=$parameters['ItemId'];
@@ -68,18 +67,24 @@
 	    if (isset($parameters['Keywords'])) {
 		$parameters['Keywords']=urlencode($isbnMaybe);
 	      }
-	    file_put_contents('/var/ywww/debug/phpDebug',"retrying with $isbnMaybe\n",FILE_APPEND);
+	    dl("retrying with $isbnMaybe\n");
 	    return doAmazonRequest($ext,$parameters,$try,$dbl);
 	  }
 	}
 	if ($code=="") {
-	  file_put_contents('/var/ywww/debug/phpDebug',"error elt:\n$output\n",FILE_APPEND);
+	  dl("error elt:\n$output\n");
 	}
 	throw new Exception($code);
       }
     }
     else {
-      return $xml;
+      if ($wantXML) {
+	return $xml;
+      }
+      else {
+	//dl("returning ".strlen($output)."\n");
+	return $output;
+      }
     }
     usleep(100000*$i); // Try to reduce throttling until we get a 
     // principled solution in place
--- a/xml/getAmazonInfo.php	Sat Jan 05 06:21:12 2019 -0500
+++ b/xml/getAmazonInfo.php	Sat Jan 05 18:00:10 2019 -0500
@@ -1,584 +1,572 @@
-<?php
-
-include_once "doAmazonRequest.inc";
-
-function getAmazonDet($isbn,$go,$localeIn)
-{
-  $Adefault=array(
-		  'language'           =>'en',           //what language to render the page in
-		  'locale'             =>$localeIn,           //which server's products? available: ca,de,fr,jp,uk,us
-		  //'mode'               =>'books',        //what product category?
-		  'page'               =>1,              //first page to show (we are counting from 1 not 0)
-		  //'search'             =>'Machiavelli',  //what to search for?
-		  'operation'          =>'ItemLookup',   //what to do?	//ItemSearch
-		  'searchindex'        =>'Books',        //what product category for search?
-		  'searchparameter'    =>'ItemId',       //what kind of search?
-		  'searchparameterdata'=>$isbn,  //what to search for?
-		  //here some debugging flags you can put at the end of the URL to call this script with, like: '?show_array=true'
-		  'show_array'         =>false,          //debug: show complete incoming array? You can use this to see what other information Amazon is sending
-		  'show_url'           =>false,          //debug: show XML request url to be send to Amazon?
-		  'show_xml'           =>false,          //debug: show incoming XML code from Amazon?
-		  );
-  //change the debug options to true if you want to activate them or call the script with '?show_array=true' to see what actual information you're getting from Amazon and how little my standard script is actually showing of it
-  //for all parameters see if the user has overruled it or use the default
-  foreach ($Adefault as $i=>$d) {
-    $$i=isset($_GET[$i])?$_GET[$i]:$d;
-  }
-  switch($locale){
-  case "us": 
-    $loc = 0;
-    break;
-  case "uk": 
-    $loc = 1;
-    break;
-  case "ca": 
-    $loc = 2;
-    break;
-  case "de": 
-    $loc = 3;
-    break;
-  case "fr": 
-    $loc = 4;
-    break;
-  };		
-
-  try {  
-    return getAmazonDetRemote($go,$language,$locale,$loc,
-			      $page,$operation,$searchparameter,
-			      $searchparameterdata,
-			      $show_array,$show_url,$show_xml);
-  }
-  catch (Exception $e) {
-    return getAmazonDetLocal($go,$language,$loc,
-			     $page,$operation,$searchparameter,
-			     $searchparameterdata,
-			     $show_array,$show_url,$show_xml);
-  }
-}
-
-function getAmazonDetRemote($go,$language,$locale,$loc,
-			    $page,$operation,$searchparameter,
-			    $searchparameterdata,
-			    $show_array,$show_url,$show_xml)
-{
-  global $output, $Aassociates_id, $Aserver;
-
-  //if(go != 1)
-  //include "aws_signed_request.php";  
-  //this is the data that is used to form the request for AWS
-  //this is the part that is search specific
-  $parameters=array(
-		    'Operation'       =>$operation              ,
-		    //'Keywords'        =>urlencode($search)      ,
-		    "$searchparameter"=>$searchparameterdata    ,
-		    'ItemPage'        =>$page                   ,  //which page?
-		    'AssociateTag'    =>$Aassociates_id[$locale],
-		    'ResponseGroup'   =>'ItemAttributes,Reviews,EditorialReview,OfferSummary,Offers,Images,AlternateVersions,SalesRank,BrowseNodes'                ,  //Small, Medium, Large or SellerListing,'BrowseNodes',// ,
-		    'ReviewSort'	  =>'-HelpfulVotes'
-		    );
-
-  if (isset($searchindex) && $searchindex!='Books') {
-    // HST did this
-    // Used to be in $parameters init above, but
-    // that caused an error:
-    // If idType equals ASIN, SearchIndex cannot be present
-    //'SearchIndex'     =>$searchindex      ,  //Books for example.
-    $parameters['SearchIndex']=$searchindex;
-  }
-  $xml=doAmazonRequest($Aserver[$locale]['ext'],$parameters,3,'i');  // may throw exception
-  set_error_handler(function () {
-      global $output;
-      file_put_contents('/var/ywww/debug/phpDebug',
-			"Caught one?: ".$searchparameterdata,
-			FILE_APPEND);
-      file_put_contents('/var/ywww/debug/phpDebug',
-			print_r($output, TRUE)."\n",
-			FILE_APPEND);
-    } );
-  $review = $xml->Items->Item->CustomerReviews->IFrameURL;
-  restore_error_handler();
-  //echo $review;
-  if ($review != "")
-    {
-      $review1 = "";
-      $review2 = "";
-      $review3 = "";
-      $text = @file_get_contents($review . "&truncate=300");
-      $removeTop1 = preg_replace('~<div class="crIFrameHeaderLeftColumn">(.*?)<div class="crIFrameHeaderHistogram">~si', '', $text);
-      $removeTop2 = preg_replace('~<div class="crIFrameHeaderHistogram">(.*?)<div class="crIframeReviewList">~si', '', $text);
-      if (preg_match('~<body[^>]*>(.*?)</body>~si', $removeTop2, $body)){ $getBody = trim($body[1]); } else { $getBody = $removeTop2;}
-      $removeDiv = preg_replace('~<div[^>]*>(.*?)</div>~si', '', $getBody);
-      $removeCloseDivs = preg_replace('/<\/div>/','', $removeDiv);
-      $setBoundary = str_replace('<!-- BOUNDARY -->','BOTTOM-TOP', $removeCloseDivs);
-      //replace <!-- BOUNDARY --> with BOTTOM-TOP
-      $remove1 = '~<table cellpadding="0"(.*?)%">~s';
-      $setBoundary = preg_replace($remove1,'', $setBoundary);
-      $remove2 = '~</td><td bg(.*?)</table>~s';
-      $setBoundary = preg_replace($remove2,'', $setBoundary);
-      $remove3 = '~<a name=(.*?)</a>~s';
-      $setBoundary = preg_replace($remove3,'', $setBoundary);
-      $setBoundary2 = str_replace('<br />','', $setBoundary);
-      //remove all extra crap;
-      $setBoundary3 = str_replace('</td>','BOTTOM', $setBoundary2);
-      //replace </td> with BOTTOM
-		
-      if (preg_match_all('~TOP(.*?)BOTTOM~s', $setBoundary3, $reviews))
-	{ 
-	  $reviewContents = $reviews[1];
-	  //print_r($reviewContents);
-	  $review1 = trim($reviewContents[0]);
-	  $review1 = str_replace("\n", "", $review1);
-	  $review1 = str_replace("\r", "", $review1);
-	  if (isset($reviewContents[1])) {
-	    $review2 = trim($reviewContents[1]);
-	    $review2 = str_replace("\n", "", $review2);
-	    $review2 = str_replace("\r", "", $review2);
-	  }
-	  else {
-	    $review2 = "";
-	  }
-	  if (isset($reviewContents[2])) {
-	    $review3 = trim($reviewContents[2]);
-	    $review3 = str_replace("\n", "", $review3);
-	    $review3 = str_replace("\r", "", $review3);
-	  }
-	  else {
-	    $review3 = "";
-	  }
-	}
-      else
-	{
-	  $review1 = "";
-	  $review2 = "";
-	  $review3 = "";
-	  //echo "EPIC FAIL";
-	}
-
-      unset($xml->Items->Item->CustomerReviews);
-      $xdoc = new DomDocument;
-      $xdoc->loadXML($xml->asXML());
-		
-      $cReviews = $xdoc ->createElement('CustomerReviews');
-      $cReviewHolder = $xdoc ->createElement('Review');
-      $cReview = $xdoc ->createElement('Content');
-      $cReviewHolder2 = $xdoc ->createElement('Review');
-      $cReview2 = $xdoc ->createElement('Content');	
-      $cReviewHolder3 = $xdoc ->createElement('Review');
-      $cReview3 = $xdoc ->createElement('Content');
-		
-      $txtNode = $xdoc ->createTextNode ($review1);
-      $cReview -> appendChild($txtNode);
-		
-      $txtNode2 = $xdoc ->createTextNode ($review2);
-      $cReview2 -> appendChild($txtNode2);
-		
-      $txtNode3 = $xdoc ->createTextNode ($review3);
-      $cReview3 -> appendChild($txtNode3);
-		
-      $cReviewHolder -> appendChild($cReview);
-      $cReviewHolder2 -> appendChild($cReview2);
-      $cReviewHolder3 -> appendChild($cReview3);
-		
-      $cReviews -> appendChild($cReviewHolder);
-      $cReviews -> appendChild($cReviewHolder2);
-      $cReviews -> appendChild($cReviewHolder3);
-		
-      $xdoc->documentElement->childNodes->item(1)->childNodes->item(1)->appendChild($cReviews);
-      $newXML = simplexml_import_dom($xdoc);
-      $output = $newXML->asXml();
-    }
-	
-  if($go == 1) {
-    $item = $xml->Items->Item[0];
-    if ($item && $item->ItemAttributes && $item->ItemAttributes->Title) {
-      $title = $item->ItemAttributes->Title; }
-    else { $title = "[no title]"; };
-    file_put_contents('/var/ywww/debug/phpDebug',"win: $title\n",
-		      FILE_APPEND);
-    return $output;
-  }
-  else {
-    if ($xml->Items->Item) {
-      $title = $xml->Items->Item[0]->ItemAttributes->Title;
-      $author = $xml->Items->Item[0]->ItemAttributes->Author;
-      $binding = $xml->Items->Item[0]->ItemAttributes->Binding;
-      $dewey = $xml->Items->Item[0]->ItemAttributes->DeweyDecimalNumber;
-      if($dewey == "")
-	$dewey = "null";
-      $imageURL = $xml->Items->Item[0]->MediumImage->URL;
-      $salesRank = $xml->Items->Item[0]->SalesRank;
-      $pubDate = $xml->Items->Item[0]->ItemAttributes->PublicationDate;
-      if (strlen($pubDate)==4) { $pubDate=$pubDate."-01-01";}
-      if (strlen($pubDate)==7) { $pubDate=$pubDate."-01";}
-      if (strlen($pubDate)==0) {
-	$pubDate="null";
-      }
-      else {
-	$pubDate="\"$pubDate\"";
-      }
-      $publisher = $xml->Items->Item[0]->ItemAttributes->Publisher;
-    }
-    else {
-      $title = $salesRank = "";
-      $dewey = "null";
-    }
-			
-    $genreID = "";
-    $genre = "";		
-    $genArr = array();
-
-    if ($xml->Items->Item[0] && $xml->Items->Item[0]->BrowseNodes) {
-      for($i=0;$i<sizeof($xml->Items->Item->BrowseNodes->BrowseNode);$i++){	
-	//sexy recursive function
-	findGenre($xml->Items->Item->BrowseNodes->BrowseNode[$i], $genreID, $genre);
-				
-	if($genre != "")
-	  $genArr[strval($genreID)] = strval($genre);
-	//$genArr[$i] = array(strval($genreID) => strval($genre));
-
-	//echo $genre;
-	//echo $genreID;
-				
-	$genre = "";
-	$genreID = "";
-      }
-    }
-			
-    $g1 = "null";
-    $g2 = "null";
-    $g3 = "null";
-    $loop = 1;
-			
-    foreach ($genArr as $key => $value) {
-      //echo "$key => $value";
-      if ($key>2047) {
-	//HST added
-	break;
-      }
-      $queryG = "CALL b_addBrowseNode($key,\"$value\")";	//add the name value pair for genre to new table	
-      //echo $queryG;
-      include "../../private/db.php";
-      $resG = mysqli_query($link, $queryG);
-      mysqli_close($link);
-				
-      switch ($loop) {
-      case 1:
-	$g1 = $key;
-	break;
-      case 2:
-	$g2 = $key;
-	break;
-      case 3:
-	$g3 = $key;
-	break;
-      }
-				
-      $loop++;
-    }
-			
-    if($salesRank == "")
-      $salesRank = "null";
-			
-    if($title != "")
-      {
-	include "../../private/db.php";
-	if ($publisher->count()==0) {
-	  $publisher="null";
-	}
-	else {
-	  $publisher=mysqli_real_escape_string($link,$publisher);
-	  if (strlen($publisher)>30) {
-	    $publisher=rtrim(substr($publisher,0,30),"\\");
-	  }
-	  $publisher="\"".$publisher."\"";
-	}
-	if ($author->count()==0) {
-	  $author="unknown";
-	}
-	else {
-	  $author=mysqli_real_escape_string($link,$author);
-	  if (strlen($author)>30) {
-	    $author=rtrim(substr($author,0,30),"\\");
-	  }
-	}
-	$author="\"".$author."\"";
-	$title=mysqli_real_escape_string($link,$title);
-	if (strlen($title)>100) {
-	  $title=rtrim(substr($title,0,100),"\\");
-	}
-	$title="\"".$title."\"";
-	$review1 = mysqli_real_escape_string($link,$review1);
-	if (strlen($review1)>500) { $review1=rtrim(substr($review1,0,500),"\\");}
-	$review2 = mysqli_real_escape_string($link,$review2);
-	if (strlen($review2)>500) { $review2=rtrim(substr($review2,0,500),"\\");}
-	$review3 = mysqli_real_escape_string($link,$review3);
-	if (strlen($review3)>500) { $review3=rtrim(substr($review3,0,500),"\\");}
-			
-	$queryInsert = "CALL b_addNewBook(\"$searchparameterdata\",$title, $author,\"$binding\",\"$imageURL\", $dewey, $salesRank,$pubDate,$publisher,$g1,$g2,$g3,$loc)";	             
-	//echo $queryInsert;
-				
-	$res = mysqli_query($link, $queryInsert);
-	if (!$res) {
-	  $err=mysqli_error( $link );
-	  mysqli_close($link);
-	  file_put_contents('/var/ywww/debug/phpDebug',
-			    "anb failed: $queryInsert\n$err\n",
-			    FILE_APPEND);
-	  exit($err);
-	}
-	$queryInsertReviews = "CALL b_insertReviews(\"$searchparameterdata\",\"$review1\",\"$review2\",\"$review3\")";
-	if($review1 != "") {
-	  $res = mysqli_query($link, $queryInsertReviews);
-	  if (!$res) {
-	    $err=mysqli_error( $link );
-	    mysqli_close($link);
-	    file_put_contents('/var/ywww/debug/phpDebug',
-			      "anr failed: $queryInsertReviews\n",
-			      FILE_APPEND);
-	    exit($err);
-	  }
-	}
-	mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop		
-      }
-
-    echo $output;
-  }
-}
-
-function getAmazonDetLocal($go,$language,$loc,
-			   $page,$operation,$searchparameter,
-			   $searchparameterdata,
-			   $show_array,$show_url,$show_xml)
-{
-  global $output;
-  //look up info from db	
-  include "../../private/db.php"; 
-  $query = "CALL b_getBookInfo('$searchparameterdata', $loc)";
-  //echo $query;
-  $res = mysqli_query($link, $query) or exit( mysqli_error( $link ));
-	
-  $output = "";
-  $output .=  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
-  $output .=  "<Details>";
-  if ( mysqli_num_rows( $res ) > 0 )
-    {
-      $rows=mysqli_fetch_array($res, MYSQLI_ASSOC);
-      mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop						
-      $output .=  "<ASIN>" . $searchparameterdata . "</ASIN>";
-      $output .=  "<Title>" . htmlspecialchars($rows["Title"]) . "</Title>";			
-      $output .=  "<Author>" . htmlspecialchars($rows["Author"]) . "</Author>";
-      $output .=  "<Binding>" . htmlspecialchars($rows["Binding"]) . "</Binding>";
-      $output .=  "<Dewey>" . htmlspecialchars($rows["DeweyDecimal"]) . "</Dewey>";
-      $output .=  "<ImageURL>" . htmlspecialchars($rows["ImageURL"]) . "</ImageURL>";
-      $output .=  "<SalesRank>" . htmlspecialchars($rows["SalesRank"]) . "</SalesRank>";
-      $output .=  "<PublicationDate>" . htmlspecialchars($rows["PublicationDate"]) . "</PublicationDate>";
-      $output .=  "<Publisher>" . htmlspecialchars($rows["Publisher"]) . "</Publisher>";
-      $output .=  "<Genre1>" . htmlspecialchars($rows["Genre1"]) . "</Genre1>";
-      $output .=  "<Genre2>" . htmlspecialchars($rows["Genre2"]) . "</Genre2>";
-      $output .=  "<Genre3>" . htmlspecialchars($rows["Genre3"]) . "</Genre3>";
-      $output .=  "<ProductGroup>Book</ProductGroup>";
-      $output .=  "<Error>AccountLimitExceeded</Error>";
-			
-    }
-  else {
-    mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop
-  }
-  $output .=  "</Details>";
-  echo $output;
-}
-
-function findGenre($browseNode, &$ID, &$gen)
-{
-	if($browseNode->Name == "Subjects")
-	{
-		 return true;		 
-	}
-	else
-	{
-		if($browseNode->Ancestors->BrowseNode)
-		{
-			if(findGenre($browseNode->Ancestors->BrowseNode, $ID, $gen) == true)
-			{
-				$gen = $browseNode->Name;
-				$ID = $browseNode->BrowseNodeId;
-			}		
-		}
-		return false;		
-	}
-}
-
-if(!isset($ret))
-{
-	include "aws_signed_request.php";
-	getAmazonDet('default',0,'us');	//will get overwritten from URI params
-	// by the foreach ($Adefault as ... loop above
-}
-/*Caught oneSimpleXMLElement Object
-(
-    [OperationRequest] => SimpleXMLElement Object
-        (
-            [RequestId] => d2eaacba-2411-44e7-b268-f23a20167330
-            [Arguments] => SimpleXMLElement Object
-                (
-                    [Argument] => Array
-                        (
-                            [0] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => AWSAccessKeyId
-                                            [Value] => AKIAIHTNWC7L6LOUY4LQ 
-                                        )
-
-                                )
-
-                            [1] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => AssociateTag
-                                            [Value] => bookwhack-21
-                                        )
-
-                                )
-
-                            [2] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => ItemId
-                                            [Value] => B004Q3Q3Y4
-                                        )
-
-                                )
-
-                            [3] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => ItemPage
-                                            [Value] => 1
-                                        )
-
-                                )
-
-                            [4] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => Operation
-                                            [Value] => ItemLookup
-                                        )
-
-                                )
-
-                            [5] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => ResponseGroup
-                                            [Value] => ItemAttributes,Reviews,EditorialReview,OfferSummary,Offers,Images,AlternateVersions,SalesRank,BrowseNodes
-                                        )
-
-                                )
-
-                            [6] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => ReviewSort
-                                            [Value] => -HelpfulVotes
-                                        )
-
-                                )
-
-                            [7] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => Service
-                                            [Value] => AWSECommerceService
-                                        )
-
-                                )
-
-                            [8] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => Timestamp
-                                            [Value] => 2016-12-15T23:12:34Z
-                                        )
-
-                                )
-
-                            [9] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => Version
-                                            [Value] => 2011-08-01
-                                        )
-
-                                )
-
-                            [10] => SimpleXMLElement Object
-                                (
-                                    [@attributes] => Array
-                                        (
-                                            [Name] => Signature
-                                            [Value] => SUXfFZHQ74Joc+WDLx87uzemTdtHijNohykqafJXYKQ=
-                                        )
-
-                                )
-
-                        )
-
-                )
-
-            [RequestProcessingTime] => 0.3518217620000000
-        )
-
-    [Items] => SimpleXMLElement Object
-        (
-            [Request] => SimpleXMLElement Object
-                (
-                    [IsValid] => True
-                    [ItemLookupRequest] => SimpleXMLElement Object
-                        (
-                            [IdType] => ASIN
-                            [ItemId] => B004Q3Q3Y4
-                            [ResponseGroup] => Array
-                                (
-                                    [0] => ItemAttributes
-                                    [1] => Reviews
-                                    [2] => EditorialReview
-                                    [3] => OfferSummary
-                                    [4] => Offers
-                                    [5] => Images
-                                    [6] => AlternateVersions
-                                    [7] => SalesRank
-                                    [8] => BrowseNodes
-                                )
-
-                            [VariationPage] => All
-                        )
-
-                    [Errors] => SimpleXMLElement Object
-                        (
-                            [Error] => SimpleXMLElement Object
-                                (
-                                    [Code] => AWS.InvalidParameterValue
-                                    [Message] => B004Q3Q3Y4 is not a valid value for ItemId. Please change this value and retry your request.
-                                )
-
-                        )
-
-                )
-
-        )
-
-)
-*/
-	/*$xml = new SimpleXMLElement("<?xml version=\"1.0\"?><ItemLookupErrorResponse xmlns=\"http://ecs.amazonaws.com/doc/2009-03-31/\"><Error><Code>AccountLimitExceeded</Code><Message>Account limit of 2056 requests per hour exceeded.</Message></Error><RequestID>290ed059-730c-4789-93b4-6d21e11053d3</RequestID></ItemLookupErrorResponse>");*/
-?>
+<?php
+include_once "dlog.php";
+include_once "doAmazonRequest.inc";
+
+function getAmazonDet($isbn,$go,$localeIn)
+{
+  $Adefault=array(
+		  'language'           =>'en',           //what language to render the page in
+		  'locale'             =>$localeIn,           //which server's products? available: ca,de,fr,jp,uk,us
+		  //'mode'               =>'books',        //what product category?
+		  'page'               =>1,              //first page to show (we are counting from 1 not 0)
+		  //'search'             =>'Machiavelli',  //what to search for?
+		  'operation'          =>'ItemLookup',   //what to do?	//ItemSearch
+		  'searchindex'        =>'Books',        //what product category for search?
+		  'searchparameter'    =>'ItemId',       //what kind of search?
+		  'searchparameterdata'=>$isbn,  //what to search for?
+		  //here some debugging flags you can put at the end of the URL to call this script with, like: '?show_array=true'
+		  'show_array'         =>false,          //debug: show complete incoming array? You can use this to see what other information Amazon is sending
+		  'show_url'           =>false,          //debug: show XML request url to be send to Amazon?
+		  'show_xml'           =>false,          //debug: show incoming XML code from Amazon?
+		  );
+  //change the debug options to true if you want to activate them or call the script with '?show_array=true' to see what actual information you're getting from Amazon and how little my standard script is actually showing of it
+  //for all parameters see if the user has overruled it or use the default
+  foreach ($Adefault as $i=>$d) {
+    $$i=isset($_GET[$i])?$_GET[$i]:$d;
+  }
+  switch($locale){
+  case "us": 
+    $loc = 0;
+    break;
+  case "uk": 
+    $loc = 1;
+    break;
+  case "ca": 
+    $loc = 2;
+    break;
+  case "de": 
+    $loc = 3;
+    break;
+  case "fr": 
+    $loc = 4;
+    break;
+  };		
+
+  try {  
+    return getAmazonDetRemote($go,$language,$locale,$loc,
+			      $page,$operation,$searchparameter,
+			      $searchparameterdata,
+			      $show_array,$show_url,$show_xml);
+  }
+  catch (Exception $e) {
+    return getAmazonDetLocal($go,$language,$loc,
+			     $page,$operation,$searchparameter,
+			     $searchparameterdata,
+			     $show_array,$show_url,$show_xml);
+  }
+}
+
+function getAmazonDetRemote($go,$language,$locale,$loc,
+			    $page,$operation,$searchparameter,
+			    $searchparameterdata,
+			    $show_array,$show_url,$show_xml)
+{
+  global $output, $Aassociates_id, $Aserver;
+  //if(go != 1)
+  //include "aws_signed_request.php";  
+  //this is the data that is used to form the request for AWS
+  //this is the part that is search specific
+  $parameters=array(
+		    'Operation'       =>$operation              ,
+		    //'Keywords'        =>urlencode($search)      ,
+		    "$searchparameter"=>$searchparameterdata    ,
+		    'ItemPage'        =>$page                   ,  //which page?
+		    'AssociateTag'    =>$Aassociates_id[$locale],
+		    'ResponseGroup'   =>'ItemAttributes,Reviews,EditorialReview,OfferSummary,Offers,Images,AlternateVersions,SalesRank,BrowseNodes'                ,  //Small, Medium, Large or SellerListing,'BrowseNodes',// ,
+		    'ReviewSort'	  =>'-HelpfulVotes'
+		    );
+
+  if (isset($searchindex) && $searchindex!='Books') {
+    // HST did this
+    // Used to be in $parameters init above, but
+    // that caused an error:
+    // If idType equals ASIN, SearchIndex cannot be present
+    //'SearchIndex'     =>$searchindex      ,  //Books for example.
+    $parameters['SearchIndex']=$searchindex;
+  }
+  $xml=doAmazonRequest($Aserver[$locale]['ext'],$parameters,3,'i');  // may throw exception
+  set_error_handler(function () {
+      global $output;
+      dl("Caught one?: $searchparameterdata\n");
+      dl(print_r($output, TRUE)."\n");
+    } );
+  $review = $xml->Items->Item->CustomerReviews->IFrameURL;
+  restore_error_handler();
+  //echo $review;
+  if ($review != "")
+    {
+      $review1 = "";
+      $review2 = "";
+      $review3 = "";
+      $text = @file_get_contents($review . "&truncate=300");
+      $removeTop1 = preg_replace('~<div class="crIFrameHeaderLeftColumn">(.*?)<div class="crIFrameHeaderHistogram">~si', '', $text);
+      $removeTop2 = preg_replace('~<div class="crIFrameHeaderHistogram">(.*?)<div class="crIframeReviewList">~si', '', $text);
+      if (preg_match('~<body[^>]*>(.*?)</body>~si', $removeTop2, $body)){ $getBody = trim($body[1]); } else { $getBody = $removeTop2;}
+      $removeDiv = preg_replace('~<div[^>]*>(.*?)</div>~si', '', $getBody);
+      $removeCloseDivs = preg_replace('/<\/div>/','', $removeDiv);
+      $setBoundary = str_replace('<!-- BOUNDARY -->','BOTTOM-TOP', $removeCloseDivs);
+      //replace <!-- BOUNDARY --> with BOTTOM-TOP
+      $remove1 = '~<table cellpadding="0"(.*?)%">~s';
+      $setBoundary = preg_replace($remove1,'', $setBoundary);
+      $remove2 = '~</td><td bg(.*?)</table>~s';
+      $setBoundary = preg_replace($remove2,'', $setBoundary);
+      $remove3 = '~<a name=(.*?)</a>~s';
+      $setBoundary = preg_replace($remove3,'', $setBoundary);
+      $setBoundary2 = str_replace('<br />','', $setBoundary);
+      //remove all extra crap;
+      $setBoundary3 = str_replace('</td>','BOTTOM', $setBoundary2);
+      //replace </td> with BOTTOM
+		
+      if (preg_match_all('~TOP(.*?)BOTTOM~s', $setBoundary3, $reviews))
+	{ 
+	  $reviewContents = $reviews[1];
+	  //print_r($reviewContents);
+	  $review1 = trim($reviewContents[0]);
+	  $review1 = str_replace("\n", "", $review1);
+	  $review1 = str_replace("\r", "", $review1);
+	  if (isset($reviewContents[1])) {
+	    $review2 = trim($reviewContents[1]);
+	    $review2 = str_replace("\n", "", $review2);
+	    $review2 = str_replace("\r", "", $review2);
+	  }
+	  else {
+	    $review2 = "";
+	  }
+	  if (isset($reviewContents[2])) {
+	    $review3 = trim($reviewContents[2]);
+	    $review3 = str_replace("\n", "", $review3);
+	    $review3 = str_replace("\r", "", $review3);
+	  }
+	  else {
+	    $review3 = "";
+	  }
+	}
+      else
+	{
+	  $review1 = "";
+	  $review2 = "";
+	  $review3 = "";
+	  //echo "EPIC FAIL";
+	}
+
+      unset($xml->Items->Item->CustomerReviews);
+      $xdoc = new DomDocument;
+      $xdoc->loadXML($xml->asXML());
+		
+      $cReviews = $xdoc ->createElement('CustomerReviews');
+      $cReviewHolder = $xdoc ->createElement('Review');
+      $cReview = $xdoc ->createElement('Content');
+      $cReviewHolder2 = $xdoc ->createElement('Review');
+      $cReview2 = $xdoc ->createElement('Content');	
+      $cReviewHolder3 = $xdoc ->createElement('Review');
+      $cReview3 = $xdoc ->createElement('Content');
+		
+      $txtNode = $xdoc ->createTextNode ($review1);
+      $cReview -> appendChild($txtNode);
+		
+      $txtNode2 = $xdoc ->createTextNode ($review2);
+      $cReview2 -> appendChild($txtNode2);
+		
+      $txtNode3 = $xdoc ->createTextNode ($review3);
+      $cReview3 -> appendChild($txtNode3);
+		
+      $cReviewHolder -> appendChild($cReview);
+      $cReviewHolder2 -> appendChild($cReview2);
+      $cReviewHolder3 -> appendChild($cReview3);
+		
+      $cReviews -> appendChild($cReviewHolder);
+      $cReviews -> appendChild($cReviewHolder2);
+      $cReviews -> appendChild($cReviewHolder3);
+		
+      $xdoc->documentElement->childNodes->item(1)->childNodes->item(1)->appendChild($cReviews);
+      $newXML = simplexml_import_dom($xdoc);
+      $output = $newXML->asXml();
+    }
+	
+  if($go == 1) {
+    $item = $xml->Items->Item[0];
+    if ($item && $item->ItemAttributes && $item->ItemAttributes->Title) {
+      $title = $item->ItemAttributes->Title; }
+    else { $title = "[no title]"; };
+    dl("win: $title\n");
+    return $output;
+  }
+  else {
+    if ($xml->Items->Item) {
+      $title = $xml->Items->Item[0]->ItemAttributes->Title;
+      $author = $xml->Items->Item[0]->ItemAttributes->Author;
+      $binding = $xml->Items->Item[0]->ItemAttributes->Binding;
+      $dewey = $xml->Items->Item[0]->ItemAttributes->DeweyDecimalNumber;
+      if($dewey == "")
+	$dewey = "null";
+      $imageURL = $xml->Items->Item[0]->MediumImage->URL;
+      $salesRank = $xml->Items->Item[0]->SalesRank;
+      $pubDate = $xml->Items->Item[0]->ItemAttributes->PublicationDate;
+      if (strlen($pubDate)==4) { $pubDate=$pubDate."-01-01";}
+      if (strlen($pubDate)==7) { $pubDate=$pubDate."-01";}
+      if (strlen($pubDate)==0) {
+	$pubDate="null";
+      }
+      else {
+	$pubDate="\"$pubDate\"";
+      }
+      $publisher = $xml->Items->Item[0]->ItemAttributes->Publisher;
+    }
+    else {
+      $title = $salesRank = "";
+      $dewey = "null";
+    }
+			
+    $genreID = "";
+    $genre = "";		
+    $genArr = array();
+
+    if ($xml->Items->Item[0] && $xml->Items->Item[0]->BrowseNodes) {
+      for($i=0;$i<sizeof($xml->Items->Item->BrowseNodes->BrowseNode);$i++){	
+	//sexy recursive function
+	findGenre($xml->Items->Item->BrowseNodes->BrowseNode[$i], $genreID, $genre);
+				
+	if($genre != "")
+	  $genArr[strval($genreID)] = strval($genre);
+	//$genArr[$i] = array(strval($genreID) => strval($genre));
+
+	//echo $genre;
+	//echo $genreID;
+				
+	$genre = "";
+	$genreID = "";
+      }
+    }
+			
+    $g1 = "null";
+    $g2 = "null";
+    $g3 = "null";
+    $loop = 1;
+			
+    foreach ($genArr as $key => $value) {
+      //echo "$key => $value";
+      if ($key>2047) {
+	//HST added
+	break;
+      }
+      $queryG = "CALL b_addBrowseNode($key,\"$value\")";	//add the name value pair for genre to new table	
+      //echo $queryG;
+      include "../../private/db.php";
+      $resG = mysqli_query($link, $queryG);
+      mysqli_close($link);
+				
+      switch ($loop) {
+      case 1:
+	$g1 = $key;
+	break;
+      case 2:
+	$g2 = $key;
+	break;
+      case 3:
+	$g3 = $key;
+	break;
+      }
+				
+      $loop++;
+    }
+			
+    if($salesRank == "")
+      $salesRank = "null";
+			
+    if($title != "")
+      {
+	include "../../private/db.php";
+	if ($publisher->count()==0) {
+	  $publisher="null";
+	}
+	else {
+	  $publisher=mysqli_real_escape_string($link,$publisher);
+	  if (strlen($publisher)>30) {
+	    $publisher=rtrim(substr($publisher,0,30),"\\");
+	  }
+	  $publisher="\"".$publisher."\"";
+	}
+	if ($author->count()==0) {
+	  $author="unknown";
+	}
+	else {
+	  $author=mysqli_real_escape_string($link,$author);
+	  if (strlen($author)>30) {
+	    $author=rtrim(substr($author,0,30),"\\");
+	  }
+	}
+	$author="\"".$author."\"";
+	$title=mysqli_real_escape_string($link,$title);
+	if (strlen($title)>100) {
+	  $title=rtrim(substr($title,0,100),"\\");
+	}
+	$title="\"".$title."\"";
+	$review1 = mysqli_real_escape_string($link,$review1);
+	if (strlen($review1)>500) { $review1=rtrim(substr($review1,0,500),"\\");}
+	$review2 = mysqli_real_escape_string($link,$review2);
+	if (strlen($review2)>500) { $review2=rtrim(substr($review2,0,500),"\\");}
+	$review3 = mysqli_real_escape_string($link,$review3);
+	if (strlen($review3)>500) { $review3=rtrim(substr($review3,0,500),"\\");}
+			
+	$queryInsert = "CALL b_addNewBook(\"$searchparameterdata\",$title, $author,\"$binding\",\"$imageURL\", $dewey, $salesRank,$pubDate,$publisher,$g1,$g2,$g3,$loc)";	             
+	//echo $queryInsert;
+				
+	$res = mysqli_query($link, $queryInsert);
+	if (!$res) {
+	  $err=mysqli_error( $link );
+	  mysqli_close($link);
+	  dl("anb failed: $queryInsert\n$err\n");
+	  exit($err);
+	}
+	$queryInsertReviews = "CALL b_insertReviews(\"$searchparameterdata\",\"$review1\",\"$review2\",\"$review3\")";
+	if($review1 != "") {
+	  $res = mysqli_query($link, $queryInsertReviews);
+	  if (!$res) {
+	    $err=mysqli_error( $link );
+	    mysqli_close($link);
+	    dl("anr failed: $queryInsertReviews\n");
+	    exit($err);
+	  }
+	}
+	mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop		
+      }
+
+    echo $output;
+  }
+}
+
+function getAmazonDetLocal($go,$language,$loc,
+			   $page,$operation,$searchparameter,
+			   $searchparameterdata,
+			   $show_array,$show_url,$show_xml)
+{
+  global $output;
+  //look up info from db	
+  include "../../private/db.php"; 
+  $query = "CALL b_getBookInfo('$searchparameterdata', $loc)";
+  //echo $query;
+  $res = mysqli_query($link, $query) or exit( mysqli_error( $link ));
+	
+  $output = "";
+  $output .=  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  $output .=  "<Details>";
+  if ( mysqli_num_rows( $res ) > 0 )
+    {
+      $rows=mysqli_fetch_array($res, MYSQLI_ASSOC);
+      mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop						
+      $output .=  "<ASIN>" . $searchparameterdata . "</ASIN>";
+      $output .=  "<Title>" . htmlspecialchars($rows["Title"]) . "</Title>";			
+      $output .=  "<Author>" . htmlspecialchars($rows["Author"]) . "</Author>";
+      $output .=  "<Binding>" . htmlspecialchars($rows["Binding"]) . "</Binding>";
+      $output .=  "<Dewey>" . htmlspecialchars($rows["DeweyDecimal"]) . "</Dewey>";
+      $output .=  "<ImageURL>" . htmlspecialchars($rows["ImageURL"]) . "</ImageURL>";
+      $output .=  "<SalesRank>" . htmlspecialchars($rows["SalesRank"]) . "</SalesRank>";
+      $output .=  "<PublicationDate>" . htmlspecialchars($rows["PublicationDate"]) . "</PublicationDate>";
+      $output .=  "<Publisher>" . htmlspecialchars($rows["Publisher"]) . "</Publisher>";
+      $output .=  "<Genre1>" . htmlspecialchars($rows["Genre1"]) . "</Genre1>";
+      $output .=  "<Genre2>" . htmlspecialchars($rows["Genre2"]) . "</Genre2>";
+      $output .=  "<Genre3>" . htmlspecialchars($rows["Genre3"]) . "</Genre3>";
+      $output .=  "<ProductGroup>Book</ProductGroup>";
+      $output .=  "<Error>AccountLimitExceeded</Error>";
+			
+    }
+  else {
+    mysqli_close($link);	//do not remove. reset is needed otherwise mysqli_fetch_array doesn't work after first loop
+  }
+  $output .=  "</Details>";
+  echo $output;
+}
+
+function findGenre($browseNode, &$ID, &$gen)
+{
+	if($browseNode->Name == "Subjects")
+	{
+		 return true;		 
+	}
+	else
+	{
+		if($browseNode->Ancestors->BrowseNode)
+		{
+			if(findGenre($browseNode->Ancestors->BrowseNode, $ID, $gen) == true)
+			{
+				$gen = $browseNode->Name;
+				$ID = $browseNode->BrowseNodeId;
+			}		
+		}
+		return false;		
+	}
+}
+
+if(!isset($ret))
+{
+	getAmazonDet('default',0,'us');	//will get overwritten
+}
+/*Caught oneSimpleXMLElement Object
+(
+    [OperationRequest] => SimpleXMLElement Object
+        (
+            [RequestId] => d2eaacba-2411-44e7-b268-f23a20167330
+            [Arguments] => SimpleXMLElement Object
+                (
+                    [Argument] => Array
+                        (
+                            [0] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => AWSAccessKeyId
+                                            [Value] => AKIAIHTNWC7L6LOUY4LQ 
+                                        )
+
+                                )
+
+                            [1] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => AssociateTag
+                                            [Value] => bookwhack-21
+                                        )
+
+                                )
+
+                            [2] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => ItemId
+                                            [Value] => B004Q3Q3Y4
+                                        )
+
+                                )
+
+                            [3] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => ItemPage
+                                            [Value] => 1
+                                        )
+
+                                )
+
+                            [4] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => Operation
+                                            [Value] => ItemLookup
+                                        )
+
+                                )
+
+                            [5] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => ResponseGroup
+                                            [Value] => ItemAttributes,Reviews,EditorialReview,OfferSummary,Offers,Images,AlternateVersions,SalesRank,BrowseNodes
+                                        )
+
+                                )
+
+                            [6] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => ReviewSort
+                                            [Value] => -HelpfulVotes
+                                        )
+
+                                )
+
+                            [7] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => Service
+                                            [Value] => AWSECommerceService
+                                        )
+
+                                )
+
+                            [8] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => Timestamp
+                                            [Value] => 2016-12-15T23:12:34Z
+                                        )
+
+                                )
+
+                            [9] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => Version
+                                            [Value] => 2011-08-01
+                                        )
+
+                                )
+
+                            [10] => SimpleXMLElement Object
+                                (
+                                    [@attributes] => Array
+                                        (
+                                            [Name] => Signature
+                                            [Value] => SUXfFZHQ74Joc+WDLx87uzemTdtHijNohykqafJXYKQ=
+                                        )
+
+                                )
+
+                        )
+
+                )
+
+            [RequestProcessingTime] => 0.3518217620000000
+        )
+
+    [Items] => SimpleXMLElement Object
+        (
+            [Request] => SimpleXMLElement Object
+                (
+                    [IsValid] => True
+                    [ItemLookupRequest] => SimpleXMLElement Object
+                        (
+                            [IdType] => ASIN
+                            [ItemId] => B004Q3Q3Y4
+                            [ResponseGroup] => Array
+                                (
+                                    [0] => ItemAttributes
+                                    [1] => Reviews
+                                    [2] => EditorialReview
+                                    [3] => OfferSummary
+                                    [4] => Offers
+                                    [5] => Images
+                                    [6] => AlternateVersions
+                                    [7] => SalesRank
+                                    [8] => BrowseNodes
+                                )
+
+                            [VariationPage] => All
+                        )
+
+                    [Errors] => SimpleXMLElement Object
+                        (
+                            [Error] => SimpleXMLElement Object
+                                (
+                                    [Code] => AWS.InvalidParameterValue
+                                    [Message] => B004Q3Q3Y4 is not a valid value for ItemId. Please change this value and retry your request.
+                                )
+
+                        )
+
+                )
+
+        )
+
+)
+*/
+	/*$xml = new SimpleXMLElement("<?xml version=\"1.0\"?><ItemLookupErrorResponse xmlns=\"http://ecs.amazonaws.com/doc/2009-03-31/\"><Error><Code>AccountLimitExceeded</Code><Message>Account limit of 2056 requests per hour exceeded.</Message></Error><RequestID>290ed059-730c-4789-93b4-6d21e11053d3</RequestID></ItemLookupErrorResponse>");*/
+?>