aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHein-Pieter van Braam2018-05-13 21:11:42 +0200
committerGitHub2018-05-13 21:11:42 +0200
commitbcb38393a58af00bc53c2fdc4797ef4faa6006ff (patch)
tree3375466d3cf98106dd059eb36e3101479189c74f
parent1905e1c8a2ea4cb891afef897488e13fda6e39a3 (diff)
parenta9ec1e39136878414c264d436866a0bc47e2c9df (diff)
downloadgodot-bcb38393a58af00bc53c2fdc4797ef4faa6006ff.tar.gz
godot-bcb38393a58af00bc53c2fdc4797ef4faa6006ff.tar.zst
godot-bcb38393a58af00bc53c2fdc4797ef4faa6006ff.zip
Merge pull request #18157 from RandomShaper/improve-uri-utils-3.0
Improve/fix URI utils (3.0)
-rw-r--r--core/io/http_client.cpp22
-rw-r--r--core/ustring.cpp8
-rw-r--r--doc/classes/HTTPClient.xml6
3 files changed, 31 insertions, 5 deletions
diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp
index 4d72f744e..9e301ccac 100644
--- a/core/io/http_client.cpp
+++ b/core/io/http_client.cpp
@@ -618,7 +618,27 @@ String HTTPClient::query_string_from_dict(const Dictionary &p_dict) {
String query = "";
Array keys = p_dict.keys();
for (int i = 0; i < keys.size(); ++i) {
- query += "&" + String(keys[i]).http_escape() + "=" + String(p_dict[keys[i]]).http_escape();
+ String encoded_key = String(keys[i]).http_escape();
+ Variant value = p_dict[keys[i]];
+ switch (value.get_type()) {
+ case Variant::ARRAY: {
+ // Repeat the key with every values
+ Array values = value;
+ for (int j = 0; j < values.size(); ++j) {
+ query += "&" + encoded_key + "=" + String(values[j]).http_escape();
+ }
+ break;
+ }
+ case Variant::NIL: {
+ // Add the key with no value
+ query += "&" + encoded_key;
+ break;
+ }
+ default: {
+ // Add the key-value pair
+ query += "&" + encoded_key + "=" + String(value).http_escape();
+ }
+ }
}
query.erase(0, 1);
return query;
diff --git a/core/ustring.cpp b/core/ustring.cpp
index a7a781083..954f59021 100644
--- a/core/ustring.cpp
+++ b/core/ustring.cpp
@@ -3168,8 +3168,8 @@ String String::word_wrap(int p_chars_per_line) const {
String String::http_escape() const {
const CharString temp = utf8();
String res;
- for (int i = 0; i < length(); ++i) {
- CharType ord = temp[i];
+ for (int i = 0; i < temp.length(); ++i) {
+ char ord = temp[i];
if (ord == '.' || ord == '-' || ord == '_' || ord == '~' ||
(ord >= 'a' && ord <= 'z') ||
(ord >= 'A' && ord <= 'Z') ||
@@ -3178,9 +3178,9 @@ String String::http_escape() const {
} else {
char h_Val[3];
#if defined(__GNUC__) || defined(_MSC_VER)
- snprintf(h_Val, 3, "%.2X", ord);
+ snprintf(h_Val, 3, "%hhX", ord);
#else
- sprintf(h_Val, "%.2X", ord);
+ sprintf(h_Val, "%hhX", ord);
#endif
res += "%";
res += h_Val;
diff --git a/doc/classes/HTTPClient.xml b/doc/classes/HTTPClient.xml
index 5627f585e..3f0668ba0 100644
--- a/doc/classes/HTTPClient.xml
+++ b/doc/classes/HTTPClient.xml
@@ -111,6 +111,12 @@
String queryString = httpClient.query_string_from_dict(fields)
returns:= "username=user&amp;password=pass"
[/codeblock]
+ Furthermore, if a key has a null value, only the key itself is added, without equal sign and value. If the value is an array, for each value in it a pair with the same key is added.
+ [codeblock]
+ var fields = {"single": 123, "not_valued": null, "multiple": [22, 33, 44]}
+ String queryString = httpClient.query_string_from_dict(fields)
+ returns:= "single=123&amp;not_valued&amp;multiple=22&amp;multiple=33&amp;multiple=44"
+ [/codeblock]
</description>
</method>
<method name="read_response_body_chunk">