Completed
Push — master ( 6954b4...cb6aed )
by Tobias
29:41 queued 28:21
created

RequestBuilder   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 115
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 93.02%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 5
dl 0
loc 115
ccs 40
cts 43
cp 0.9302
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A setRequestFactory() 0 6 1
A create() 0 26 3
A getRequestFactory() 0 8 2
A getStreamFactory() 0 8 2
A setStreamFactory() 0 6 1
A getMultipartStreamBuilder() 0 8 2
A setMultipartStreamBuilder() 0 6 1
A createRequest() 0 10 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * Copyright (C) 2013 Mailgun
7
 *
8
 * This software may be modified and distributed under the terms
9
 * of the MIT license. See the LICENSE file for details.
10
 */
11
12
namespace Mailgun\HttpClient;
13
14
use Http\Discovery\Psr17FactoryDiscovery;
15
use Http\Message\MultipartStream\MultipartStreamBuilder;
16
use Psr\Http\Message\RequestFactoryInterface;
17
use Psr\Http\Message\RequestInterface;
18
use Psr\Http\Message\StreamFactoryInterface;
19
use Psr\Http\Message\StreamInterface;
20
21
/**
22
 * @author Tobias Nyholm <[email protected]>
23
 */
24
class RequestBuilder
25
{
26
    /**
27
     * @var RequestFactoryInterface|null
28
     */
29
    private $requestFactory;
30
31
    /**
32
     * @var StreamFactoryInterface|null
33
     */
34
    private $streamFactory;
35
36
    /**
37
     * @var MultipartStreamBuilder
38
     */
39
    private $multipartStreamBuilder;
40
41
    /**
42
     * Creates a new PSR-7 request.
43
     *
44
     * @param array|string|null $body Request body. If body is an array we will send a as multipart stream request.
45
     *                                If array, each array *item* MUST look like:
46
     *                                array (
47
     *                                'content' => string|resource|StreamInterface,
48
     *                                'name'    => string,
49
     *                                'filename'=> string (optional)
50
     *                                'headers' => array (optinal) ['header-name' => 'header-value']
51
     *                                )
52
     */
53 2
    public function create(string $method, string $uri, array $headers = [], $body = null): RequestInterface
54
    {
55 2
        if (!is_array($body)) {
56 1
            $stream = $this->getStreamFactory()->createStream($body);
57
58 1
            return $this->createRequest($method, $uri, $headers, $stream);
59
        }
60
61 1
        $builder = $this->getMultipartStreamBuilder();
62 1
        foreach ($body as $item) {
63 1
            $name = $item['name'];
64 1
            $content = $item['content'];
65 1
            unset($item['name']);
66 1
            unset($item['content']);
67
68 1
            $builder->addResource($name, $content, $item);
69
        }
70
71 1
        $multipartStream = $builder->build();
72 1
        $boundary = $builder->getBoundary();
73 1
        $builder->reset();
74
75 1
        $headers['Content-Type'] = 'multipart/form-data; boundary="'.$boundary.'"';
76
77 1
        return $this->createRequest($method, $uri, $headers, $multipartStream);
78
    }
79
80 2
    private function getRequestFactory(): RequestFactoryInterface
81
    {
82 2
        if (null === $this->requestFactory) {
83
            $this->requestFactory = Psr17FactoryDiscovery::findRequestFactory();
84
        }
85
86 2
        return $this->requestFactory;
87
    }
88
89 2
    public function setRequestFactory(RequestFactoryInterface $requestFactory): self
90
    {
91 2
        $this->requestFactory = $requestFactory;
92
93 2
        return $this;
94
    }
95
96 1
    private function getStreamFactory(): StreamFactoryInterface
97
    {
98 1
        if (null === $this->streamFactory) {
99
            $this->streamFactory = Psr17FactoryDiscovery::findStreamFactory();
100
        }
101
102 1
        return $this->streamFactory;
103
    }
104
105 2
    public function setStreamFactory(StreamFactoryInterface $streamFactory): self
106
    {
107 2
        $this->streamFactory = $streamFactory;
108
109 2
        return $this;
110
    }
111
112 1
    private function getMultipartStreamBuilder(): MultipartStreamBuilder
113
    {
114 1
        if (null === $this->multipartStreamBuilder) {
115
            $this->multipartStreamBuilder = new MultipartStreamBuilder();
116
        }
117
118 1
        return $this->multipartStreamBuilder;
119
    }
120
121 1
    public function setMultipartStreamBuilder(MultipartStreamBuilder $multipartStreamBuilder): self
122
    {
123 1
        $this->multipartStreamBuilder = $multipartStreamBuilder;
124
125 1
        return $this;
126
    }
127
128 2
    private function createRequest(string $method, string $uri, array $headers, StreamInterface $stream)
129
    {
130 2
        $request = $this->getRequestFactory()->createRequest($method, $uri);
131 2
        $request = $request->withBody($stream);
132 2
        foreach ($headers as $name => $value) {
133 2
            $request = $request->withAddedHeader($name, $value);
134
        }
135
136 2
        return $request;
137
    }
138
}
139