mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 21:51:22 +00:00 
			
		
		
		
	Add proxy support for HTTPClient and the editor
				
					
				
			* Adds proxy related methods for `HTTPClient` and `HTTPRequest`
* Adds `network/http_proxy/{host,port}` editor settings
* Makes AssetLib and Export Template Manager proxy aware
			
			
This commit is contained in:
		
							parent
							
								
									3f137fb3a9
								
							
						
					
					
						commit
						1cada6bfa9
					
				
					 8 changed files with 186 additions and 12 deletions
				
			
		|  | @ -77,9 +77,21 @@ Error HTTPClient::connect_to_host(const String &p_host, int p_port, bool p_ssl, | ||||||
| 
 | 
 | ||||||
| 	connection = tcp_connection; | 	connection = tcp_connection; | ||||||
| 
 | 
 | ||||||
| 	if (conn_host.is_valid_ip_address()) { | 	if (ssl && https_proxy_port != -1) { | ||||||
|  | 		proxy_client.instance(); | ||||||
|  | 		server_host = https_proxy_host; | ||||||
|  | 		server_port = https_proxy_port; | ||||||
|  | 	} else if (!ssl && http_proxy_port != -1) { | ||||||
|  | 		server_host = http_proxy_host; | ||||||
|  | 		server_port = http_proxy_port; | ||||||
|  | 	} else { | ||||||
|  | 		server_host = conn_host; | ||||||
|  | 		server_port = conn_port; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (server_host.is_valid_ip_address()) { | ||||||
| 		// Host contains valid IP
 | 		// Host contains valid IP
 | ||||||
| 		Error err = tcp_connection->connect_to_host(IP_Address(conn_host), p_port); | 		Error err = tcp_connection->connect_to_host(IP_Address(server_host), server_port); | ||||||
| 		if (err) { | 		if (err) { | ||||||
| 			status = STATUS_CANT_CONNECT; | 			status = STATUS_CANT_CONNECT; | ||||||
| 			return err; | 			return err; | ||||||
|  | @ -88,7 +100,7 @@ Error HTTPClient::connect_to_host(const String &p_host, int p_port, bool p_ssl, | ||||||
| 		status = STATUS_CONNECTING; | 		status = STATUS_CONNECTING; | ||||||
| 	} else { | 	} else { | ||||||
| 		// Host contains hostname and needs to be resolved to IP
 | 		// Host contains hostname and needs to be resolved to IP
 | ||||||
| 		resolving = IP::get_singleton()->resolve_hostname_queue_item(conn_host); | 		resolving = IP::get_singleton()->resolve_hostname_queue_item(server_host); | ||||||
| 		status = STATUS_RESOLVING; | 		status = STATUS_RESOLVING; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -141,7 +153,12 @@ Error HTTPClient::request_raw(Method p_method, const String &p_url, const Vector | ||||||
| 	ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); | 	ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); | ||||||
| 	ERR_FAIL_COND_V(connection.is_null(), ERR_INVALID_DATA); | 	ERR_FAIL_COND_V(connection.is_null(), ERR_INVALID_DATA); | ||||||
| 
 | 
 | ||||||
| 	String request = String(_methods[p_method]) + " " + p_url + " HTTP/1.1\r\n"; | 	String uri = p_url; | ||||||
|  | 	if (!ssl && http_proxy_port != -1) { | ||||||
|  | 		uri = vformat("http://%s:%d%s", conn_host, conn_port, p_url); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	String request = String(_methods[p_method]) + " " + uri + " HTTP/1.1\r\n"; | ||||||
| 	bool add_host = true; | 	bool add_host = true; | ||||||
| 	bool add_clen = p_body.size() > 0; | 	bool add_clen = p_body.size() > 0; | ||||||
| 	bool add_uagent = true; | 	bool add_uagent = true; | ||||||
|  | @ -214,7 +231,12 @@ Error HTTPClient::request(Method p_method, const String &p_url, const Vector<Str | ||||||
| 	ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); | 	ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); | ||||||
| 	ERR_FAIL_COND_V(connection.is_null(), ERR_INVALID_DATA); | 	ERR_FAIL_COND_V(connection.is_null(), ERR_INVALID_DATA); | ||||||
| 
 | 
 | ||||||
| 	String request = String(_methods[p_method]) + " " + p_url + " HTTP/1.1\r\n"; | 	String uri = p_url; | ||||||
|  | 	if (!ssl && http_proxy_port != -1) { | ||||||
|  | 		uri = vformat("http://%s:%d%s", conn_host, conn_port, p_url); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	String request = String(_methods[p_method]) + " " + uri + " HTTP/1.1\r\n"; | ||||||
| 	bool add_host = true; | 	bool add_host = true; | ||||||
| 	bool add_uagent = true; | 	bool add_uagent = true; | ||||||
| 	bool add_accept = true; | 	bool add_accept = true; | ||||||
|  | @ -301,6 +323,7 @@ void HTTPClient::close() { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	connection.unref(); | 	connection.unref(); | ||||||
|  | 	proxy_client.unref(); | ||||||
| 	status = STATUS_DISCONNECTED; | 	status = STATUS_DISCONNECTED; | ||||||
| 	head_request = false; | 	head_request = false; | ||||||
| 	if (resolving != IP::RESOLVER_INVALID_ID) { | 	if (resolving != IP::RESOLVER_INVALID_ID) { | ||||||
|  | @ -337,7 +360,7 @@ Error HTTPClient::poll() { | ||||||
| 
 | 
 | ||||||
| 					Error err = ERR_BUG; // Should be at least one entry.
 | 					Error err = ERR_BUG; // Should be at least one entry.
 | ||||||
| 					while (ip_candidates.size() > 0) { | 					while (ip_candidates.size() > 0) { | ||||||
| 						err = tcp_connection->connect_to_host(ip_candidates.pop_front(), conn_port); | 						err = tcp_connection->connect_to_host(ip_candidates.pop_front(), server_port); | ||||||
| 						if (err == OK) { | 						if (err == OK) { | ||||||
| 							break; | 							break; | ||||||
| 						} | 						} | ||||||
|  | @ -366,7 +389,48 @@ Error HTTPClient::poll() { | ||||||
| 					return OK; | 					return OK; | ||||||
| 				} break; | 				} break; | ||||||
| 				case StreamPeerTCP::STATUS_CONNECTED: { | 				case StreamPeerTCP::STATUS_CONNECTED: { | ||||||
| 					if (ssl) { | 					if (ssl && proxy_client.is_valid()) { | ||||||
|  | 						Error err = proxy_client->poll(); | ||||||
|  | 						if (err == ERR_UNCONFIGURED) { | ||||||
|  | 							proxy_client->set_connection(tcp_connection); | ||||||
|  | 							const Vector<String> headers; | ||||||
|  | 							err = proxy_client->request(METHOD_CONNECT, vformat("%s:%d", conn_host, conn_port), headers); | ||||||
|  | 							if (err != OK) { | ||||||
|  | 								status = STATUS_CANT_CONNECT; | ||||||
|  | 								return err; | ||||||
|  | 							} | ||||||
|  | 						} else if (err != OK) { | ||||||
|  | 							status = STATUS_CANT_CONNECT; | ||||||
|  | 							return err; | ||||||
|  | 						} | ||||||
|  | 						switch (proxy_client->get_status()) { | ||||||
|  | 							case STATUS_REQUESTING: { | ||||||
|  | 								return OK; | ||||||
|  | 							} break; | ||||||
|  | 							case STATUS_BODY: { | ||||||
|  | 								proxy_client->read_response_body_chunk(); | ||||||
|  | 								return OK; | ||||||
|  | 							} break; | ||||||
|  | 							case STATUS_CONNECTED: { | ||||||
|  | 								if (proxy_client->get_response_code() != RESPONSE_OK) { | ||||||
|  | 									status = STATUS_CANT_CONNECT; | ||||||
|  | 									return ERR_CANT_CONNECT; | ||||||
|  | 								} | ||||||
|  | 								proxy_client.unref(); | ||||||
|  | 								return OK; | ||||||
|  | 							} | ||||||
|  | 							case STATUS_DISCONNECTED: | ||||||
|  | 							case STATUS_RESOLVING: | ||||||
|  | 							case STATUS_CONNECTING: { | ||||||
|  | 								status = STATUS_CANT_CONNECT; | ||||||
|  | 								ERR_FAIL_V(ERR_BUG); | ||||||
|  | 							} break; | ||||||
|  | 							default: { | ||||||
|  | 								status = STATUS_CANT_CONNECT; | ||||||
|  | 								return ERR_CANT_CONNECT; | ||||||
|  | 							} break; | ||||||
|  | 						} | ||||||
|  | 					} else if (ssl) { | ||||||
| 						Ref<StreamPeerSSL> ssl; | 						Ref<StreamPeerSSL> ssl; | ||||||
| 						if (!handshaking) { | 						if (!handshaking) { | ||||||
| 							// Connect the StreamPeerSSL and start handshaking
 | 							// Connect the StreamPeerSSL and start handshaking
 | ||||||
|  | @ -416,7 +480,7 @@ Error HTTPClient::poll() { | ||||||
| 					Error err = ERR_CANT_CONNECT; | 					Error err = ERR_CANT_CONNECT; | ||||||
| 					while (ip_candidates.size() > 0) { | 					while (ip_candidates.size() > 0) { | ||||||
| 						tcp_connection->disconnect_from_host(); | 						tcp_connection->disconnect_from_host(); | ||||||
| 						err = tcp_connection->connect_to_host(ip_candidates.pop_front(), conn_port); | 						err = tcp_connection->connect_to_host(ip_candidates.pop_front(), server_port); | ||||||
| 						if (err == OK) { | 						if (err == OK) { | ||||||
| 							return OK; | 							return OK; | ||||||
| 						} | 						} | ||||||
|  | @ -756,6 +820,9 @@ HTTPClient::HTTPClient() { | ||||||
| 	status = STATUS_DISCONNECTED; | 	status = STATUS_DISCONNECTED; | ||||||
| 	head_request = false; | 	head_request = false; | ||||||
| 	conn_port = -1; | 	conn_port = -1; | ||||||
|  | 	server_port = -1; | ||||||
|  | 	http_proxy_port = -1; | ||||||
|  | 	https_proxy_port = -1; | ||||||
| 	body_size = -1; | 	body_size = -1; | ||||||
| 	chunked = false; | 	chunked = false; | ||||||
| 	body_left = 0; | 	body_left = 0; | ||||||
|  | @ -775,6 +842,34 @@ HTTPClient::~HTTPClient() { | ||||||
| 
 | 
 | ||||||
| #endif // #ifndef JAVASCRIPT_ENABLED
 | #endif // #ifndef JAVASCRIPT_ENABLED
 | ||||||
| 
 | 
 | ||||||
|  | void HTTPClient::set_http_proxy(const String &p_host, int p_port) { | ||||||
|  | #ifdef JAVASCRIPT_ENABLED | ||||||
|  | 	WARN_PRINT("HTTP proxy feature is not available"); | ||||||
|  | #else | ||||||
|  | 	if (p_host.empty() || p_port == -1) { | ||||||
|  | 		http_proxy_host = ""; | ||||||
|  | 		http_proxy_port = -1; | ||||||
|  | 	} else { | ||||||
|  | 		http_proxy_host = p_host; | ||||||
|  | 		http_proxy_port = p_port; | ||||||
|  | 	} | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void HTTPClient::set_https_proxy(const String &p_host, int p_port) { | ||||||
|  | #ifdef JAVASCRIPT_ENABLED | ||||||
|  | 	WARN_PRINT("HTTPS proxy feature is not available"); | ||||||
|  | #else | ||||||
|  | 	if (p_host.empty() || p_port == -1) { | ||||||
|  | 		https_proxy_host = ""; | ||||||
|  | 		https_proxy_port = -1; | ||||||
|  | 	} else { | ||||||
|  | 		https_proxy_host = p_host; | ||||||
|  | 		https_proxy_port = p_port; | ||||||
|  | 	} | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
| String HTTPClient::query_string_from_dict(const Dictionary &p_dict) { | String HTTPClient::query_string_from_dict(const Dictionary &p_dict) { | ||||||
| 	String query = ""; | 	String query = ""; | ||||||
| 	Array keys = p_dict.keys(); | 	Array keys = p_dict.keys(); | ||||||
|  | @ -860,6 +955,9 @@ void HTTPClient::_bind_methods() { | ||||||
| 	ClassDB::bind_method(D_METHOD("get_status"), &HTTPClient::get_status); | 	ClassDB::bind_method(D_METHOD("get_status"), &HTTPClient::get_status); | ||||||
| 	ClassDB::bind_method(D_METHOD("poll"), &HTTPClient::poll); | 	ClassDB::bind_method(D_METHOD("poll"), &HTTPClient::poll); | ||||||
| 
 | 
 | ||||||
|  | 	ClassDB::bind_method(D_METHOD("set_http_proxy", "host", "port"), &HTTPClient::set_http_proxy); | ||||||
|  | 	ClassDB::bind_method(D_METHOD("set_https_proxy", "host", "port"), &HTTPClient::set_https_proxy); | ||||||
|  | 
 | ||||||
| 	ClassDB::bind_method(D_METHOD("query_string_from_dict", "fields"), &HTTPClient::query_string_from_dict); | 	ClassDB::bind_method(D_METHOD("query_string_from_dict", "fields"), &HTTPClient::query_string_from_dict); | ||||||
| 
 | 
 | ||||||
| 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "blocking_mode_enabled"), "set_blocking_mode", "is_blocking_mode_enabled"); | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "blocking_mode_enabled"), "set_blocking_mode", "is_blocking_mode_enabled"); | ||||||
|  |  | ||||||
|  | @ -160,8 +160,14 @@ private: | ||||||
| 	Status status; | 	Status status; | ||||||
| 	IP::ResolverID resolving; | 	IP::ResolverID resolving; | ||||||
| 	Array ip_candidates; | 	Array ip_candidates; | ||||||
| 	int conn_port; | 	int conn_port; // Server to make requests to.
 | ||||||
| 	String conn_host; | 	String conn_host; | ||||||
|  | 	int server_port; // Server to connect to (might be a proxy server).
 | ||||||
|  | 	String server_host; | ||||||
|  | 	int http_proxy_port; // Proxy server for http requests.
 | ||||||
|  | 	String http_proxy_host; | ||||||
|  | 	int https_proxy_port; // Proxy server for https requests.
 | ||||||
|  | 	String https_proxy_host; | ||||||
| 	bool ssl; | 	bool ssl; | ||||||
| 	bool ssl_verify_host; | 	bool ssl_verify_host; | ||||||
| 	bool blocking; | 	bool blocking; | ||||||
|  | @ -180,6 +186,7 @@ private: | ||||||
| 
 | 
 | ||||||
| 	Ref<StreamPeerTCP> tcp_connection; | 	Ref<StreamPeerTCP> tcp_connection; | ||||||
| 	Ref<StreamPeer> connection; | 	Ref<StreamPeer> connection; | ||||||
|  | 	Ref<HTTPClient> proxy_client; | ||||||
| 
 | 
 | ||||||
| 	int response_num; | 	int response_num; | ||||||
| 	Vector<String> response_headers; | 	Vector<String> response_headers; | ||||||
|  | @ -227,6 +234,10 @@ public: | ||||||
| 
 | 
 | ||||||
| 	String query_string_from_dict(const Dictionary &p_dict); | 	String query_string_from_dict(const Dictionary &p_dict); | ||||||
| 
 | 
 | ||||||
|  | 	// Use empty string or -1 to unset.
 | ||||||
|  | 	void set_http_proxy(const String &p_host, int p_port); | ||||||
|  | 	void set_https_proxy(const String &p_host, int p_port); | ||||||
|  | 
 | ||||||
| 	HTTPClient(); | 	HTTPClient(); | ||||||
| 	~HTTPClient(); | 	~HTTPClient(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -149,6 +149,24 @@ | ||||||
| 				Sends the body data raw, as a byte array and does not encode it in any way. | 				Sends the body data raw, as a byte array and does not encode it in any way. | ||||||
| 			</description> | 			</description> | ||||||
| 		</method> | 		</method> | ||||||
|  | 		<method name="set_http_proxy"> | ||||||
|  | 			<return type="void" /> | ||||||
|  | 			<argument index="0" name="host" type="String" /> | ||||||
|  | 			<argument index="1" name="port" type="int" /> | ||||||
|  | 			<description> | ||||||
|  | 				Sets the proxy server for HTTP requests. | ||||||
|  | 				The proxy server is unset if [code]host[/code] is empty or [code]port[/code] is -1. | ||||||
|  | 			</description> | ||||||
|  | 		</method> | ||||||
|  | 		<method name="set_https_proxy"> | ||||||
|  | 			<return type="void" /> | ||||||
|  | 			<argument index="0" name="host" type="String" /> | ||||||
|  | 			<argument index="1" name="port" type="int" /> | ||||||
|  | 			<description> | ||||||
|  | 				Sets the proxy server for HTTPS requests. | ||||||
|  | 				The proxy server is unset if [code]host[/code] is empty or [code]port[/code] is -1. | ||||||
|  | 			</description> | ||||||
|  | 		</method> | ||||||
| 	</methods> | 	</methods> | ||||||
| 	<members> | 	<members> | ||||||
| 		<member name="blocking_mode_enabled" type="bool" setter="set_blocking_mode" getter="is_blocking_mode_enabled" default="false"> | 		<member name="blocking_mode_enabled" type="bool" setter="set_blocking_mode" getter="is_blocking_mode_enabled" default="false"> | ||||||
|  |  | ||||||
|  | @ -121,6 +121,24 @@ | ||||||
| 				Returns [constant OK] if request is successfully created. (Does not imply that the server has responded), [constant ERR_UNCONFIGURED] if not in the tree, [constant ERR_BUSY] if still processing previous request, [constant ERR_INVALID_PARAMETER] if given string is not a valid URL format, or [constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot connect to host. | 				Returns [constant OK] if request is successfully created. (Does not imply that the server has responded), [constant ERR_UNCONFIGURED] if not in the tree, [constant ERR_BUSY] if still processing previous request, [constant ERR_INVALID_PARAMETER] if given string is not a valid URL format, or [constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot connect to host. | ||||||
| 			</description> | 			</description> | ||||||
| 		</method> | 		</method> | ||||||
|  | 		<method name="set_http_proxy"> | ||||||
|  | 			<return type="void" /> | ||||||
|  | 			<argument index="0" name="host" type="String" /> | ||||||
|  | 			<argument index="1" name="port" type="int" /> | ||||||
|  | 			<description> | ||||||
|  | 				Sets the proxy server for HTTP requests. | ||||||
|  | 				The proxy server is unset if [code]host[/code] is empty or [code]port[/code] is -1. | ||||||
|  | 			</description> | ||||||
|  | 		</method> | ||||||
|  | 		<method name="set_https_proxy"> | ||||||
|  | 			<return type="void" /> | ||||||
|  | 			<argument index="0" name="host" type="String" /> | ||||||
|  | 			<argument index="1" name="port" type="int" /> | ||||||
|  | 			<description> | ||||||
|  | 				Sets the proxy server for HTTPS requests. | ||||||
|  | 				The proxy server is unset if [code]host[/code] is empty or [code]port[/code] is -1. | ||||||
|  | 			</description> | ||||||
|  | 		</method> | ||||||
| 	</methods> | 	</methods> | ||||||
| 	<members> | 	<members> | ||||||
| 		<member name="body_size_limit" type="int" setter="set_body_size_limit" getter="get_body_size_limit" default="-1"> | 		<member name="body_size_limit" type="int" setter="set_body_size_limit" getter="get_body_size_limit" default="-1"> | ||||||
|  |  | ||||||
|  | @ -150,6 +150,11 @@ void ExportTemplateManager::_download_template(const String &p_url, bool p_skip_ | ||||||
| 	download_templates->set_download_file(EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_templates.tpz")); | 	download_templates->set_download_file(EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_templates.tpz")); | ||||||
| 	download_templates->set_use_threads(true); | 	download_templates->set_use_threads(true); | ||||||
| 
 | 
 | ||||||
|  | 	const String proxy_host = EDITOR_DEF("network/http_proxy/host", ""); | ||||||
|  | 	const int proxy_port = EDITOR_DEF("network/http_proxy/port", -1); | ||||||
|  | 	download_templates->set_http_proxy(proxy_host, proxy_port); | ||||||
|  | 	download_templates->set_https_proxy(proxy_host, proxy_port); | ||||||
|  | 
 | ||||||
| 	Error err = download_templates->request(p_url); | 	Error err = download_templates->request(p_url); | ||||||
| 	if (err != OK) { | 	if (err != OK) { | ||||||
| 		_set_current_progress_status(TTR("Error requesting URL:") + " " + p_url, true); | 		_set_current_progress_status(TTR("Error requesting URL:") + " " + p_url, true); | ||||||
|  |  | ||||||
|  | @ -37,6 +37,15 @@ | ||||||
| #include "editor/editor_settings.h" | #include "editor/editor_settings.h" | ||||||
| #include "editor/project_settings_editor.h" | #include "editor/project_settings_editor.h" | ||||||
| 
 | 
 | ||||||
|  | static inline void setup_http_request(HTTPRequest *request) { | ||||||
|  | 	request->set_use_threads(EDITOR_DEF("asset_library/use_threads", true)); | ||||||
|  | 
 | ||||||
|  | 	const String proxy_host = EDITOR_DEF("network/http_proxy/host", ""); | ||||||
|  | 	const int proxy_port = EDITOR_DEF("network/http_proxy/port", -1); | ||||||
|  | 	request->set_http_proxy(proxy_host, proxy_port); | ||||||
|  | 	request->set_https_proxy(proxy_host, proxy_port); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void EditorAssetLibraryItem::configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, const String &p_cost) { | void EditorAssetLibraryItem::configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, const String &p_cost) { | ||||||
| 	title->set_text(p_title); | 	title->set_text(p_title); | ||||||
| 	asset_id = p_asset_id; | 	asset_id = p_asset_id; | ||||||
|  | @ -543,7 +552,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() { | ||||||
| 	download = memnew(HTTPRequest); | 	download = memnew(HTTPRequest); | ||||||
| 	add_child(download); | 	add_child(download); | ||||||
| 	download->connect("request_completed", this, "_http_download_completed"); | 	download->connect("request_completed", this, "_http_download_completed"); | ||||||
| 	download->set_use_threads(EDITOR_DEF("asset_library/use_threads", true)); | 	setup_http_request(download); | ||||||
| 
 | 
 | ||||||
| 	download_error = memnew(AcceptDialog); | 	download_error = memnew(AcceptDialog); | ||||||
| 	add_child(download_error); | 	add_child(download_error); | ||||||
|  | @ -863,7 +872,7 @@ void EditorAssetLibrary::_request_image(ObjectID p_for, String p_image_url, Imag | ||||||
| 	iq.image_index = p_image_index; | 	iq.image_index = p_image_index; | ||||||
| 	iq.image_type = p_type; | 	iq.image_type = p_type; | ||||||
| 	iq.request = memnew(HTTPRequest); | 	iq.request = memnew(HTTPRequest); | ||||||
| 	iq.request->set_use_threads(EDITOR_DEF("asset_library/use_threads", true)); | 	setup_http_request(iq.request); | ||||||
| 
 | 
 | ||||||
| 	iq.target = p_for; | 	iq.target = p_for; | ||||||
| 	iq.queue_id = ++last_queue_id; | 	iq.queue_id = ++last_queue_id; | ||||||
|  | @ -1482,7 +1491,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { | ||||||
| 
 | 
 | ||||||
| 	request = memnew(HTTPRequest); | 	request = memnew(HTTPRequest); | ||||||
| 	add_child(request); | 	add_child(request); | ||||||
| 	request->set_use_threads(EDITOR_DEF("asset_library/use_threads", true)); | 	setup_http_request(request); | ||||||
| 	request->connect("request_completed", this, "_http_request_completed"); | 	request->connect("request_completed", this, "_http_request_completed"); | ||||||
| 
 | 
 | ||||||
| 	last_queue_id = 0; | 	last_queue_id = 0; | ||||||
|  |  | ||||||
|  | @ -463,6 +463,14 @@ int HTTPRequest::get_body_size() const { | ||||||
| 	return body_len; | 	return body_len; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void HTTPRequest::set_http_proxy(const String &p_host, int p_port) { | ||||||
|  | 	client->set_http_proxy(p_host, p_port); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void HTTPRequest::set_https_proxy(const String &p_host, int p_port) { | ||||||
|  | 	client->set_https_proxy(p_host, p_port); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void HTTPRequest::set_timeout(int p_timeout) { | void HTTPRequest::set_timeout(int p_timeout) { | ||||||
| 	ERR_FAIL_COND(p_timeout < 0); | 	ERR_FAIL_COND(p_timeout < 0); | ||||||
| 	timeout = p_timeout; | 	timeout = p_timeout; | ||||||
|  | @ -508,6 +516,9 @@ void HTTPRequest::_bind_methods() { | ||||||
| 	ClassDB::bind_method(D_METHOD("set_download_chunk_size"), &HTTPRequest::set_download_chunk_size); | 	ClassDB::bind_method(D_METHOD("set_download_chunk_size"), &HTTPRequest::set_download_chunk_size); | ||||||
| 	ClassDB::bind_method(D_METHOD("get_download_chunk_size"), &HTTPRequest::get_download_chunk_size); | 	ClassDB::bind_method(D_METHOD("get_download_chunk_size"), &HTTPRequest::get_download_chunk_size); | ||||||
| 
 | 
 | ||||||
|  | 	ClassDB::bind_method(D_METHOD("set_http_proxy", "host", "port"), &HTTPRequest::set_http_proxy); | ||||||
|  | 	ClassDB::bind_method(D_METHOD("set_https_proxy", "host", "port"), &HTTPRequest::set_https_proxy); | ||||||
|  | 
 | ||||||
| 	ClassDB::bind_method(D_METHOD("_timeout"), &HTTPRequest::_timeout); | 	ClassDB::bind_method(D_METHOD("_timeout"), &HTTPRequest::_timeout); | ||||||
| 
 | 
 | ||||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "download_file", PROPERTY_HINT_FILE), "set_download_file", "get_download_file"); | 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "download_file", PROPERTY_HINT_FILE), "set_download_file", "get_download_file"); | ||||||
|  |  | ||||||
|  | @ -146,6 +146,10 @@ public: | ||||||
| 	int get_downloaded_bytes() const; | 	int get_downloaded_bytes() const; | ||||||
| 	int get_body_size() const; | 	int get_body_size() const; | ||||||
| 
 | 
 | ||||||
|  | 	// Use empty string or -1 to unset.
 | ||||||
|  | 	void set_http_proxy(const String &p_host, int p_port); | ||||||
|  | 	void set_https_proxy(const String &p_host, int p_port); | ||||||
|  | 
 | ||||||
| 	HTTPRequest(); | 	HTTPRequest(); | ||||||
| 	~HTTPRequest(); | 	~HTTPRequest(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Haoyu Qiu
						Haoyu Qiu