storage/plugins/CurlStorage: URL-encode paths in CurlStorage::MapUTF8
When using a database that was not created with a WebDAV music_directory (i.e., if using a remote database, on which updates happen locally) and using the Curl storage plugin, MPD would previously send GET requests that had unescaped spaces in them. This change uses Curl's URL-encode API to solve this.
This commit is contained in:
		 Joshua Wise
					Joshua Wise
				
			
				
					committed by
					
						 Max Kellermann
						Max Kellermann
					
				
			
			
				
	
			
			
			 Max Kellermann
						Max Kellermann
					
				
			
						parent
						
							147872fe97
						
					
				
				
					commit
					29f78b18b1
				
			
							
								
								
									
										2
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,4 +1,6 @@ | ||||
| ver 0.20.22 (not yet released) | ||||
| * storage | ||||
|   - curl: URL-encode paths | ||||
|  | ||||
| ver 0.20.21 (2018/08/17) | ||||
| * database | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
| #include "thread/Mutex.hxx" | ||||
| #include "thread/Cond.hxx" | ||||
| #include "util/ASCII.hxx" | ||||
| #include "util/IterableSplitString.hxx" | ||||
| #include "util/RuntimeError.hxx" | ||||
| #include "util/StringCompare.hxx" | ||||
| #include "util/StringFormat.hxx" | ||||
| @@ -79,9 +80,18 @@ CurlStorage::MapUTF8(const char *uri_utf8) const noexcept | ||||
| 	if (StringIsEmpty(uri_utf8)) | ||||
| 		return base; | ||||
|  | ||||
| 	// TODO: escape the given URI | ||||
| 	CurlEasy easy; | ||||
| 	std::string path_esc; | ||||
|  | ||||
| 	return PathTraitsUTF8::Build(base.c_str(), uri_utf8); | ||||
| 	for (auto elt: IterableSplitString(uri_utf8, '/')) { | ||||
| 		char *elt_esc = easy.Escape(elt.data, elt.size); | ||||
| 		if (!path_esc.empty()) | ||||
| 			path_esc.push_back('/'); | ||||
| 		path_esc += elt_esc; | ||||
| 		curl_free(elt_esc); | ||||
| 	} | ||||
|  | ||||
| 	return PathTraitsUTF8::Build(base.c_str(), path_esc.c_str()); | ||||
| } | ||||
|  | ||||
| const char * | ||||
|   | ||||
		Reference in New Issue
	
	Block a user