mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:02:45 +00:00 
			
		
		
		
	AK+LibHTTP: Ensure plus signs are percent encoded in query string
Adds a new optional parameter 'reserved_chars' to AK::URL::percent_encode. This new optional parameter allows the caller to specify custom characters to be percent encoded. This is then used to percent encode plus signs by HttpRequest::to_raw_request.
This commit is contained in:
		
							parent
							
								
									58398b1e12
								
							
						
					
					
						commit
						737f5b26b7
					
				
					 3 changed files with 7 additions and 7 deletions
				
			
		|  | @ -395,19 +395,19 @@ constexpr bool code_point_is_in_percent_encode_set(u32 code_point, URL::PercentE | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void URL::append_percent_encoded_if_necessary(StringBuilder& builder, u32 code_point, URL::PercentEncodeSet set) | void URL::append_percent_encoded_if_necessary(StringBuilder& builder, u32 code_point, URL::PercentEncodeSet set, StringView reserved_chars) | ||||||
| { | { | ||||||
|     if (code_point_is_in_percent_encode_set(code_point, set)) |     if (code_point_is_in_percent_encode_set(code_point, set) || (!reserved_chars.is_null() && reserved_chars.contains(code_point))) | ||||||
|         append_percent_encoded(builder, code_point); |         append_percent_encoded(builder, code_point); | ||||||
|     else |     else | ||||||
|         builder.append_code_point(code_point); |         builder.append_code_point(code_point); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| String URL::percent_encode(StringView input, URL::PercentEncodeSet set) | String URL::percent_encode(StringView input, URL::PercentEncodeSet set, StringView reserved_chars) | ||||||
| { | { | ||||||
|     StringBuilder builder; |     StringBuilder builder; | ||||||
|     for (auto code_point : Utf8View(input)) { |     for (auto code_point : Utf8View(input)) { | ||||||
|         append_percent_encoded_if_necessary(builder, code_point, set); |         append_percent_encoded_if_necessary(builder, code_point, set, reserved_chars); | ||||||
|     } |     } | ||||||
|     return builder.to_string(); |     return builder.to_string(); | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								AK/URL.h
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								AK/URL.h
									
										
									
									
									
								
							|  | @ -104,7 +104,7 @@ public: | ||||||
|     static u16 default_port_for_scheme(StringView); |     static u16 default_port_for_scheme(StringView); | ||||||
|     static bool is_special_scheme(StringView); |     static bool is_special_scheme(StringView); | ||||||
| 
 | 
 | ||||||
|     static String percent_encode(StringView input, PercentEncodeSet set = PercentEncodeSet::Userinfo); |     static String percent_encode(StringView input, PercentEncodeSet set = PercentEncodeSet::Userinfo, StringView reserved_chars = {}); | ||||||
|     static String percent_decode(StringView input); |     static String percent_decode(StringView input); | ||||||
| 
 | 
 | ||||||
|     bool operator==(URL const& other) const { return equals(other, ExcludeFragment::No); } |     bool operator==(URL const& other) const { return equals(other, ExcludeFragment::No); } | ||||||
|  | @ -122,7 +122,7 @@ private: | ||||||
|     bool compute_validity() const; |     bool compute_validity() const; | ||||||
|     String serialize_data_url() const; |     String serialize_data_url() const; | ||||||
| 
 | 
 | ||||||
|     static void append_percent_encoded_if_necessary(StringBuilder&, u32 code_point, PercentEncodeSet set = PercentEncodeSet::Userinfo); |     static void append_percent_encoded_if_necessary(StringBuilder&, u32 code_point, PercentEncodeSet set = PercentEncodeSet::Userinfo, StringView reserved_chars = {}); | ||||||
|     static void append_percent_encoded(StringBuilder&, u32 code_point); |     static void append_percent_encoded(StringBuilder&, u32 code_point); | ||||||
| 
 | 
 | ||||||
|     bool m_valid { false }; |     bool m_valid { false }; | ||||||
|  |  | ||||||
|  | @ -37,7 +37,7 @@ ByteBuffer HttpRequest::to_raw_request() const | ||||||
|     builder.append(URL::percent_encode(m_url.path(), URL::PercentEncodeSet::EncodeURI)); |     builder.append(URL::percent_encode(m_url.path(), URL::PercentEncodeSet::EncodeURI)); | ||||||
|     if (!m_url.query().is_empty()) { |     if (!m_url.query().is_empty()) { | ||||||
|         builder.append('?'); |         builder.append('?'); | ||||||
|         builder.append(URL::percent_encode(m_url.query(), URL::PercentEncodeSet::EncodeURI)); |         builder.append(URL::percent_encode(m_url.query(), URL::PercentEncodeSet::EncodeURI, "+"sv)); | ||||||
|     } |     } | ||||||
|     builder.append(" HTTP/1.1\r\nHost: "); |     builder.append(" HTTP/1.1\r\nHost: "); | ||||||
|     builder.append(m_url.host()); |     builder.append(m_url.host()); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 GeekFiftyFive
						GeekFiftyFive