/** * Parse a query string into a Query object. * * @param puzzle_Query $query Query object to populate * @param string $str Query string to parse * @param bool|string $urlEncoding How the query string is encoded */ public function parseInto(puzzle_Query $query, $str, $urlEncoding = true) { if ($str === '') { return; } $result = array(); $this->duplicates = false; $this->numericIndices = true; $decoder = self::getDecoder($urlEncoding); foreach (explode('&', $str) as $kvp) { $parts = explode('=', $kvp, 2); $key = call_user_func($decoder, $parts[0]); $value = isset($parts[1]) ? call_user_func($decoder, $parts[1]) : null; // Special handling needs to be taken for PHP nested array syntax if (strpos($key, '[') !== false) { $this->parsePhpValue($key, $value, $result); continue; } if (!isset($result[$key])) { $result[$key] = $value; } else { $this->duplicates = true; if (!is_array($result[$key])) { $result[$key] = array($result[$key]); } $result[$key][] = $value; } } $query->replace($result); if (!$this->numericIndices) { $query->setAggregator(puzzle_Query::phpAggregator(false)); } elseif ($this->duplicates) { $query->setAggregator(puzzle_Query::duplicateAggregator()); } }
public function testCanSpecifyQueryAggregator() { $b = new puzzle_post_PostBody(); $b->setField('foo', array('baz', 'bar')); $this->assertEquals('foo%5B0%5D=baz&foo%5B1%5D=bar', (string) $b); $b = new puzzle_post_PostBody(); $b->setField('foo', array('baz', 'bar')); $agg = puzzle_Query::duplicateAggregator(); $b->setAggregator($agg); $this->assertEquals('foo=baz&foo=bar', (string) $b); }
/** * @ticket https://github.com/guzzle/guzzle/issues/706 */ public function testDoesNotApplyPostBodyRightAway() { $factory = new puzzle_message_MessageFactory(); $request = $factory->createRequest('POST', 'http://f.cn', array('body' => array('foo' => array('bar', 'baz')))); $this->assertEquals('', $request->getHeader('Content-Type')); $this->assertEquals('', $request->getHeader('Content-Length')); $request->getBody()->setAggregator(puzzle_Query::duplicateAggregator()); $request->getBody()->applyRequestHeaders($request); $this->assertEquals('foo=bar&foo=baz', $request->getBody()); }
public function testDuplicateEncodesNoNumericIndices() { $agg = puzzle_Query::duplicateAggregator(); $result = call_user_func($agg, $this->encodeData); $this->assertEquals(array('t[v1]' => array('a', '1'), 't[v2]' => array('b'), 't[v3][v4]' => array('c'), 't[v3][v5]' => array('d')), $result); }