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

JBZoo / Http-Client / 30072156185

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

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%)

43.27 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);
96✔
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())
92✔
41
            ->setUrl($url)
92✔
42
            ->setArgs($args)
92✔
43
            ->setMethod($method)
92✔
44
            ->setOptions(\array_merge($this->options->toArray(), $options));
92✔
45

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

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

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

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

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

70
        return $response;
78✔
71
    }
72

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

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

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

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

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

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

98
        return $responseList;
4✔
99
    }
100

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

105
        return $this;
4✔
106
    }
107

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

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

117
        return 0;
92✔
118
    }
119

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

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

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

135
        if (\class_exists($className) && \is_subclass_of($className, AbstractDriver::class)) {
96✔
136
            return new $className();
96✔
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