Revert "Unify http- and percent- encode/decode"

This reverts commit b76ee30917.
This commit is contained in:
Pedro J. Estébanez 2018-04-12 21:12:34 +02:00
parent 3a5b25d5b4
commit 00e98458ba
7 changed files with 110 additions and 10 deletions

View file

@ -618,14 +618,14 @@ 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) {
String encoded_key = String(keys[i]).percent_encode(); String encoded_key = String(keys[i]).http_escape();
Variant value = p_dict[keys[i]]; Variant value = p_dict[keys[i]];
switch (value.get_type()) { switch (value.get_type()) {
case Variant::ARRAY: { case Variant::ARRAY: {
// Repeat the key with every values // Repeat the key with every values
Array values = value; Array values = value;
for (int j = 0; j < values.size(); ++j) { for (int j = 0; j < values.size(); ++j) {
query += "&" + encoded_key + "=" + String(values[j]).percent_encode(); query += "&" + encoded_key + "=" + String(values[j]).http_escape();
} }
break; break;
} }
@ -636,7 +636,7 @@ String HTTPClient::query_string_from_dict(const Dictionary &p_dict) {
} }
default: { default: {
// Add the key-value pair // Add the key-value pair
query += "&" + encoded_key + "=" + String(value).percent_encode(); query += "&" + encoded_key + "=" + String(value).http_escape();
} }
} }
} }

View file

@ -3165,7 +3165,7 @@ String String::word_wrap(int p_chars_per_line) const {
return ret; return ret;
} }
String String::percent_encode() const { String String::http_escape() const {
const CharString temp = utf8(); const CharString temp = utf8();
String res; String res;
for (int i = 0; i < temp.length(); ++i) { for (int i = 0; i < temp.length(); ++i) {
@ -3189,7 +3189,7 @@ String String::percent_encode() const {
return res; return res;
} }
String String::percent_decode() const { String String::http_unescape() 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,6 +3727,68 @@ 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(".");

View file

@ -226,14 +226,17 @@ 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 percent_encode() const; String http_escape() const;
String percent_decode() const; String http_unescape() 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;

View file

@ -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().percent_encode(); args += "&filter=" + filter->get_text().http_escape();
} }
if (p_page > 0) { if (p_page > 0) {

View file

@ -1168,6 +1168,24 @@ 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;

View file

@ -5467,6 +5467,20 @@
["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",

View file

@ -228,14 +228,17 @@ 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_percent_decode(const godot_string *p_self); godot_string GDAPI godot_string_http_escape(const godot_string *p_self);
godot_string GDAPI godot_string_percent_encode(const godot_string *p_self); godot_string GDAPI godot_string_http_unescape(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);