Merge pull request #17583 from RandomShaper/enhance-uri-utils
Enhance uri utils
This commit is contained in:
commit
cd7e9d9642
8 changed files with 38 additions and 112 deletions
|
@ -618,7 +618,27 @@ String HTTPClient::query_string_from_dict(const Dictionary &p_dict) {
|
||||||
String query = "";
|
String query = "";
|
||||||
Array keys = p_dict.keys();
|
Array keys = p_dict.keys();
|
||||||
for (int i = 0; i < keys.size(); ++i) {
|
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]).percent_encode();
|
||||||
|
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]).percent_encode();
|
||||||
|
}
|
||||||
|
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).percent_encode();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
query.erase(0, 1);
|
query.erase(0, 1);
|
||||||
return query;
|
return query;
|
||||||
|
|
|
@ -3165,11 +3165,11 @@ String String::word_wrap(int p_chars_per_line) const {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
String String::http_escape() const {
|
String String::percent_encode() const {
|
||||||
const CharString temp = utf8();
|
const CharString temp = utf8();
|
||||||
String res;
|
String res;
|
||||||
for (int i = 0; i < length(); ++i) {
|
for (int i = 0; i < temp.length(); ++i) {
|
||||||
CharType ord = temp[i];
|
char ord = temp[i];
|
||||||
if (ord == '.' || ord == '-' || ord == '_' || ord == '~' ||
|
if (ord == '.' || ord == '-' || ord == '_' || ord == '~' ||
|
||||||
(ord >= 'a' && ord <= 'z') ||
|
(ord >= 'a' && ord <= 'z') ||
|
||||||
(ord >= 'A' && ord <= 'Z') ||
|
(ord >= 'A' && ord <= 'Z') ||
|
||||||
|
@ -3178,9 +3178,9 @@ String String::http_escape() const {
|
||||||
} else {
|
} else {
|
||||||
char h_Val[3];
|
char h_Val[3];
|
||||||
#if defined(__GNUC__) || defined(_MSC_VER)
|
#if defined(__GNUC__) || defined(_MSC_VER)
|
||||||
snprintf(h_Val, 3, "%.2X", ord);
|
snprintf(h_Val, 3, "%hhX", ord);
|
||||||
#else
|
#else
|
||||||
sprintf(h_Val, "%.2X", ord);
|
sprintf(h_Val, "%hhX", ord);
|
||||||
#endif
|
#endif
|
||||||
res += "%";
|
res += "%";
|
||||||
res += h_Val;
|
res += h_Val;
|
||||||
|
@ -3189,7 +3189,7 @@ String String::http_escape() const {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
String String::http_unescape() const {
|
String String::percent_decode() const {
|
||||||
String res;
|
String res;
|
||||||
for (int i = 0; i < length(); ++i) {
|
for (int i = 0; i < length(); ++i) {
|
||||||
if (ord_at(i) == '%' && i + 2 < length()) {
|
if (ord_at(i) == '%' && i + 2 < length()) {
|
||||||
|
@ -3727,68 +3727,6 @@ String String::plus_file(const String &p_file) const {
|
||||||
return *this + "/" + p_file;
|
return *this + "/" + p_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
String String::percent_encode() const {
|
|
||||||
|
|
||||||
CharString cs = utf8();
|
|
||||||
String encoded;
|
|
||||||
for (int i = 0; i < cs.length(); i++) {
|
|
||||||
uint8_t c = cs[i];
|
|
||||||
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '~' || c == '.') {
|
|
||||||
|
|
||||||
char p[2] = { (char)c, 0 };
|
|
||||||
encoded += p;
|
|
||||||
} else {
|
|
||||||
char p[4] = { '%', 0, 0, 0 };
|
|
||||||
static const char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
|
||||||
|
|
||||||
p[1] = hex[c >> 4];
|
|
||||||
p[2] = hex[c & 0xF];
|
|
||||||
encoded += p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return encoded;
|
|
||||||
}
|
|
||||||
String String::percent_decode() const {
|
|
||||||
|
|
||||||
CharString pe;
|
|
||||||
|
|
||||||
CharString cs = utf8();
|
|
||||||
for (int i = 0; i < cs.length(); i++) {
|
|
||||||
|
|
||||||
uint8_t c = cs[i];
|
|
||||||
if (c == '%' && i < length() - 2) {
|
|
||||||
|
|
||||||
uint8_t a = LOWERCASE(cs[i + 1]);
|
|
||||||
uint8_t b = LOWERCASE(cs[i + 2]);
|
|
||||||
|
|
||||||
c = 0;
|
|
||||||
if (a >= '0' && a <= '9')
|
|
||||||
c = (a - '0') << 4;
|
|
||||||
else if (a >= 'a' && a <= 'f')
|
|
||||||
c = (a - 'a' + 10) << 4;
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
|
|
||||||
uint8_t d = 0;
|
|
||||||
|
|
||||||
if (b >= '0' && b <= '9')
|
|
||||||
d = (b - '0');
|
|
||||||
else if (b >= 'a' && b <= 'f')
|
|
||||||
d = (b - 'a' + 10);
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
c += d;
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
pe.push_back(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
pe.push_back(0);
|
|
||||||
|
|
||||||
return String::utf8(pe.ptr());
|
|
||||||
}
|
|
||||||
|
|
||||||
String String::get_basename() const {
|
String String::get_basename() const {
|
||||||
|
|
||||||
int pos = find_last(".");
|
int pos = find_last(".");
|
||||||
|
|
|
@ -226,17 +226,14 @@ public:
|
||||||
|
|
||||||
String xml_escape(bool p_escape_quotes = false) const;
|
String xml_escape(bool p_escape_quotes = false) const;
|
||||||
String xml_unescape() const;
|
String xml_unescape() const;
|
||||||
String http_escape() const;
|
String percent_encode() const;
|
||||||
String http_unescape() const;
|
String percent_decode() const;
|
||||||
String c_escape() const;
|
String c_escape() const;
|
||||||
String c_escape_multiline() const;
|
String c_escape_multiline() const;
|
||||||
String c_unescape() const;
|
String c_unescape() const;
|
||||||
String json_escape() const;
|
String json_escape() const;
|
||||||
String word_wrap(int p_chars_per_line) const;
|
String word_wrap(int p_chars_per_line) const;
|
||||||
|
|
||||||
String percent_encode() const;
|
|
||||||
String percent_decode() const;
|
|
||||||
|
|
||||||
bool is_valid_identifier() const;
|
bool is_valid_identifier() const;
|
||||||
bool is_valid_integer() const;
|
bool is_valid_integer() const;
|
||||||
bool is_valid_float() const;
|
bool is_valid_float() const;
|
||||||
|
|
|
@ -111,6 +111,12 @@
|
||||||
String queryString = httpClient.query_string_from_dict(fields)
|
String queryString = httpClient.query_string_from_dict(fields)
|
||||||
returns:= "username=user&password=pass"
|
returns:= "username=user&password=pass"
|
||||||
[/codeblock]
|
[/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&not_valued&multiple=22&multiple=33&multiple=44"
|
||||||
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="read_response_body_chunk">
|
<method name="read_response_body_chunk">
|
||||||
|
|
|
@ -902,7 +902,7 @@ void EditorAssetLibrary::_search(int p_page) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filter->get_text() != String()) {
|
if (filter->get_text() != String()) {
|
||||||
args += "&filter=" + filter->get_text().http_escape();
|
args += "&filter=" + filter->get_text().percent_encode();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_page > 0) {
|
if (p_page > 0) {
|
||||||
|
|
|
@ -1168,24 +1168,6 @@ godot_string GDAPI godot_string_c_unescape(const godot_string *p_self) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
godot_string GDAPI godot_string_http_escape(const godot_string *p_self) {
|
|
||||||
const String *self = (const String *)p_self;
|
|
||||||
godot_string result;
|
|
||||||
String return_value = self->http_escape();
|
|
||||||
memnew_placement(&result, String(return_value));
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
godot_string GDAPI godot_string_http_unescape(const godot_string *p_self) {
|
|
||||||
const String *self = (const String *)p_self;
|
|
||||||
godot_string result;
|
|
||||||
String return_value = self->http_unescape();
|
|
||||||
memnew_placement(&result, String(return_value));
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
godot_string GDAPI godot_string_json_escape(const godot_string *p_self) {
|
godot_string GDAPI godot_string_json_escape(const godot_string *p_self) {
|
||||||
const String *self = (const String *)p_self;
|
const String *self = (const String *)p_self;
|
||||||
godot_string result;
|
godot_string result;
|
||||||
|
|
|
@ -5467,20 +5467,6 @@
|
||||||
["const godot_string *", "p_self"]
|
["const godot_string *", "p_self"]
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "godot_string_http_escape",
|
|
||||||
"return_type": "godot_string",
|
|
||||||
"arguments": [
|
|
||||||
["const godot_string *", "p_self"]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "godot_string_http_unescape",
|
|
||||||
"return_type": "godot_string",
|
|
||||||
"arguments": [
|
|
||||||
["const godot_string *", "p_self"]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "godot_string_json_escape",
|
"name": "godot_string_json_escape",
|
||||||
"return_type": "godot_string",
|
"return_type": "godot_string",
|
||||||
|
|
|
@ -228,17 +228,14 @@ godot_string GDAPI godot_string_simplify_path(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_c_escape(const godot_string *p_self);
|
godot_string GDAPI godot_string_c_escape(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_c_escape_multiline(const godot_string *p_self);
|
godot_string GDAPI godot_string_c_escape_multiline(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_c_unescape(const godot_string *p_self);
|
godot_string GDAPI godot_string_c_unescape(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_http_escape(const godot_string *p_self);
|
godot_string GDAPI godot_string_percent_decode(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_http_unescape(const godot_string *p_self);
|
godot_string GDAPI godot_string_percent_encode(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_json_escape(const godot_string *p_self);
|
godot_string GDAPI godot_string_json_escape(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_word_wrap(const godot_string *p_self, godot_int p_chars_per_line);
|
godot_string GDAPI godot_string_word_wrap(const godot_string *p_self, godot_int p_chars_per_line);
|
||||||
godot_string GDAPI godot_string_xml_escape(const godot_string *p_self);
|
godot_string GDAPI godot_string_xml_escape(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_xml_escape_with_quotes(const godot_string *p_self);
|
godot_string GDAPI godot_string_xml_escape_with_quotes(const godot_string *p_self);
|
||||||
godot_string GDAPI godot_string_xml_unescape(const godot_string *p_self);
|
godot_string GDAPI godot_string_xml_unescape(const godot_string *p_self);
|
||||||
|
|
||||||
godot_string GDAPI godot_string_percent_decode(const godot_string *p_self);
|
|
||||||
godot_string GDAPI godot_string_percent_encode(const godot_string *p_self);
|
|
||||||
|
|
||||||
godot_bool GDAPI godot_string_is_valid_float(const godot_string *p_self);
|
godot_bool GDAPI godot_string_is_valid_float(const godot_string *p_self);
|
||||||
godot_bool GDAPI godot_string_is_valid_hex_number(const godot_string *p_self, godot_bool p_with_prefix);
|
godot_bool GDAPI godot_string_is_valid_hex_number(const godot_string *p_self, godot_bool p_with_prefix);
|
||||||
godot_bool GDAPI godot_string_is_valid_html_color(const godot_string *p_self);
|
godot_bool GDAPI godot_string_is_valid_html_color(const godot_string *p_self);
|
||||||
|
|
Loading…
Reference in a new issue