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