• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

JBZoo / Http-Client / 30191290826

20 Jul 2026 07:25PM UTC coverage: 94.855%. Remained the same
30191290826

push

github

web-flow
Merge pull request #29 from JBZoo/release/8.0

8.0.0 — PHP 8.3+ floor & lock-step major

295 of 311 relevant lines covered (94.86%)

129.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.92
/src/HttpClient.php
1
<?php
2

3
/**
4
 * JBZoo Toolbox - Http-Client.
5
 *
6
 * This file is part of the JBZoo Toolbox project.
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 *
10
 * @license    MIT
11
 * @copyright  Copyright (C) JBZoo.com, All rights reserved.
12
 * @see        https://github.com/JBZoo/Http-Client
13
 */
14

15
declare(strict_types=1);
16

17
namespace JBZoo\HttpClient;
18

19
use JBZoo\Event\EventManager;
20
use JBZoo\HttpClient\Driver\AbstractDriver;
21

22
final class HttpClient
23
{
24
    private Options       $options;
25
    private ?EventManager $eManager     = null;
26
    private ?Request      $lastRequest  = null;
27
    private ?Response     $lastResponse = null;
28

29
    public function __construct(array $options = [])
30
    {
31
        $this->options = new Options($options);
288✔
32
    }
33

34
    public function request(
35
        string $url,
36
        array|string|null $args = null,
37
        string $method = Request::DEFAULT_METHOD,
38
        array $options = [],
39
    ): Response {
40
        $this->lastRequest = (new Request())
276✔
41
            ->setUrl($url)
276✔
42
            ->setArgs($args)
276✔
43
            ->setMethod($method)
276✔
44
            ->setOptions(\array_merge($this->options->toArray(), $options));
276✔
45

46
        $startTime = \microtime(true);
276✔
47

48
        try {
49
            $this->trigger('request.before', [$this->lastRequest]);
276✔
50
            $response = $this->getDriver()->request($this->lastRequest);
276✔
51
            $this->trigger('request.after', [$response, $this->lastRequest]);
222✔
52
        } catch (\Exception $exception) {
54✔
53
            if ($this->lastRequest->getOptions()->allowException()) {
54✔
54
                throw new Exception($exception->getMessage(), (int)$exception->getCode(), $exception);
42✔
55
            }
56

57
            $response = (new Response())
12✔
58
                ->setCode((int)$exception->getCode())
12✔
59
                ->setHeaders([])
12✔
60
                ->setBody($exception->getMessage())
12✔
61
                ->setRequest($this->lastRequest);
12✔
62
        }
63

64
        if ($response->time === null) {
234✔
65
            $response->setTime(\microtime(true) - $startTime);
96✔
66
        }
67

68
        $this->lastResponse = $response;
234✔
69

70
        return $response;
234✔
71
    }
72

73
    /**
74
     * @return Response[]
75
     */
76
    public function multiRequest(array $requestList, array $options = []): array
77
    {
78
        /** @var Request[] $cleanedRequestList */
79
        $cleanedRequestList = [];
12✔
80

81
        foreach ($requestList as $name => $requestData) {
12✔
82
            $requestOptions = \array_merge($this->options->toArray(), $options, (array)($requestData[3] ?? []));
12✔
83

84
            $cleanedRequestList[$name] = (new Request())
12✔
85
                ->setUrl($requestData[0] ?? '')
12✔
86
                ->setArgs($requestData[1] ?? null)
12✔
87
                ->setMethod($requestData[2] ?? Request::DEFAULT_METHOD)
12✔
88
                ->setHeaders($requestOptions['headers'] ?? [])
12✔
89
                ->setOptions($requestOptions);
12✔
90
        }
91

92
        $this->trigger('multi-request.before', [$cleanedRequestList]);
12✔
93

94
        $responseList = $this->getDriver()->multiRequest($cleanedRequestList);
12✔
95

96
        $this->trigger('multi-request.after', [$responseList, $cleanedRequestList]);
12✔
97

98
        return $responseList;
12✔
99
    }
100

101
    public function setEventManager(EventManager $eManager): self
102
    {
103
        $this->eManager = $eManager;
12✔
104

105
        return $this;
12✔
106
    }
107

108
    public function trigger(string $eventName, array $context = [], ?\Closure $callback = null): int
109
    {
110
        if ($this->eManager !== null) {
288✔
111
            \array_unshift($context, $this);
12✔
112

113
            // @phpstan-ignore-next-line
114
            return $this->eManager->trigger("jbzoo.http.{$eventName}", $context, $callback);
12✔
115
        }
116

117
        return 0;
276✔
118
    }
119

120
    public function getLastResponse(): ?Response
121
    {
122
        return $this->lastResponse;
6✔
123
    }
124

125
    public function getLastRequest(): ?Request
126
    {
127
        return $this->lastRequest;
12✔
128
    }
129

130
    private function getDriver(): AbstractDriver
131
    {
132
        $driverName = $this->options->getDriver();
288✔
133
        $className  = __NAMESPACE__ . "\\Driver\\{$driverName}";
288✔
134

135
        if (\class_exists($className) && \is_subclass_of($className, AbstractDriver::class)) {
288✔
136
            return new $className();
288✔
137
        }
138

139
        throw new Exception("Driver '{$driverName}' not found");
×
140
    }
141
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc