From 4d4b1f8c22cf406b35a88c7299f8ee2bc033bf4d Mon Sep 17 00:00:00 2001 From: Andreas Gohr <andi@splitbrain.org> Date: Thu, 1 Aug 2013 22:08:23 +0200 Subject: [PATCH] use http_build_query() in HTTPClient this ensures nested POST data is correctly encoded --- _test/tests/inc/httpclient_http.test.php | 50 ++++++++++++++++++++++++ inc/HTTPClient.php | 14 +------ 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php index 387eb53aa..522f0790c 100644 --- a/_test/tests/inc/httpclient_http.test.php +++ b/_test/tests/inc/httpclient_http.test.php @@ -215,5 +215,55 @@ class httpclient_http_test extends DokuWikiTest { $data = $http->get('http://www.wikimatrix.org/cfeed/dokuwiki/-/-'); $this->assertTrue($data !== false, $http->error); } + + function test_postencode(){ + $http = new HTTPClient(); + + + // check simple data + $data = array( + 'öä?' => 'öä?', + 'foo' => 'bang' + ); + $this->assertEquals( + '%C3%B6%C3%A4%3F=%C3%B6%C3%A4%3F&foo=bang', + $http->_postEncode($data), + 'simple' + ); + + // check first level numeric array + $data = array( + 'foo' => 'bang', + 'ärr' => array('ö', 'b', 'c') + ); + $this->assertEquals( + 'foo=bang&%C3%A4rr%5B0%5D=%C3%B6&%C3%A4rr%5B1%5D=b&%C3%A4rr%5B2%5D=c', + $http->_postEncode($data), + 'onelevelnum' + ); + + // check first level associative array + $data = array( + 'foo' => 'bang', + 'ärr' => array('ö'=>'ä', 'b' => 'c') + ); + $this->assertEquals( + 'foo=bang&%C3%A4rr%5B%C3%B6%5D=%C3%A4&%C3%A4rr%5Bb%5D=c', + $http->_postEncode($data), + 'onelevelassoc' + ); + + + // check first level associative array + $data = array( + 'foo' => 'bang', + 'ärr' => array('ö'=>'ä', 'ä' => array('ö'=>'ä')) + ); + $this->assertEquals( + 'foo=bang&%C3%A4rr%5B%C3%B6%5D=%C3%A4&%C3%A4rr%5B%C3%A4%5D%5B%C3%B6%5D=%C3%A4', + $http->_postEncode($data), + 'twolevelassoc' + ); + } } //Setup VIM: ex: et ts=4 : diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php index 224b32982..3964c8fbc 100644 --- a/inc/HTTPClient.php +++ b/inc/HTTPClient.php @@ -806,19 +806,7 @@ class HTTPClient { * @author Andreas Gohr <andi@splitbrain.org> */ function _postEncode($data){ - $url = ''; - foreach($data as $key => $val){ - if (is_array($val)) { - foreach ($val as $k => $v) { - if($url) $url .= '&'; - $url .= urlencode($key).'['.$k.']='.urlencode($v); - } - } else { - if($url) $url .= '&'; - $url .= urlencode($key).'='.urlencode($val); - } - } - return $url; + return http_build_query($data,'','&'); } /** -- GitLab