Browse Source

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

This reverts commit b76ee30917c63211ac9e94a21bebbddf518d169f.
Pedro J. Estébanez 7 years ago
parent
commit
00e98458ba

+ 3 - 3
core/io/http_client.cpp

@@ -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();
 			}
 			}
 		}
 		}
 	}
 	}

+ 64 - 2
core/ustring.cpp

@@ -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(".");

+ 5 - 2
core/ustring.h

@@ -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 percent_decode() const;
+	String http_escape() 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;

+ 1 - 1
editor/plugins/asset_library_editor_plugin.cpp

@@ -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) {

+ 18 - 0
modules/gdnative/gdnative/string.cpp

@@ -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;

+ 14 - 0
modules/gdnative/gdnative_api.json

@@ -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",

+ 5 - 2
modules/gdnative/include/gdnative/string.h

@@ -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_percent_encode(const godot_string *p_self);
+godot_string GDAPI godot_string_http_escape(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);