Skip to content

Commit

Permalink
Add support for nested params for multipart requests
Browse files Browse the repository at this point in the history
  • Loading branch information
SammyK committed Apr 2, 2015
1 parent d6c2bad commit 85c0288
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 4 deletions.
30 changes: 26 additions & 4 deletions src/Facebook/Http/RequestBodyMultipart.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,17 @@ class RequestBodyMultipart implements RequestBodyInterface
/**
* @var string The boundary.
*/
protected $boundary;
private $boundary;

/**
* @var array The parameters to send with this request.
*/
protected $params = [];
private $params;

/**
* @var array The files to send with this request.
*/
protected $files = [];
private $files = [];

/**
* @param array $params The parameters to send with this request.
Expand All @@ -71,7 +71,8 @@ public function getBody()
$body = '';

// Compile normal params
foreach ($this->params as $k => $v) {
$params = $this->getNestedParams($this->params);
foreach ($params as $k => $v) {
$body .= $this->getParamString($k, $v);
}

Expand Down Expand Up @@ -134,6 +135,27 @@ private function getParamString($name, $value)
);
}

/**
* Returns the params as an array of nested params.
*
* @param array $params
*
* @return array
*/
private function getNestedParams(array $params)
{
$query = http_build_query($params, null, '&');
$params = explode('&', $query);
$result = [];

foreach ($params as $param) {
list($key, $value) = explode('=', $param, 2);
$result[urldecode($key)] = urldecode($value);
}

return $result;
}

/**
* Get the headers needed before transferring the content of a POST file.
*
Expand Down
44 changes: 44 additions & 0 deletions tests/Http/RequestBodyMultipartTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,48 @@ public function testCanProperlyEncodeFilesAndParams()

$this->assertEquals($expectedBody, $body);
}

public function testSupportsMultidimensionalParams()
{
$message = new RequestBodyMultipart([
'foo' => 'bar',
'faz' => [1,2,3],
'targeting' => [
'countries' => 'US,GB',
'age_min' => 13,
],
'call_to_action' => [
'type' => 'LEARN_MORE',
'value' => [
'link' => 'http:https://example.com',
'sponsorship' => [
'image' => 'http:https://example.com/bar.jpg',
],
],
],
], [], 'foo_boundary');
$body = $message->getBody();

$expectedBody = "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"foo\"\r\n\r\nbar\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"faz[0]\"\r\n\r\n1\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"faz[1]\"\r\n\r\n2\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"faz[2]\"\r\n\r\n3\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"targeting[countries]\"\r\n\r\nUS,GB\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"targeting[age_min]\"\r\n\r\n13\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"call_to_action[type]\"\r\n\r\nLEARN_MORE\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"call_to_action[value][link]\"\r\n\r\nhttp:https://example.com\r\n";
$expectedBody .= "--foo_boundary\r\n";
$expectedBody .= "Content-Disposition: form-data; name=\"call_to_action[value][sponsorship][image]\"\r\n\r\nhttp:https://example.com/bar.jpg\r\n";
$expectedBody .= "--foo_boundary--\r\n";

$this->assertEquals($expectedBody, $body);
}
}
24 changes: 24 additions & 0 deletions tests/Http/RequestUrlEncodedTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,28 @@ public function testCanProperlyEncodeAnArrayOfParams()

$this->assertEquals('foo=bar&scawy_vawues=%40FooBar+is+a+real+twitter+handle.', $body);
}

public function testSupportsMultidimensionalParams()
{
$message = new RequestBodyUrlEncoded([
'foo' => 'bar',
'faz' => [1,2,3],
'targeting' => [
'countries' => 'US,GB',
'age_min' => 13,
],
'call_to_action' => [
'type' => 'LEARN_MORE',
'value' => [
'link' => 'http:https://example.com',
'sponsorship' => [
'image' => 'http:https://example.com/bar.jpg',
],
],
],
]);
$body = $message->getBody();

$this->assertEquals('foo=bar&faz%5B0%5D=1&faz%5B1%5D=2&faz%5B2%5D=3&targeting%5Bcountries%5D=US%2CGB&targeting%5Bage_min%5D=13&call_to_action%5Btype%5D=LEARN_MORE&call_to_action%5Bvalue%5D%5Blink%5D=http%3A%2F%2Fexample.com&call_to_action%5Bvalue%5D%5Bsponsorship%5D%5Bimage%5D=http%3A%2F%2Fexample.com%2Fbar.jpg', $body);
}
}

0 comments on commit 85c0288

Please sign in to comment.