MultiPartLocation.php
1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
namespace GuzzleHttp\Command\Guzzle\RequestLocation;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Command\Guzzle\Operation;
use GuzzleHttp\Command\Guzzle\Parameter;
use GuzzleHttp\Psr7;
use Psr\Http\Message\RequestInterface;
/**
* Adds POST files to a request
*/
class MultiPartLocation extends AbstractLocation
{
/** @var string */
protected $contentType = 'multipart/form-data; boundary=';
/** @var array */
protected $multipartData = [];
/**
* Set the name of the location
*
* @param string $locationName
*/
public function __construct($locationName = 'multipart')
{
parent::__construct($locationName);
}
/**
* @return RequestInterface
*/
public function visit(
CommandInterface $command,
RequestInterface $request,
Parameter $param
) {
$this->multipartData[] = [
'name' => $param->getWireName(),
'contents' => $this->prepareValue($command[$param->getName()], $param),
];
return $request;
}
/**
* @return RequestInterface
*/
public function after(
CommandInterface $command,
RequestInterface $request,
Operation $operation
) {
$data = $this->multipartData;
$this->multipartData = [];
$modify = [];
$body = new Psr7\MultipartStream($data);
$modify['body'] = Psr7\Utils::streamFor($body);
$request = Psr7\Utils::modifyRequest($request, $modify);
if ($request->getBody() instanceof Psr7\MultipartStream) {
// Use a multipart/form-data POST if a Content-Type is not set.
$request->withHeader('Content-Type', $this->contentType.$request->getBody()->getBoundary());
}
return $request;
}
}