JsonLocation.php
2.4 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
71
72
73
74
75
76
77
78
79
<?php
namespace GuzzleHttp\Command\Guzzle\RequestLocation;
use GuzzleHttp\Command\CommandInterface;
use GuzzleHttp\Command\Guzzle\Operation;
use GuzzleHttp\Command\Guzzle\Parameter;
use GuzzleHttp\Psr7;
use GuzzleHttp\Utils;
use Psr\Http\Message\MessageInterface;
use Psr\Http\Message\RequestInterface;
/**
* Creates a JSON document
*/
class JsonLocation extends AbstractLocation
{
/** @var string Whether or not to add a Content-Type header when JSON is found */
private $jsonContentType;
/** @var array */
private $jsonData;
/**
* @param string $locationName Name of the location
* @param string $contentType Content-Type header to add to the request if
* JSON is added to the body. Pass an empty string to omit.
*/
public function __construct($locationName = 'json', $contentType = 'application/json')
{
parent::__construct($locationName);
$this->jsonContentType = $contentType;
}
/**
* @return RequestInterface
*/
public function visit(
CommandInterface $command,
RequestInterface $request,
Parameter $param
) {
$this->jsonData[$param->getWireName()] = $this->prepareValue(
$command[$param->getName()],
$param
);
return $request->withBody(Psr7\Utils::streamFor(Utils::jsonEncode($this->jsonData)));
}
/**
* @return MessageInterface
*/
public function after(
CommandInterface $command,
RequestInterface $request,
Operation $operation
) {
$data = $this->jsonData;
$this->jsonData = [];
// Add additional parameters to the JSON document
$additional = $operation->getAdditionalParameters();
if ($additional && ($additional->getLocation() === $this->locationName)) {
foreach ($command->toArray() as $key => $value) {
if (!$operation->hasParam($key)) {
$data[$key] = $this->prepareValue($value, $additional);
}
}
}
// Don't overwrite the Content-Type if one is set
if ($this->jsonContentType && !$request->hasHeader('Content-Type')) {
$request = $request->withHeader('Content-Type', $this->jsonContentType);
}
return $request->withBody(Psr7\Utils::streamFor(Utils::jsonEncode($data)));
}
}