Skip to content

Commit 1a8f1ce

Browse files
committed
group url components into Url class
1 parent fedb73a commit 1a8f1ce

File tree

8 files changed

+114
-69
lines changed

8 files changed

+114
-69
lines changed

lib/Client/HttpClient.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
namespace DevNet\Http\Client;
1010

11-
use DevNet\Http\Message\Headers;
1211
use DevNet\Http\Message\HttpRequest;
1312
use DevNet\System\Async\Task;
1413
use DevNet\System\PropertyTrait;
@@ -39,14 +38,16 @@ public function requestAsync(string $method, string $url, ?HttpRequestContent $r
3938
$url = $this->Options->BaseAddress . $url;
4039
}
4140

42-
$host = parse_url($url, PHP_URL_HOST);
43-
$headers = new Headers(['host' => $host]);
44-
$request = new HttpRequest($method, $url, $headers);
41+
$scheme = parse_url($url, PHP_URL_SCHEME);
42+
if (!$scheme) {
43+
$url = "http://" . $url;
44+
}
4545

46+
$request = new HttpRequest($method, $url);
4647
$request->setProtocol($this->Options->HttpVersion);
4748
if ($requestContent) {
48-
$request->Headers->add('content-type', $requestContent->ContentType);
49-
$request->Headers->add('content-length', $requestContent->ContentLength);
49+
$request->Headers->add('Content-Type', $requestContent->ContentType);
50+
$request->Headers->add('Content-Length', $requestContent->ContentLength);
5051
$request->Body->write($requestContent->Content);
5152
}
5253

