1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeau 6*04fd306cSNickeauuse ComboStrap\Web\Url; 7*04fd306cSNickeauuse ComboStrap\Web\UrlEndpoint; 8*04fd306cSNickeau 9*04fd306cSNickeau/** 10*04fd306cSNickeau * A request to the application 11*04fd306cSNickeau * It's now a wrapper around {@link \TestRequest} 12*04fd306cSNickeau */ 13*04fd306cSNickeauclass HttpRequest 14*04fd306cSNickeau{ 15*04fd306cSNickeau 16*04fd306cSNickeau const CANONICAL = "httpRequest"; 17*04fd306cSNickeau const POST = "post"; 18*04fd306cSNickeau const GET = "get"; 19*04fd306cSNickeau private bool $withTestRequest = true; 20*04fd306cSNickeau 21*04fd306cSNickeau private Url $url; 22*04fd306cSNickeau private HttpResponse $response; 23*04fd306cSNickeau private string $method = self::GET; 24*04fd306cSNickeau private bool $asAdmin = false; 25*04fd306cSNickeau private array $postData = []; 26*04fd306cSNickeau 27*04fd306cSNickeau 28*04fd306cSNickeau public function __construct(Url $url) 29*04fd306cSNickeau { 30*04fd306cSNickeau $this->url = $url; 31*04fd306cSNickeau 32*04fd306cSNickeau 33*04fd306cSNickeau } 34*04fd306cSNickeau 35*04fd306cSNickeau 36*04fd306cSNickeau /** 37*04fd306cSNickeau * @param string $wikiId 38*04fd306cSNickeau * @return HttpResponse 39*04fd306cSNickeau * With the path uri: '/doku.php' 40*04fd306cSNickeau */ 41*04fd306cSNickeau public static function fetchXhtmlPageResponse(string $wikiId): HttpResponse 42*04fd306cSNickeau { 43*04fd306cSNickeau 44*04fd306cSNickeau 45*04fd306cSNickeau $url = FetcherPage::createPageFetcherFromId($wikiId) 46*04fd306cSNickeau ->getFetchUrl(); 47*04fd306cSNickeau 48*04fd306cSNickeau 49*04fd306cSNickeau return HttpRequest::createRequest($url) 50*04fd306cSNickeau ->withTestRequest() 51*04fd306cSNickeau ->fetch(); 52*04fd306cSNickeau 53*04fd306cSNickeau } 54*04fd306cSNickeau 55*04fd306cSNickeau 56*04fd306cSNickeau private function withTestRequest(): HttpRequest 57*04fd306cSNickeau { 58*04fd306cSNickeau $this->withTestRequest = true; 59*04fd306cSNickeau return $this; 60*04fd306cSNickeau } 61*04fd306cSNickeau 62*04fd306cSNickeau public static function createRequest(Url $url): HttpRequest 63*04fd306cSNickeau { 64*04fd306cSNickeau return new HttpRequest($url); 65*04fd306cSNickeau } 66*04fd306cSNickeau 67*04fd306cSNickeau 68*04fd306cSNickeau /** 69*04fd306cSNickeau * @param array $data - data post body as if it was from a form 70*04fd306cSNickeau * @return $this 71*04fd306cSNickeau */ 72*04fd306cSNickeau public function post(array $data = array()): HttpRequest 73*04fd306cSNickeau { 74*04fd306cSNickeau $this->method = self::POST; 75*04fd306cSNickeau $this->postData = $data; 76*04fd306cSNickeau return $this; 77*04fd306cSNickeau } 78*04fd306cSNickeau 79*04fd306cSNickeau 80*04fd306cSNickeau public function fetch(): HttpResponse 81*04fd306cSNickeau { 82*04fd306cSNickeau if (!$this->withTestRequest) { 83*04fd306cSNickeau 84*04fd306cSNickeau throw new ExceptionRuntime("Real HTTP fetch not yet implemented, only test fetch"); 85*04fd306cSNickeau 86*04fd306cSNickeau } 87*04fd306cSNickeau 88*04fd306cSNickeau if (ExecutionContext::getActualOrCreateFromEnv()->response()->hasEnded()) { 89*04fd306cSNickeau /** 90*04fd306cSNickeau * As of today, the execution context is responsible to 91*04fd306cSNickeau * send back the response 92*04fd306cSNickeau * (There is no routing context, therefore for 93*04fd306cSNickeau * each http request, a new context needs to be created) 94*04fd306cSNickeau */ 95*04fd306cSNickeau throw new ExceptionRuntimeInternal("The execution context has ended, you should reopen another one"); 96*04fd306cSNickeau } 97*04fd306cSNickeau 98*04fd306cSNickeau try { 99*04fd306cSNickeau $path = $this->url->getPath(); 100*04fd306cSNickeau if (!in_array($path, UrlEndpoint::DOKU_ENDPOINTS)) { 101*04fd306cSNickeau throw new ExceptionRuntime("The url path is not a doku endpoint path"); 102*04fd306cSNickeau } 103*04fd306cSNickeau } catch (ExceptionNotFound $e) { 104*04fd306cSNickeau throw new ExceptionRuntime("The path is mandatory"); 105*04fd306cSNickeau } 106*04fd306cSNickeau 107*04fd306cSNickeau $testRequest = new \TestRequest(); 108*04fd306cSNickeau $testRequest->setServer('REQUEST_TIME', time()); 109*04fd306cSNickeau 110*04fd306cSNickeau if ($this->asAdmin) { 111*04fd306cSNickeau Identity::becomeSuperUser($testRequest); 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau switch ($this->method) { 115*04fd306cSNickeau case self::GET: 116*04fd306cSNickeau $query = $this->url->getQueryProperties(); 117*04fd306cSNickeau $response = $testRequest->get($query, $path); 118*04fd306cSNickeau break; 119*04fd306cSNickeau case self::POST: 120*04fd306cSNickeau $query = $this->url->getQueryProperties(); 121*04fd306cSNickeau foreach ($query as $queryKey => $queryValue) { 122*04fd306cSNickeau $testRequest->setGet($queryKey, $queryValue); 123*04fd306cSNickeau } 124*04fd306cSNickeau $response = $testRequest->post($this->postData, $path); 125*04fd306cSNickeau break; 126*04fd306cSNickeau default: 127*04fd306cSNickeau throw new ExceptionRuntime("The method ({$this->method}) is not implemented"); 128*04fd306cSNickeau } 129*04fd306cSNickeau 130*04fd306cSNickeau 131*04fd306cSNickeau return HttpResponse::createFromDokuWikiResponse($response); 132*04fd306cSNickeau } 133*04fd306cSNickeau 134*04fd306cSNickeau public function asAdmin(): HttpRequest 135*04fd306cSNickeau { 136*04fd306cSNickeau $this->asAdmin = true; 137*04fd306cSNickeau return $this; 138*04fd306cSNickeau } 139*04fd306cSNickeau 140*04fd306cSNickeau public function get(): HttpRequest 141*04fd306cSNickeau { 142*04fd306cSNickeau $this->method = self::GET; 143*04fd306cSNickeau return $this; 144*04fd306cSNickeau } 145*04fd306cSNickeau 146*04fd306cSNickeau public function fetchAndExcuteBodyAsHtml(int $waitTimeInSecondToComplete = 0): HttpResponse 147*04fd306cSNickeau { 148*04fd306cSNickeau return $this->fetch()->executeBodyAsHtmlPage($waitTimeInSecondToComplete); 149*04fd306cSNickeau } 150*04fd306cSNickeau 151*04fd306cSNickeau 152*04fd306cSNickeau} 153