From: <sk...@us...> - 2007-11-20 08:51:36
|
Revision: 285 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=285&view=rev Author: sknappe Date: 2007-11-20 00:51:34 -0800 (Tue, 20 Nov 2007) Log Message: ----------- moved ajax version to root folder Added Paths: ----------- trunk/src/dbpedia-navigator/Settings.php trunk/src/dbpedia-navigator/SparqlConnection.php trunk/src/dbpedia-navigator/ajax-loader.gif trunk/src/dbpedia-navigator/ajax.php trunk/src/dbpedia-navigator/ajaxfunctions.php trunk/src/dbpedia-navigator/clearsession.php trunk/src/dbpedia-navigator/index.php trunk/src/dbpedia-navigator/pear/ trunk/src/dbpedia-navigator/pear/HTTP_Request.php trunk/src/dbpedia-navigator/pear/PEAR.php trunk/src/dbpedia-navigator/pear/Socket.php trunk/src/dbpedia-navigator/pear/URL.php trunk/src/dbpedia-navigator/xajax/ trunk/src/dbpedia-navigator/xajax/LICENSE.txt trunk/src/dbpedia-navigator/xajax/README.txt trunk/src/dbpedia-navigator/xajax/copyright.inc.php trunk/src/dbpedia-navigator/xajax/documentation/ trunk/src/dbpedia-navigator/xajax/examples/ trunk/src/dbpedia-navigator/xajax/release_notes.txt trunk/src/dbpedia-navigator/xajax/tests/ trunk/src/dbpedia-navigator/xajax/xajax_controls/ trunk/src/dbpedia-navigator/xajax/xajax_core/ trunk/src/dbpedia-navigator/xajax/xajax_js/ trunk/src/dbpedia-navigator/xajax/xajax_plugins/ Removed Paths: ------------- trunk/src/dbpedia-navigator/Ajax-Test/ trunk/src/dbpedia-navigator/pear/HTTP_Request.php trunk/src/dbpedia-navigator/pear/PEAR.php trunk/src/dbpedia-navigator/pear/Socket.php trunk/src/dbpedia-navigator/pear/URL.php trunk/src/dbpedia-navigator/xajax/LICENSE.txt trunk/src/dbpedia-navigator/xajax/README.txt trunk/src/dbpedia-navigator/xajax/copyright.inc.php trunk/src/dbpedia-navigator/xajax/documentation/ trunk/src/dbpedia-navigator/xajax/examples/ trunk/src/dbpedia-navigator/xajax/release_notes.txt trunk/src/dbpedia-navigator/xajax/tests/ trunk/src/dbpedia-navigator/xajax/xajax_controls/ trunk/src/dbpedia-navigator/xajax/xajax_core/ trunk/src/dbpedia-navigator/xajax/xajax_js/ trunk/src/dbpedia-navigator/xajax/xajax_plugins/ Added: trunk/src/dbpedia-navigator/Settings.php =================================================================== --- trunk/src/dbpedia-navigator/Settings.php (rev 0) +++ trunk/src/dbpedia-navigator/Settings.php 2007-11-20 08:51:34 UTC (rev 285) @@ -0,0 +1,8 @@ +<?php + +class Settings{ + public $wsdluri="http://localhost:8181/services?wsdl"; + public $dbpediauri="http://localhost:8890/sparql"; + public $sparqlttl=60; +} +?> \ No newline at end of file Added: trunk/src/dbpedia-navigator/SparqlConnection.php =================================================================== --- trunk/src/dbpedia-navigator/SparqlConnection.php (rev 0) +++ trunk/src/dbpedia-navigator/SparqlConnection.php 2007-11-20 08:51:34 UTC (rev 285) @@ -0,0 +1,243 @@ +<?php + +class SparqlConnection +{ + private $DBPediaUrl; + private $DLLearnerUri; + private $client; + private $id; + private $ksID; + + function SparqlConnection($DBPediaUrl,$DLLearnerUri,$id=0,$ksID=0) + { + ini_set('default_socket_timeout',200); + $this->DBPediaUrl=$DBPediaUrl; + $this->DLLearnerUri=$DLLearnerUri; + $this->client=new SoapClient("main.wsdl"); + $this->id=$id; + $this->ksID=$ksID; + } + + function getIDs() + { + $id=$this->client->generateID(); + $ksID=$this->client->addKnowledgeSource($id,"sparql",$this->DBPediaUrl); + return array(0 => $id, 1 => $ksID); + } + + function test() + { + $object=$this->client->test($this->id,$this->ksID); + return $object->item; + } + + function getConceptFromExamples($ttl,$posExamples,$negExamples) + { + $this->client->applyConfigEntryInt($this->id, $this->ksID, "numberOfRecursions", 2); + $this->client->applyConfigEntryStringArray($this->id, $this->ksID, "instances", array_merge($posExamples,$negExamples)); + $this->client->applyConfigEntryInt($this->id, $this->ksID, "filterMode", 0); + $this->client->applyConfigEntryStringArray($this->id, $this->ksID, "predList", array()); + $this->client->applyConfigEntryStringArray($this->id, $this->ksID, "objList", array()); + $this->client->applyConfigEntryStringArray($this->id, $this->ksID, "classList", array()); + $this->client->applyConfigEntryString($this->id, $this->ksID, "format", "KB"); + $this->client->applyConfigEntryBoolean($this->id, $this->ksID, "dumpToFile", true); + + $this->client->setReasoner($this->id, "dig"); + $this->client->setLearningProblem($this->id, "posNegDefinition"); + $this->client->setPositiveExamples($this->id, $posExamples); + $this->client->setNegativeExamples($this->id, $negExamples); + $this->client->setLearningAlgorithm($this->id, "refinement"); + + $start = microtime(true); + + $this->client->init($this->id); + + $threaded=true; + + if($threaded == false) { + + $concept = $this->client->learn($this->id); + + } else { + + $this->client->learnThreaded($this->id); + + $i = 1; + $sleeptime = 1; + + do { + // sleep a while + sleep($sleeptime); + + // see what we have learned so far + $concept=$this->client->getCurrentlyBestConcept($this->id); + $running=$this->client->isAlgorithmRunning($this->id); + + $seconds = $i * $sleeptime; + + $i++; + } while($seconds<$ttl&&$running); + + $this->client->stop($this->id); + } + return $concept; + } + + function getTriples($ttl,$individual) + { + $options=array("triples",$individual); + $this->client->startThread($this->id,$this->ksID,$options); + $i = 1; + $sleeptime = 1; + + do { + // sleep a while + sleep($sleeptime); + + // see if algorithm is running + if (!$this->client->isThreadRunning($this->id,$this->ksID,"triples")) + { + $object=$this->client->getFromSparql($this->id,$this->ksID,"triples"); + $array=$object->item; + if (count($array)==1) return $array; + $ret=array(); + foreach ($array as $element) + { + $items=preg_split("[<]",$element,-1, PREG_SPLIT_NO_EMPTY); + $ret[$items[0]]=$items[1]; + } + return $ret; + } + + $seconds = $i * $sleeptime; + $i++; + } while($seconds<$ttl); + + $this->client->stopSparqlThread($this->id,$this->ksID,"triples"); + return array(); + } + + function getSubjects($ttl,$label) + { + $options=array("subjects",$label,15); + $this->client->startThread($this->id,$this->ksID,$options); + $i = 1; + $sleeptime = 1; + + do { + // sleep a while + sleep($sleeptime); + + // see if algorithm is running + if (!$this->client->isThreadRunning($this->id,$this->ksID,"subjects")) + { + $object=$this->client->getFromSparql($this->id,$this->ksID,"subjects"); + return $object->item; + } + + $seconds = $i * $sleeptime; + $i++; + } while($seconds<$ttl); + + $this->client->stopSparqlThread($this->id,$this->ksID,"subjects"); + return array(); + } + + function getSubjectsFromConcept($ttl,$concept) + { + $options=array("conceptSubjects",$concept); + $this->client->startThread($this->id,$this->ksID,$options); + $i = 1; + $sleeptime = 1; + do { + // sleep a while + sleep($sleeptime); + + // see if algorithm is running + if (!$this->client->isThreadRunning($this->id,$this->ksID,"conceptSubjects")) + { + $object=$this->client->getFromSparql($this->id,$this->ksID,"conceptSubjects"); + return $object->item; + } + + $seconds = $i * $sleeptime; + $i++; + } while($seconds<$ttl); + + $this->client->stopSparqlThread($this->id,$this->ksID,"conceptSubjects"); + return array(); + } + + public function loadWSDLfiles($wsdluri){ + $main=SparqlConnection::getwsdl($wsdluri); + $other=SparqlConnection::getOtherWSDL($main); + $newMain=SparqlConnection::changeWSDL($main); + SparqlConnection::writeToFile("main.wsdl",$newMain); + $x=0; + foreach ($other as $o){ + SparqlConnection::writeToFile("def".($x++).".xsd",SparqlConnection::getwsdl($o)); + } + + } + + private function changeWSDL($wsdl){ + $before="<xsd:import schemaLocation=\""; + $after="\" namespace=\""; + $newWSDL=""; + $desca="def"; + $descb=".xsd"; + $x=0; + while($posstart= strpos ( $wsdl, $before )){ + + $posstart+=strlen($before); + $newWSDL.=substr($wsdl,0,$posstart); + $wsdl=substr($wsdl,$posstart); + $newWSDL.=$desca.($x++).$descb; + $posend= strpos ( $wsdl, $after ); + $wsdl=substr($wsdl,$posend); + + } + return $newWSDL.$wsdl; + + } + + private function getOtherWSDL($wsdl){ + $before="<xsd:import schemaLocation=\""; + $after="\" namespace=\""; + $ret=array(); + while($posstart= strpos ( $wsdl, $before )){ + $posstart+=strlen($before); + $wsdl=substr($wsdl,$posstart); + $posend= strpos ( $wsdl, $after ); + $tmp=substr($wsdl,0,$posend); + $ret[]=$tmp; + $wsdl=substr($wsdl,$posend+strlen($after)); + } + return $ret; + } + + + + + private function getwsdl($wsdluri){ + // this is copied from the Pear example + // please don't ask me how it works + $req = &new HTTP_Request($wsdluri); + $message=""; + $req->setMethod(HTTP_REQUEST_METHOD_GET); + $req->sendRequest(); + $ret=$req->getResponseBody(); + return $ret; + } + + + + private function writeToFile($filename,$content){ + + $fp=fopen($filename,"w"); + fwrite($fp,$content); + fclose($fp); + + } +} +?> \ No newline at end of file Copied: trunk/src/dbpedia-navigator/ajax-loader.gif (from rev 283, trunk/src/dbpedia-navigator/Ajax-Test/ajax-loader.gif) =================================================================== (Binary files differ) Copied: trunk/src/dbpedia-navigator/ajax.php (from rev 284, trunk/src/dbpedia-navigator/Ajax-Test/ajax.php) =================================================================== --- trunk/src/dbpedia-navigator/ajax.php (rev 0) +++ trunk/src/dbpedia-navigator/ajax.php 2007-11-20 08:51:34 UTC (rev 285) @@ -0,0 +1,24 @@ +<?php +require_once ("xajax/xajax_core/xajax.inc.php"); +$sid = session_id(); + +$xajax = new xajax("ajaxfunctions.php?sid=$sid"); +$xajax->register(XAJAX_FUNCTION, 'getsubjects', array( + 'onResponseDelay' => 'showLoadingSubjects', + 'beforeResponseProcessing' => 'hideLoadingSubjects' + )); +$xajax->registerFunction('getarticle'); +$xajax->registerFunction('addPositive'); +$xajax->registerFunction('addNegative'); +$xajax->registerFunction('clearPositives'); +$xajax->registerFunction('clearNegatives'); +$xajax->register(XAJAX_FUNCTION, 'learnConcept', array( + 'onResponseDelay' => 'showLoadingConcept', + 'beforeResponseProcessing' => 'hideLoadingConcept' + )); +$xajax->register(XAJAX_FUNCTION, 'getSubjectsFromConcept', array( + 'onResponseDelay' => 'showLoadingConceptSubjects', + 'beforeResponseProcessing' => 'hideLoadingConceptSubjects' + )); +$xajax->registerFunction('searchAndShowArticle'); +?> \ No newline at end of file Copied: trunk/src/dbpedia-navigator/ajaxfunctions.php (from rev 284, trunk/src/dbpedia-navigator/Ajax-Test/ajaxfunctions.php) =================================================================== --- trunk/src/dbpedia-navigator/ajaxfunctions.php (rev 0) +++ trunk/src/dbpedia-navigator/ajaxfunctions.php 2007-11-20 08:51:34 UTC (rev 285) @@ -0,0 +1,222 @@ +<?php +ini_set('max_execution_time',200); +$sid = $_GET['sid']; +session_id($sid); +session_start(); + +require("ajax.php"); +$xajax->processRequest(); + +function getsubjects($label) +{ + require_once("Settings.php"); + require_once("SparqlConnection.php"); + $settings=new Settings(); + $sc=new SparqlConnection($settings->dbpediauri,$settings->wsdluri,$_SESSION['id'],$_SESSION['ksID']); + + $content=""; + $subjects=$sc->getSubjects($settings->sparqlttl,$label); + if (count($subjects)==1) + { + if (strpos($subjects,"[Error]")===0) $content.=substr($subjects,7); + else $content.="<a href=\"\" onclick=\"xajax_getarticle('".$subjects."',-1);return false;\">".str_replace("_"," ",urldecode(substr (strrchr ($subjects, "/"), 1)))."</a><br/>"; + } + else if (count($subjects)==0) $content.="No search result found in time."; + else{ + foreach ($subjects as $subject) + { + $content.="<a href=\"\" onclick=\"xajax_getarticle('".$subject."',-1);return false;\">".str_replace("_"," ",urldecode(substr (strrchr ($subject, "/"), 1)))."</a><br/>"; + } + } + + $objResponse = new xajaxResponse(); + $objResponse->assign("searchcontent", "innerHTML", $content); + return $objResponse; +} + +function getarticle($subject,$fromCache) +{ + if (isset($_SESSION['articles'])) + foreach ($_SESSION['articles'] as $key => $value) + { + if ($value['subject']==$subject){ + $fromCache=$key; + break; + } + } + if ($fromCache==-1) { + require_once("Settings.php"); + require_once("SparqlConnection.php"); + $settings=new Settings(); + $sc=new SparqlConnection($settings->dbpediauri,$settings->wsdluri,$_SESSION['id'],$_SESSION['ksID']); + $triples=$sc->getTriples($settings->sparqlttl,$subject); + $content=""; + if (count($triples)==1) + { + $content.=substr($triples,7); + } + else if (count($triples)==0) $content.="Article not found."; + else { + $content=""; + $content.="<img src=\"".$triples['http://xmlns.com/foaf/0.1/depiction']."\" alt=\"Picture of ".str_replace("_"," ",urldecode(substr (strrchr ($subject, "/"), 1)))."\" width=\"50\"/ style=\"float:left\">"; + $content.="<div>".urldecode($triples['http://dbpedia.org/property/abstract'])."</div>"; + + $contentbuttons="<input type=\"button\" value=\"Positive\" class=\"button\" onclick=\"xajax_addPositive('".$subject."');return false;\" /> <input type=\"button\" value=\"Negative\" class=\"button\" onclick=\"xajax_addNegative('".$subject."');return false;\" />"; + } + + //store article in session, to navigate between last 5 articles quickly + $contentArray=array('content' => $content,'contentbuttons' => $contentbuttons, 'subject' => $subject); + if (!isset($_SESSION['nextArticle'])){ + $_SESSION['nextArticle']=0; + $_SESSION['articles']=array(); + } + if ($_SESSION['nextArticle']==5) $_SESSION['nextArticle']=0; + $_SESSION['articles'][$_SESSION['nextArticle']]=$contentArray; + $_SESSION['currentArticle']=$_SESSION['nextArticle']; + $_SESSION['nextArticle']++; + } + else { + $content=$_SESSION['articles'][$fromCache]['content']; + $contentbuttons=$_SESSION['articles'][$fromCache]['contentbuttons']; + $subject=$_SESSION['articles'][$fromCache]['subject']; + } + + $lastArticles=""; + foreach ($_SESSION['articles'] as $key => $value) + { + $lastArticles.="<a href=\"\" onclick=\"xajax_getarticle('',".$key.");return false;\">".str_replace("_"," ",urldecode(substr (strrchr ($value['subject'], "/"), 1)))."</a><br/>"; + } + + //build the response + $objResponse = new xajaxResponse(); + $objResponse->assign("articlecontent", "innerHTML", $content); + $objResponse->assign("contentbuttons", "innerHTML", $contentbuttons); + $objResponse->assign("ArticleTitle","innerHTML",str_replace("_"," ",urldecode(substr (strrchr ($subject, "/"), 1)))); + $objResponse->assign("lastarticles","innerHTML",$lastArticles); + return $objResponse; +} + +function addPositive($subject) +{ + if (!isset($_SESSION['positive'])){ + $array=array($subject); + $_SESSION['positive']=$array; + } + else{ + $array=$_SESSION['positive']; + $array[]=$subject; + $_SESSION['positive']=$array; + } + + $content=str_replace("_"," ",urldecode(substr (strrchr ($subject, "/"), 1)))."<br/>"; + + $objResponse = new xajaxResponse(); + $objResponse->append("Positives", "innerHTML", $content); + return $objResponse; +} + +function addNegative($subject) +{ + if (!isset($_SESSION['negative'])){ + $array=array($subject); + $_SESSION['negative']=$array; + } + else{ + $array=$_SESSION['negative']; + $array[]=$subject; + $_SESSION['negative']=$array; + } + + $content=str_replace("_"," ",urldecode(substr (strrchr ($subject, "/"), 1)))."<br/>"; + + $objResponse = new xajaxResponse(); + $objResponse->append("Negatives", "innerHTML", $content); + return $objResponse; +} + +function clearPositives() +{ + unset($_SESSION['positive']); + + $objResponse = new xajaxResponse(); + $objResponse->assign("Positives", "innerHTML", ""); + return $objResponse; +} + +function clearNegatives() +{ + unset($_SESSION['negative']); + + $objResponse = new xajaxResponse(); + $objResponse->assign("Negatives", "innerHTML", ""); + return $objResponse; +} + +function learnConcept() +{ + if (isset($_SESSION['positive'])&&isset($_SESSION['negative'])) + { + require_once("Settings.php"); + require_once("SparqlConnection.php"); + $settings=new Settings(); + $sc=new SparqlConnection($settings->dbpediauri,$settings->wsdluri,$_SESSION['id'],$_SESSION['ksID']); + + $concept=$sc->getConceptFromExamples($settings->sparqlttl,$_SESSION['positive'],$_SESSION['negative']); + $_SESSION['lastLearnedConcept']=$concept; + if (strlen(substr (strrchr ($concept, "/"), 1))>0) $concept=urldecode(substr (strrchr ($concept, "/"), 1)); + } + else $concept="You must choose at least one<br/> positive and one negative example."; + + $objResponse = new xajaxResponse(); + $objResponse->assign("conceptcontent", "innerHTML", $concept); + return $objResponse; +} + +function getSubjectsFromConcept() +{ + require_once("Settings.php"); + require_once("SparqlConnection.php"); + $settings=new Settings(); + $sc=new SparqlConnection($settings->dbpediauri,$settings->wsdluri,$_SESSION['id'],$_SESSION['ksID']); + + $content=""; + if (isset($_SESSION['lastLearnedConcept'])) + { + $subjects=$sc->getSubjectsFromConcept($settings->sparqlttl,$_SESSION['lastLearnedConcept']); + if (count($subjects)==1) + { + if (strpos($subjects,"[Error]")===0) $content.=substr($subjects,7); + else $content.="<a href=\"\" onclick=\"xajax_getarticle('".$subjects."');return false;\">".str_replace("_"," ",urldecode(substr (strrchr ($subjects, "/"), 1)))."</a><br/>"; + } + else if (count($subjects)==0) $content.="No examples for concept found in time."; + else { + foreach ($subjects as $subject) + { + $content.="<a href=\"\" onclick=\"xajax_getarticle('".$subject."');return false;\">".str_replace("_"," ",urldecode(substr (strrchr ($subject, "/"), 1)))."</a><br/>"; + } + } + } + else $content.="No concept to get Subjects from."; + + $objResponse = new xajaxResponse(); + $objResponse->assign("conceptsubjectcontent", "innerHTML", $content); + return $objResponse; +} + +function searchAndShowArticle($keyword) +{ + require_once("Settings.php"); + require_once("SparqlConnection.php"); + $settings=new Settings(); + + $sc=new SparqlConnection($settings->dbpediauri,$settings->wsdluri,$_SESSION['id'],$_SESSION['ksID']); + + $content=""; + + $objResponse = new xajaxResponse(); + $objResponse->call('xajax_getarticle', "http://dbpedia.org/resource/".str_replace(" ","_",$keyword),-1); + $objResponse->call('xajax_getsubjects',$keyword); + return $objResponse; +} + +?> \ No newline at end of file Copied: trunk/src/dbpedia-navigator/clearsession.php (from rev 283, trunk/src/dbpedia-navigator/Ajax-Test/clearsession.php) =================================================================== --- trunk/src/dbpedia-navigator/clearsession.php (rev 0) +++ trunk/src/dbpedia-navigator/clearsession.php 2007-11-20 08:51:34 UTC (rev 285) @@ -0,0 +1,12 @@ +<?php +session_start(); + +session_unset(); +ob_start(); +require_once 'pear/HTTP_Request.php'; +require_once 'SparqlConnection.php'; +require_once 'Settings.php'; +$settings=new Settings(); +SparqlConnection::loadWSDLfiles($settings->wsdluri); +header("Location: http://" . $_SERVER["HTTP_HOST"] . "/Ajax-Test/index.php"); +?> \ No newline at end of file Added: trunk/src/dbpedia-navigator/index.php =================================================================== --- trunk/src/dbpedia-navigator/index.php (rev 0) +++ trunk/src/dbpedia-navigator/index.php 2007-11-20 08:51:34 UTC (rev 285) @@ -0,0 +1,140 @@ +<?php +ini_set('error_reporting',E_ALL); +ini_set('max_execution_time',200); +ini_set("soap.wsdl_cache_enabled","1"); +session_start(); +require_once('Settings.php'); +require_once('SparqlConnection.php'); +$settings=new Settings(); +$sc=new SparqlConnection($settings->dbpediauri,$settings->wsdluri); +$ids=$sc->getIDs(); +$_SESSION['id']=$ids[0]; +$_SESSION['ksID']=$ids[1]; + +echo "<a href='clearsession.php'>start from scratch</a>"; + +require("ajax.php"); + +echo '<?xml version="1.0" encoding="UTF-8"?>'; +?> +<html> + <head> + <title>DL Learner</title> + <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> + <link rel="stylesheet" href="default.css"/> + <?php $xajax->printJavascript('xajax/'); ?> + <script type="text/javascript"> + showLoadingSubjects = function() { + xajax.$('loadingSubject').style.display='block'; + xajax.$('searchcontent').style.display = 'none'; + }; + hideLoadingSubjects = function() { + xajax.$('loadingSubject').style.display = 'none'; + xajax.$('searchcontent').style.display='block'; + }; + showLoadingArticle = function() { + xajax.$('loadingArticle').style.display='block'; + xajax.$('articlecontent').style.display = 'none'; + }; + hideLoadingArticle = function() { + xajax.$('loadingArticle').style.display = 'none'; + xajax.$('articlecontent').style.display = 'block'; + }; + showLoadingConcept = function() { + xajax.$('loadingConcept').style.display='block'; + xajax.$('conceptcontent').style.display = 'none'; + }; + hideLoadingConcept = function() { + xajax.$('loadingConcept').style.display = 'none'; + xajax.$('conceptcontent').style.display = 'block'; + }; + showLoadingConceptSubjects = function() { + xajax.$('loadingConceptSubjects').style.display='block'; + xajax.$('conceptsubjectcontent').style.display = 'none'; + }; + hideLoadingConceptSubjects = function() { + xajax.$('loadingConceptSubjects').style.display = 'none'; + xajax.$('conceptsubjectcontent').style.display = 'block'; + } + </script> + </head> + <body> +<h3>DBPedia-Navigator-Test</h3> +<div id="layer" style="display:none"><div id="layerContent" style="display:none"></div></div> +<div id="wrapper"> +<div id="leftSidebar"> + +<div class="box"> + <div class="boxtitle">Search</div> + <div class="boxcontent" id="search"> + Search:<br/> + <input type="textfield" name="label" id="label"><br/> + <input type="button" value="Article" class="button" onclick="xajax_searchAndShowArticle(document.getElementById('label').value);return false;" /> <input type="button" value="Fulltext" class="button" onclick=""/> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<div class="box"> + <div class="boxtitle">Searchresults</div> + <div class="boxcontent"> + <div id="searchcontent" style="display:block"></div> + <div id="loadingSubject" style="display:none"><img src="ajax-loader.gif" alt="Loading..."/></div> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<div class="box" id="concept"> + <div class="boxtitlewithbutton"><table border="0" class="titletable"><tr><td class="left">Learned Concept</td><td class="right"><input type="button" value="Learn" class="button" onclick="xajax_learnConcept();return false;" /></td></tr></table></div> + <div class="boxcontent"> + <div id="conceptcontent" style="display:none"></div> + <div id="loadingConcept" style="display:none"><img src="ajax-loader.gif" alt="Loading..."/></div> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<div class="box" id="conceptSubjects"> + <div class="boxtitlewithbutton"><table border="0" class="titletable"><tr><td class="left">Subjects From Concept</td><td class="right"><input type="button" value="Show" class="button" onclick="xajax_getSubjectsFromConcept();return false;" /></td></tr></table></div> + <div class="boxcontent"> + <div id="conceptsubjectcontent" style="display:none"></div> + <div id="loadingConceptSubjects" style="display:none"><img src="ajax-loader.gif" alt="Loading..."/></div> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> +</div><!-- END leftSidebar --> + +<div id="content"> +<div class="box"> + <div class="boxtitlewithbutton"><table border="0" class="titletable"><tr><td class="left" id="ArticleTitle">Article</td><td class="right"><span id="contentbuttons"></span></td></tr></table></div> + <div class="boxcontent" id="article"> + <div id="articlecontent" style="display:block"></div> + <div id="loadingArticle" style="display:none"><img src="ajax-loader.gif" alt="Loading..."/></div> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> +</div><!-- content --> +<div id="rightSidebar"> + +<div class="box"> + <div class="boxtitlewithbutton"><table border="0" class="titletable"><tr><td class="left">Positives</td><td class="right"><input type="button" value="Clear" class="button" onclick="xajax_clearPositives();return false;" /></td></tr></table></div> + <div class="boxcontent" id="Positives"> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<div class="box"> + <div class="boxtitlewithbutton"><table border="0" class="titletable"><tr><td class="left">Negatives</td><td class="right"><input type="button" value="Clear" class="button" onclick="xajax_clearNegatives();return false;" /></td></tr></table></div> + <div class="boxcontent" id="Negatives"> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<div class="box"> + <div class="boxtitle">Last Articles</div> + <div class="boxcontent" id="lastarticles"> + </div> <!-- boxcontent --> +</div> <!-- box --> + +<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> +</div><!-- rightSidebar --> +<div id="clear"></div> +</div> + </body> +</html> + \ No newline at end of file Copied: trunk/src/dbpedia-navigator/pear (from rev 283, trunk/src/dbpedia-navigator/Ajax-Test/pear) Deleted: trunk/src/dbpedia-navigator/pear/HTTP_Request.php =================================================================== --- trunk/src/dbpedia-navigator/Ajax-Test/pear/HTTP_Request.php 2007-11-12 15:19:23 UTC (rev 283) +++ trunk/src/dbpedia-navigator/pear/HTTP_Request.php 2007-11-20 08:51:34 UTC (rev 285) @@ -1,2760 +0,0 @@ -<?php - -// +-----------------------------------------------------------------------+ -// | Copyright (c) 2002-2003, Richard Heyes | -// | All rights reserved. | -// | | -// | Redistribution and use in source and binary forms, with or without | -// | modification, are permitted provided that the following conditions | -// | are met: | -// | | -// | o Redistributions of source code must retain the above copyright | -// | notice, this list of conditions and the following disclaimer. | -// | o Redistributions in binary form must reproduce the above copyright | -// | notice, this list of conditions and the following disclaimer in the | -// | documentation and/or other materials provided with the distribution.| -// | o The names of the authors may not be used to endorse or promote | -// | products derived from this software without specific prior written | -// | permission. | -// | | -// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | -// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | -// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | -// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | - -// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | - -// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | - -// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | - -// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | - -// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | - -// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | - -// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | - -// | | - -// +-----------------------------------------------------------------------+ - -// | Author: Richard Heyes <ri...@ph...> | - -// +-----------------------------------------------------------------------+ - -/* -// $Id: Request.php,v 1.1 2006/12/12 16:42:26 punkrock Exp $ -// -// HTTP_Request Class -// -// Simple example, (Fetches yahoo.com and displays it): -// -// $a = &new HTTP_Request('http://localhost:8081'); -// $a->sendRequest(); -// echo $a->getResponseBody(); -*/ - - - -require_once 'PEAR.php'; - -require_once 'Socket.php'; - -require_once 'URL.php'; - - - -define('HTTP_REQUEST_METHOD_GET', 'GET', true); - -define('HTTP_REQUEST_METHOD_HEAD', 'HEAD', true); - -define('HTTP_REQUEST_METHOD_POST', 'POST', true); - -define('HTTP_REQUEST_METHOD_PUT', 'PUT', true); - -define('HTTP_REQUEST_METHOD_DELETE', 'DELETE', true); - -define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); - -define('HTTP_REQUEST_METHOD_TRACE', 'TRACE', true); - - - -define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); - -define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); - - - -class HTTP_Request { - - - - /** - - * Instance of Net_URL - - * @var object Net_URL - - */ - - var $_url; - - - - /** - - * Type of request - - * @var string - - */ - - var $_method; - - - - /** - - * HTTP Version - - * @var string - - */ - - var $_http; - - - - /** - - * Request headers - - * @var array - - */ - - var $_requestHeaders; - - - - /** - - * Basic Auth Username - - * @var string - - */ - - var $_user; - - - - /** - - * Basic Auth Password - - * @var string - - */ - - var $_pass; - - - - /** - - * Socket object - - * @var object Net_Socket - - */ - - var $_sock; - - - - /** - - * Proxy server - - * @var string - - */ - - var $_proxy_host; - - - - /** - - * Proxy port - - * @var integer - - */ - - var $_proxy_port; - - - - /** - - * Proxy username - - * @var string - - */ - - var $_proxy_user; - - - - /** - - * Proxy password - - * @var string - - */ - - var $_proxy_pass; - - - - /** - - * Post data - - * @var array - - */ - - var $_postData; - - - - /** - - * Request body - - * @var string - - */ - - var $_body; - - - - /** - - * A list of methods that MUST NOT have a request body, per RFC 2616 - - * @var array - - */ - - var $_bodyDisallowed = array('TRACE'); - - - - /** - - * Files to post - - * @var array - - */ - - var $_postFiles = array(); - - - - /** - - * Connection timeout. - - * @var float - - */ - - var $_timeout; - - - - /** - - * HTTP_Response object - - * @var object HTTP_Response - - */ - - var $_response; - - - - /** - - * Whether to allow redirects - - * @var boolean - - */ - - var $_allowRedirects; - - - - /** - - * Maximum redirects allowed - - * @var integer - - */ - - var $_maxRedirects; - - - - /** - - * Current number of redirects - - * @var integer - - */ - - var $_redirects; - - - - /** - - * Whether to append brackets [] to array variables - - * @var bool - - */ - - var $_useBrackets = true; - - - - /** - - * Attached listeners - - * @var array - - */ - - var $_listeners = array(); - - - - /** - - * Whether to save response body in response object property - - * @var bool - - */ - - var $_saveBody = true; - - - - /** - - * Timeout for reading from socket (array(seconds, microseconds)) - - * @var array - - */ - - var $_readTimeout = null; - - - - /** - - * Options to pass to Net_Socket::connect. See stream_context_create - - * @var array - - */ - - var $_socketOptions = null; - - - - /** - - * Constructor - - * - - * Sets up the object - - * @param string The url to fetch/access - - * @param array Associative array of parameters which can have the following keys: - - * <ul> - - * <li>method - Method to use, GET, POST etc (string)</li> - - * <li>http - HTTP Version to use, 1.0 or 1.1 (string)</li> - - * <li>user - Basic Auth username (string)</li> - - * <li>pass - Basic Auth password (string)</li> - - * <li>proxy_host - Proxy server host (string)</li> - - * <li>proxy_port - Proxy server port (integer)</li> - - * <li>proxy_user - Proxy auth username (string)</li> - - * <li>proxy_pass - Proxy auth password (string)</li> - - * <li>timeout - Connection timeout in seconds (float)</li> - - * <li>allowRedirects - Whether to follow redirects or not (bool)</li> - - * <li>maxRedirects - Max number of redirects to follow (integer)</li> - - * <li>useBrackets - Whether to append [] to array variable names (bool)</li> - - * <li>saveBody - Whether to save response body in response object property (bool)</li> - - * <li>readTimeout - Timeout for reading / writing data over the socket (array (seconds, microseconds))</li> - - * <li>socketOptions - Options to pass to Net_Socket object (array)</li> - - * </ul> - - * @access public - - */ - - function HTTP_Request($url = '', $params = array()) - - { - - $this->_method = HTTP_REQUEST_METHOD_GET; - - $this->_http = HTTP_REQUEST_HTTP_VER_1_1; - - $this->_requestHeaders = array(); - - $this->_postData = array(); - - $this->_body = null; - - - - $this->_user = null; - - $this->_pass = null; - - - - $this->_proxy_host = null; - - $this->_proxy_port = null; - - $this->_proxy_user = null; - - $this->_proxy_pass = null; - - - - $this->_allowRedirects = false; - - $this->_maxRedirects = 3; - - $this->_redirects = 0; - - - - $this->_timeout = null; - - $this->_response = null; - - - - foreach ($params as $key => $value) { - - $this->{'_' . $key} = $value; - - } - - - - if (!empty($url)) { - - $this->setURL($url); - - } - - - - // Default useragent - - $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); - - - - // We don't do keep-alives by default - - $this->addHeader('Connection', 'close'); - - - - // Basic authentication - - if (!empty($this->_user)) { - - $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); - - } - - - - // Proxy authentication (see bug #5913) - - if (!empty($this->_proxy_user)) { - - $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass)); - - } - - - - // Use gzip encoding if possible - - // Avoid gzip encoding if using multibyte functions (see #1781) - - if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib') && - - 0 == (2 & ini_get('mbstring.func_overload'))) { - - - - $this->addHeader('Accept-Encoding', 'gzip'); - - } - - } - - - - /** - - * Generates a Host header for HTTP/1.1 requests - - * - - * @access private - - * @return string - - */ - - function _generateHostHeader() - - { - - if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { - - $host = $this->_url->host . ':' . $this->_url->port; - - - - } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { - - $host = $this->_url->host . ':' . $this->_url->port; - - - - } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { - - $host = $this->_url->host . ':' . $this->_url->port; - - - - } else { - - $host = $this->_url->host; - - } - - - - return $host; - - } - - - - /** - - * Resets the object to its initial state (DEPRECATED). - - * Takes the same parameters as the constructor. - - * - - * @param string $url The url to be requested - - * @param array $params Associative array of parameters - - * (see constructor for details) - - * @access public - - * @deprecated deprecated since 1.2, call the constructor if this is necessary - - */ - - function reset($url, $params = array()) - - { - - $this->HTTP_Request($url, $params); - - } - - - - /** - - * Sets the URL to be requested - - * - - * @param string The url to be requested - - * @access public - - */ - - function setURL($url) - - { - - $this->_url = &new Net_URL($url, $this->_useBrackets); - - - - if (!empty($this->_url->user) || !empty($this->_url->pass)) { - - $this->setBasicAuth($this->_url->user, $this->_url->pass); - - } - - - - if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { - - $this->addHeader('Host', $this->_generateHostHeader()); - - } - - - - // set '/' instead of empty path rather than check later (see bug #8662) - - if (empty($this->_url->path)) { - - $this->_url->path = '/'; - - } - - } - - - - /** - - * Returns the current request URL - - * - - * @return string Current request URL - - * @access public - - */ - - function getUrl($url) - - { - - return empty($this->_url)? '': $this->_url->getUrl(); - - } - - - - /** - - * Sets a proxy to be used - - * - - * @param string Proxy host - - * @param int Proxy port - - * @param string Proxy username - - * @param string Proxy password - - * @access public - - */ - - function setProxy($host, $port = 8080, $user = null, $pass = null) - - { - - $this->_proxy_host = $host; - - $this->_proxy_port = $port; - - $this->_proxy_user = $user; - - $this->_proxy_pass = $pass; - - - - if (!empty($user)) { - - $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); - - } - - } - - - - /** - - * Sets basic authentication parameters - - * - - * @param string Username - - * @param string Password - - */ - - function setBasicAuth($user, $pass) - - { - - $this->_user = $user; - - $this->_pass = $pass; - - - - $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); - - } - - - - /** - - * Sets the method to be used, GET, POST etc. - - * - - * @param string Method to use. Use the defined constants for this - - * @access public - - */ - - function setMethod($method) - - { - - $this->_method = $method; - - } - - - - /** - - * Sets the HTTP version to use, 1.0 or 1.1 - - * - - * @param string Version to use. Use the defined constants for this - - * @access public - - */ - - function setHttpVer($http) - - { - - $this->_http = $http; - - } - - - - /** - - * Adds a request header - - * - - * @param string Header name - - * @param string Header value - - * @access public - - */ - - function addHeader($name, $value) - - { - - $this->_requestHeaders[strtolower($name)] = $value; - - } - - - - /** - - * Removes a request header - - * - - * @param string Header name to remove - - * @access public - - */ - - function removeHeader($name) - - { - - if (isset($this->_requestHeaders[strtolower($name)])) { - - unset($this->_requestHeaders[strtolower($name)]); - - } - - } - - - - /** - - * Adds a querystring parameter - - * - - * @param string Querystring parameter name - - * @param string Querystring parameter value - - * @param bool Whether the value is already urlencoded or not, default = not - - * @access public - - */ - - function addQueryString($name, $value, $preencoded = false) - - { - - $this->_url->addQueryString($name, $value, $preencoded); - - } - - - - /** - - * Sets the querystring to literally what you supply - - * - - * @param string The querystring data. Should be of the format foo=bar&x=y etc - - * @param bool Whether data is already urlencoded or not, default = already encoded - - * @access public - - */ - - function addRawQueryString($querystring, $preencoded = true) - - { - - $this->_url->addRawQueryString($querystring, $preencoded); - - } - - - - /** - - * Adds postdata items - - * - - * @param string Post data name - - * @param string Post data value - - * @param bool Whether data is already urlencoded or not, default = not - - * @access public - - */ - - function addPostData($name, $value, $preencoded = false) - - { - - if ($preencoded) { - - $this->_postData[$name] = $value; - - } else { - - $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); - - } - - } - - - - /** - - * Recursively applies the callback function to the value - - * - - * @param mixed Callback function - - * @param mixed Value to process - - * @access private - - * @return mixed Processed value - - */ - - function _arrayMapRecursive($callback, $value) - - { - - if (!is_array($value)) { - - return call_user_func($callback, $value); - - } else { - - $map = array(); - - foreach ($value as $k => $v) { - - $map[$k] = $this->_arrayMapRecursive($callback, $v); - - } - - return $map; - - } - - } - - - - /** - - * Adds a file to upload - - * - - * This also changes content-type to 'multipart/form-data' for proper upload - - * - - * @access public - - * @param string name of file-upload field - - * @param mixed file name(s) - - * @param mixed content-type(s) of file(s) being uploaded - - * @return bool true on success - - * @throws PEAR_Error - - */ - - function addFile($inputName, $fileName, $contentType = 'application/octet-stream') - - { - - if (!is_array($fileName) && !is_readable($fileName)) { - - return PEAR::raiseError("File '{$fileName}' is not readable"); - - } elseif (is_array($fileName)) { - - foreach ($fileName as $name) { - - if (!is_readable($name)) { - - return PEAR::raiseError("File '{$name}' is not readable"); - - } - - } - - } - - $this->addHeader('Content-Type', 'multipart/form-data'); - - $this->_postFiles[$inputName] = array( - - 'name' => $fileName, - - 'type' => $contentType - - ); - - return true; - - } - - - - /** - - * Adds raw postdata (DEPRECATED) - - * - - * @param string The data - - * @param bool Whether data is preencoded or not, default = already encoded - - * @access public - - * @deprecated deprecated since 1.3.0, method setBody() should be used instead - - */ - - function addRawPostData($postdata, $preencoded = true) - - { - - $this->_body = $preencoded ? $postdata : urlencode($postdata); - - } - - - - /** - - * Sets the request body (for POST, PUT and similar requests) - - * - - * @param string Request body - - * @access public - - */ - - function setBody($body) - - { - - $this->_body = $body; - - } - - - - /** - - * Clears any postdata that has been added (DEPRECATED). - - * - - * Useful for multiple request scenarios. - - * - - * @access public - - * @deprecated deprecated since 1.2 - - */ - - function clearPostData() - - { - - $this->_postData = null; - - } - - - - /** - - * Appends a cookie to "Cookie:" header - - * - - * @param string $name cookie name - - * @param string $value cookie value - - * @access public - - */ - - function addCookie($name, $value) - - { - - $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; - - $this->addHeader('Cookie', $cookies . $name . '=' . $value); - - } - - - - /** - - * Clears any cookies that have been added (DEPRECATED). - - * - - * Useful for multiple request scenarios - - * - - * @access public - - * @deprecated deprecated since 1.2 - - */ - - function clearCookies() - - { - - $this->removeHeader('Cookie'); - - } - - - - /** - - * Sends the request - - * - - * @access public - - * @param bool Whether to store response body in Response object property, - - * set this to false if downloading a LARGE file and using a Listener - - * @return mixed PEAR error on error, true otherwise - - */ - - function sendRequest($saveBody = true){ - - if (!is_a($this->_url, 'Net_URL')) { - - return PEAR::raiseError('No URL given.'); - - } - - - - $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; - - $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; - - - - // 4.3.0 supports SSL connections using OpenSSL. The function test determines - - // we running on at least 4.3.0 - - if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { - - if (isset($this->_proxy_host)) { - - return PEAR::raiseError('HTTPS proxies are not supported.'); - - } - - $host = 'ssl://' . $host; - - } - - - - // magic quotes may fuck up file uploads and chunked response processing - - $magicQuotes = ini_get('magic_quotes_runtime'); - - ini_set('magic_quotes_runtime', false); - - - - // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive - - // connection token to a proxy server... - - if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && - - 'Keep-Alive' == $this->_requestHeaders['connection']) - - { - - $this->removeHeader('connection'); - - } - - - - $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) || - - (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']); - - $sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets'); - - $sockKey = $host . ':' . $port; - - unset($this->_sock); - - - - // There is a connected socket in the "static" property? - - if ($keepAlive && !empty($sockets[$sockKey]) && - - !empty($sockets[$sockKey]->fp)) - - { - - $this->_sock =& $sockets[$sockKey]; - - $err = null; - - } else { - - $this->_notify('connect'); - - $this->_sock =& new Net_Socket(); - - $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); - - } - - PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); - - - - if (!PEAR::isError($err)) { - - if (!empty($this->_readTimeout)) { - - $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); - - } - - - - $this->_notify('sentRequest'); - - - - // Read the response - - $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); - - $err = $this->_response->process( - - $this->_saveBody && $saveBody, - - HTTP_REQUEST_METHOD_HEAD != $this->_method - - ); - - - - if ($keepAlive) { - - $keepAlive = (isset($this->_response->_headers['content-length']) - - || (isset($this->_response->_headers['transfer-encoding']) - - && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked')); - - if ($keepAlive) { - - if (isset($this->_response->_headers['connection'])) { - - $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive'; - - } else { - - $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol; - - } - - } - - } - - } - - - - ini_set('magic_quotes_runtime', $magicQuotes); - - - - if (PEAR::isError($err)) { - - return $err; - - } - - - - if (!$keepAlive) { - - $this->disconnect(); - - // Store the connected socket in "static" property - - } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) { - - $sockets[$sockKey] =& $this->_sock; - - } - - - - // Check for redirection - - if ( $this->_allowRedirects - - AND $this->_redirects <= $this->_maxRedirects - - AND $this->getResponseCode() > 300 - - AND $this->getResponseCode() < 399 - - AND !empty($this->_response->_headers['location'])) { - - - - - - $redirect = $this->_response->_headers['location']; - - - - // Absolute URL - - if (preg_match('/^https?:\/\//i', $redirect)) { - - $this->_url = &new Net_URL($redirect); - - $this->addHeader('Host', $this->_generateHostHeader()); - - // Absolute path - - } elseif ($redirect{0} == '/') { - - $this->_url->path = $redirect; - - - - // Relative path - - } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { - - if (substr($this->_url->path, -1) == '/') { - - $redirect = $this->_url->path . $redirect; - - } else { - - $redirect = dirname($this->_url->path) . '/' . $redirect; - - } - - $redirect = Net_URL::resolvePath($redirect); - - $this->_url->path = $redirect; - - - - // Filename, no path - - } else { - - if (substr($this->_url->path, -1) == '/') { - - $redirect = $this->_url->path . $redirect; - - } else { - - $redirect = dirname($this->_url->path) . '/' . $redirect; - - } - - $this->_url->path = $redirect; - - } - - - - $this->_redirects++; - - return $this->sendRequest($saveBody); - - - - // Too many redirects - - } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { - - return PEAR::raiseError('Too many redirects'); - - } - - - - return true; - - } - - - - /** - - * Disconnect the socket, if connected. Only useful if using Keep-Alive. - - * - - * @access public - - */ - - function disconnect() - - { - - if (!empty($this->_sock) && !empty($this->_sock->fp)) { - - $this->_notify('disconnect'); - - $this->_sock->disconnect(); - - } - - } - - - - /** - - * Returns the response code - - * - - * @access public - - * @return mixed Response code, false if not set - - */ - - function getResponseCode() - - { - - return isset($this->_response->_code) ? $this->_response->_code : false; - - } - - - - /** - - * Returns either the named header or all if no name given - - * - - * @access public - - * @param string The header name to return, do not set to get all headers - - * @return mixed either the value of $headername (false if header is not present) - - * or an array of all headers - - */ - - function getResponseHeader($headername = null) - - { - - if (!isset($headername)) { - - return isset($this->_response->_headers)? $this->_response->_headers: array(); - - } else { - - $headername = strtolower($headername); - - return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; - - } - - } - - - - /** - - * Returns the body of the response - - * - - * @access public - - * @return mixed response body, false if not set - - */ - - function getResponseBody() - - { - - return isset($this->_response->_body) ? $this->_response->_body : false; - - } - - - - /** - - * Returns cookies set in response - - * - - * @access public - - * @return mixed array of response cookies, false if none are present - - */ - - function getResponseCookies() - - { - - return isset($this->_response->_cookies) ? $this->_response->_cookies : false; - - } - - - - /** - - * Builds the request string - - * - - * @access private - - * @return string The request string - - */ - - function _buildRequest() - - { - - $separator = ini_get('arg_separator.output'); - - ini_set('arg_separator.output', '&'); - - $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; - - ini_set('arg_separator.output', $separator); - - - - $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; - - $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; - - $path = $this->_url->path . $querystring; - - $url = $host . $port . $path; - - - - $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; - - - - if (in_array($this->_method, $this->_bodyDisallowed) || - - (empty($this->_body) && (HTTP_REQUEST_METHOD_POST != $this->_method || - - (empty($this->_postData) && empty($this->_postFiles))))) - - { - - $this->removeHeader('Content-Type'); - - } else { - - if (empty($this->_requestHeaders['content-type'])) { - - // Add default content-type - - $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); - - } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { - - $boundary = 'HTTP_Request_' . md5(uniqid('request') . microtime()); - - $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); - - } - - } - - - - // Request Headers - - if (!empty($this->_requestHeaders)) { - - foreach ($this->_requestHeaders as $name => $value) { - - $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); - - $request .= $canonicalName . ': ' . $value . "\r\n"; - - } - - } - - - - // No post data or wrong method, so simply add a final CRLF - - if (in_array($this->_method, $this->_bodyDisallowed) || - - (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_body))) { - - - - $request .= "\r\n"; - - - - // Post data if it's an array - - } elseif (HTTP_REQUEST_METHOD_POST == $this->_method && - - (!empty($this->_postData) || !empty($this->_postFiles))) { - - - - // "normal" POST request - - if (!isset($boundary)) { - - $postdata = implode('&', array_map( - - create_function('$a', 'return $a[0] . \'=\' . $a[1];'), - - $this->_flattenArray('', $this->_postData) - - )); - - - - // multipart request, probably with file uploads - - } else { - - $postdata = ''; - - if (!empty($this->_postData)) { - - $flatData = $this->_flattenArray('', $this->_postData); - - foreach ($flatData as $item) { - - $postdata .= '--' . $boundary . "\r\n"; - - $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; - - $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; - - } - - } - - foreach ($this->_postFiles as $name => $value) { - - if (is_array($value['name'])) { - - $varname = $name . ($this->_useBrackets? '[]': ''); - - } else { - - $varname = $name; - - $value['name'] = array($value['name']); - - } - - foreach ($value['name'] as $key => $filename) { - - $fp = fopen($filename, 'r'); - - $data = fread($fp, filesize($filename)); - - fclose($fp); - - $basename = basename($filename); - - $type = is_array($value['type'])? @$value['type'][$key]: $value['type']; - - - - $postdata .= '--' . $boundary . "\r\n"; - - $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; - - $postdata .= "\r\nContent-Type: " . $type; - - $postdata .= "\r\n\r\n" . $data . "\r\n"; - - } - - } - - $postdata .= '--' . $boundary . "--\r\n"; - - } - - $request .= 'Content-Length: ' . strlen($postdata) . "\r\n\r\n"; - - $request .= $postdata; - - - - // Explicitly set request body - - } elseif (!empty($this->_body)) { - - - - $request .= 'Content-Length: ' . strlen($this->_body) . "\r\n\r\n"; - - $request .= $this->_body; - - } - - - - return $request; - - } - - - - /** - - * Helper function to change the (probably multidimensional) associative array - - * into the simple one. - - * - - * @param string name for item - - * @param mixed item's values - - * @return array array with the following items: array('item name', 'item value'); - - */ - - function _flattenArray($name, $values) - - { - - if (!is_array($values)) { - - return array(array($name, $values)); - - } else { - - $ret = array(); - - foreach ($values as $k => $v) { - - if (empty($name)) { - - $newName = $k; - - } elseif ($this->_useBrackets) { - - $newName = $name . '[' . $k . ']'; - - } else { - - $newName = $name; - - } - - $ret = array_merge($ret, $this->_flattenArray($newName, $v)); - - } - - return $ret; - - } - - } - - - - - - /** - - * Adds a Listener to the list of listeners that are notified of - - * the object's events - - * - - * @param object HTTP_Request_Listener instance to attach - - * @return boolean whether the listener was successfully attached - - * @access public - - */ - - function attach(&$listener) - - { - - ... [truncated message content] |