lib/Client/HttpClientHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function send(HttpRequest $request): HttpResponse
3232
public function sendAsync(HttpRequest $request): Task
3333
{
3434
$sendAsync = async(function ($request) {
35-
$socket = new Socket($request->Host->Name, $request->Host->Port, $this->Options->Timeout);
35+
$socket = new Socket($request->Url->Host->Name, $request->Url->Host->Port, $this->Options->Timeout);
3636
$socket->write(HttpRequestRawBuilder::build($request));
3737
$responseHeaderRaw = '';
3838
do {

lib/Client/Internal/HttpRequestRawBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static function build(HttpRequest $request): string
1818
$requestRaw = new StringBuilder();
1919
$requestRaw->append($request->Method);
2020
$requestRaw->append(' ');
21-
$requestRaw->append($request->Path);
21+
$requestRaw->append($request->Url->Path);
2222
$requestRaw->append(' ');
2323
$requestRaw->append($request->Protocol);
2424
$requestRaw->append("\r\n");

lib/Message/Host.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ class Host
1515
use PropertyTrait;
1616

1717
private string $name;
18-
private ?int $port;
18+
private int $port;
1919

20-
public function __construct(?string $name = null, ?int $port = null)
20+
public function __construct(string $name, int $port)
2121
{
22-
$this->name = (string) $name;
22+
$this->name = $name;
2323
$this->port = $port;
2424
}
2525

@@ -35,7 +35,10 @@ public function get_Port(): ?int
3535

3636
public function __toString(): string
3737
{
38-
$host = $this->port ? $this->name . ':' . $this->port : $this->host;
39-
return $host;
38+
if ($this->port == 0 || $this->port == 80 || $this->port == 443) {
39+
return $this->name;
40+
}
41+
42+
return $this->name . ':' . $this->port;
4043
}
4144
}

lib/Message/HttpContextFactory.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ public static function createRequest(): HttpRequest
2525
{
2626
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
2727

28-
$uri = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';
29-
$uri .= isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
30-
$uri .= isset($_SERVER['REQUEST_URI']) && !empty($_SERVER['REQUEST_URI']) ? strstr($_SERVER['REQUEST_URI'] . '?', '?', true) : '/';
31-
$uri .= isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : null;
28+
$url = isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';
29+
$url .= isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
30+
$url .= isset($_SERVER['REQUEST_URI']) && !empty($_SERVER['REQUEST_URI']) ? strstr($_SERVER['REQUEST_URI'] . '?', '?', true) : '/';
31+
$url .= isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : null;
3232

3333
try {
3434
$headers = getallheaders();
@@ -60,7 +60,7 @@ public static function createRequest(): HttpRequest
6060
$headers = new Headers($headers);
6161
$body = new FileStream('php://input', FileMode::Open, FileAccess::Read);
6262
$form = new Form($_POST, $fileCollection);
63-
$request = new HttpRequest($method, $uri, $headers, $body, $form);
63+
$request = new HttpRequest($method, $url, $headers, $body, $form);
6464

6565
if (isset($_SERVER['SERVER_PROTOCOL'])) {
6666
$request->setProtocol($_SERVER['SERVER_PROTOCOL']);

lib/Message/HttpException.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
namespace DevNet\Http\Message;
1010

11-
use Exception;
11+
use DevNet\System\Exceptions\SystemException;
1212

13-
class HttpException extends Exception
13+
class HttpException extends SystemException
1414
{
1515
}

lib/Message/HttpRequest.php

Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,74 +16,32 @@
1616
class HttpRequest extends HttpMessage
1717
{
1818
private string $method;
19-
private string $scheme;
20-
private Host $host;
21-
private string $path;
22-
private Query $query;
19+
private Url $url;
2320
private Form $form;
2421
public array $RouteValues = [];
2522

26-
public function __construct(
27-
string $method,
28-
string $url,
29-
?Headers $headers = null,
30-
?Stream $body = null,
31-
?Form $form = null
32-
) {
23+
public function __construct(string $method, string $url, ?Headers $headers = null, ?Stream $body = null, ?Form $form = null)
24+
{
3325
$this->method = strtoupper($method);
34-
$this->headers = $headers ?? new Headers();
26+
$this->url = new Url($url);
27+
$this->headers = $headers ?? new Headers(['Host' => $this->url->Host]);
3528
$this->cookies = new Cookies($this->Headers);
3629
$this->body = $body ?? new FileStream('php://temp', FileMode::Open, FileAccess::ReadWrite);
3730
$this->form = $form ?? new Form();
38-
$this->scheme = (string) parse_url($url, PHP_URL_SCHEME);
39-
40-
if (!$this->scheme) {
41-
$this->scheme = 'http';
42-
$url = $this->scheme . '://' . $url;
43-
}
44-
45-
$host = parse_url($url, PHP_URL_HOST);
46-
$port = parse_url($url, PHP_URL_PORT);
47-
$this->host = new Host($host, $port);
48-
49-
$this->path = parse_url($url, PHP_URL_PATH) ?? '/';
50-
51-
$query = parse_url($url, PHP_URL_QUERY);
52-
$this->query = new Query($query);
5331
}
5432

5533
public function get_Method(): string
5634
{
5735
return $this->method;
5836
}
5937

60-
public function get_Scheme(): string
38+
public function get_Url(): Url
6139
{
62-
return $this->scheme;
63-
}
64-
65-
public function get_Host(): Host
66-
{
67-
return $this->host;
68-
}
69-
70-
public function get_Path(): string
71-
{
72-
return $this->path;
73-
}
74-
75-
public function get_Query(): Query
76-
{
77-
return $this->query;
40+
return $this->url;
7841
}
7942

8043
public function get_Form(): Form
8144
{
8245
return $this->form;
8346
}
84-
85-
public function set_Path(string $value): void
86-
{
87-
$this->path = $value;
88-
}
8947
}

lib/Message/Url.php

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
/**
4+
* @author Mohammed Moussaoui
5+
* @license MIT license. For more license information, see the LICENSE file in the root directory.
6+
* @link https://github.com/DevNet-Framework
7+
*/
8+
9+
namespace DevNet\Http\Message;
10+
11+
use DevNet\System\PropertyTrait;
12+
13+
class Url
14+
{
15+
use PropertyTrait;
16+
17+
private string $scheme;
18+
private Host $host;
19+
public string $path;
20+
private Query $query;
21+
22+
public function __construct(string $url)
23+
{
24+
$this->scheme = (string) parse_url($url, PHP_URL_SCHEME);
25+
if (!$this->scheme) {
26+
$this->scheme = 'http';
27+
$url = $this->scheme . '://' . $url;
28+
}
29+
30+
$host = parse_url($url, PHP_URL_HOST);
31+
if ($host == null) {
32+
throw new HttpException("Invalid Url: {$url}", 400, 1);
33+
}
34+
35+
$port = parse_url($url, PHP_URL_PORT);
36+
if ($port == null) {
37+
$port = 80;
38+
if ($this->scheme == "https") {
39+
$port = 443;
40+
}
41+
}
42+
43+
$this->host = new Host($host, $port);
44+
$this->path = parse_url($url, PHP_URL_PATH) ?? '/';
45+
46+
$query = parse_url($url, PHP_URL_QUERY);
47+
$this->query = new Query($query);
48+
}
49+
50+
public function get_Scheme(): string
51+
{
52+
return $this->scheme;
53+
}
54+
55+
public function get_Host(): Host
56+
{
57+
return $this->host;
58+
}
59+
60+
public function get_Path(): string
61+
{
62+
return $this->path;
63+
}
64+
65+
public function get_Query(): Query
66+
{
67+
return $this->query;
68+
}
69+
70+
public function set_Path(string $value): void
71+
{
72+
$this->path = $value;
73+
}
74+
75+
public function __toString(): string
76+
{
77+
if (!empty($this->query->__toString())) {
78+
$this->scheme . "://" . $this->host . $this->path . "/?" . $this->query;
79+
}
80+
81+
return $this->scheme . "://" . $this->host . $this->path;
82+
}
83+
}

0 commit comments

Comments
 (0)