xref: /plugin/combo/ComboStrap/HttpRequest.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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