diff options
Diffstat (limited to 'scene/main/http_request.cpp')
| -rw-r--r-- | scene/main/http_request.cpp | 72 | 
1 files changed, 27 insertions, 45 deletions
| diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index da0169b60b..e4ed5c6e6c 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -5,8 +5,8 @@  /*                           GODOT ENGINE                                */  /*                      https://godotengine.org                          */  /*************************************************************************/ -/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ -/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */  /*                                                                       */  /* Permission is hereby granted, free of charge, to any person obtaining */  /* a copy of this software and associated documentation files (the       */ @@ -30,7 +30,7 @@  #include "http_request.h"  #include "core/io/compression.h" -#include "core/ustring.h" +#include "core/string/ustring.h"  void HTTPRequest::_redirect_request(const String &p_new_url) {  } @@ -49,7 +49,7 @@ Error HTTPRequest::_parse_url(const String &p_url) {  	got_response = false;  	body_len = -1;  	body.resize(0); -	downloaded = 0; +	downloaded.set(0);  	redirections = 0;  	String url_lower = url.to_lower(); @@ -159,11 +159,11 @@ Error HTTPRequest::request_raw(const String &p_url, const Vector<String> &p_cust  	requesting = true; -	if (use_threads) { -		thread_done = false; -		thread_request_quit = false; +	if (use_threads.is_set()) { +		thread_done.clear(); +		thread_request_quit.clear();  		client->set_blocking_mode(true); -		thread = Thread::create(_thread_func, this); +		thread.start(_thread_func, this);  	} else {  		client->set_blocking_mode(false);  		err = _request(); @@ -186,7 +186,7 @@ void HTTPRequest::_thread_func(void *p_userdata) {  	if (err != OK) {  		hr->call_deferred("_request_done", RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray());  	} else { -		while (!hr->thread_request_quit) { +		while (!hr->thread_request_quit.is_set()) {  			bool exit = hr->_update_connection();  			if (exit) {  				break; @@ -195,7 +195,7 @@ void HTTPRequest::_thread_func(void *p_userdata) {  		}  	} -	hr->thread_done = true; +	hr->thread_done.set();  }  void HTTPRequest::cancel_request() { @@ -205,13 +205,11 @@ void HTTPRequest::cancel_request() {  		return;  	} -	if (!use_threads) { +	if (!use_threads.is_set()) {  		set_process_internal(false);  	} else { -		thread_request_quit = true; -		Thread::wait_to_finish(thread); -		memdelete(thread); -		thread = nullptr; +		thread_request_quit.set(); +		thread.wait_to_finish();  	}  	if (file) { @@ -238,7 +236,7 @@ bool HTTPRequest::_handle_response(bool *ret_value) {  	List<String> rheaders;  	client->get_response_headers(&rheaders);  	response_headers.resize(0); -	downloaded = 0; +	downloaded.set(0);  	for (List<String>::Element *E = rheaders.front(); E; E = E->next()) {  		response_headers.push_back(E->get());  	} @@ -278,7 +276,7 @@ bool HTTPRequest::_handle_response(bool *ret_value) {  				got_response = false;  				body_len = -1;  				body.resize(0); -				downloaded = 0; +				downloaded.set(0);  				redirections = new_redirs;  				*ret_value = false;  				return true; @@ -337,7 +335,7 @@ bool HTTPRequest::_update_connection() {  				call_deferred("_request_done", RESULT_CHUNKED_BODY_SIZE_MISMATCH, response_code, response_headers, PackedByteArray());  				return true; -				// Request migh have been done +				// Request might have been done  			} else {  				// Did not request yet, do request @@ -389,9 +387,12 @@ bool HTTPRequest::_update_connection() {  			}  			client->poll(); +			if (client->get_status() != HTTPClient::STATUS_BODY) { +				return false; +			}  			PackedByteArray chunk = client->read_response_body_chunk(); -			downloaded += chunk.size(); +			downloaded.add(chunk.size());  			if (file) {  				const uint8_t *r = chunk.ptr(); @@ -404,19 +405,20 @@ bool HTTPRequest::_update_connection() {  				body.append_array(chunk);  			} -			if (body_size_limit >= 0 && downloaded > body_size_limit) { +			if (body_size_limit >= 0 && downloaded.get() > body_size_limit) {  				call_deferred("_request_done", RESULT_BODY_SIZE_LIMIT_EXCEEDED, response_code, response_headers, PackedByteArray());  				return true;  			}  			if (body_len >= 0) { -				if (downloaded == body_len) { +				if (downloaded.get() == body_len) {  					call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, body);  					return true;  				}  			} else if (client->get_status() == HTTPClient::STATUS_DISCONNECTED) {  				// We read till EOF, with no errors. Request is done.  				call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, body); +				return true;  			}  			return false; @@ -480,7 +482,7 @@ void HTTPRequest::_request_done(int p_status, int p_code, const PackedStringArra  void HTTPRequest::_notification(int p_what) {  	if (p_what == NOTIFICATION_INTERNAL_PROCESS) { -		if (use_threads) { +		if (use_threads.is_set()) {  			return;  		}  		bool done = _update_connection(); @@ -499,11 +501,11 @@ void HTTPRequest::_notification(int p_what) {  void HTTPRequest::set_use_threads(bool p_use) {  	ERR_FAIL_COND(get_http_client_status() != HTTPClient::STATUS_DISCONNECTED); -	use_threads = p_use; +	use_threads.set_to(p_use);  }  bool HTTPRequest::is_using_threads() const { -	return use_threads; +	return use_threads.is_set();  }  void HTTPRequest::set_accept_gzip(bool p_gzip) { @@ -557,7 +559,7 @@ int HTTPRequest::get_max_redirects() const {  }  int HTTPRequest::get_downloaded_bytes() const { -	return downloaded; +	return downloaded.get();  }  int HTTPRequest::get_body_size() const { @@ -640,31 +642,11 @@ void HTTPRequest::_bind_methods() {  }  HTTPRequest::HTTPRequest() { -	thread = nullptr; - -	port = 80; -	redirections = 0; -	max_redirects = 8; -	body_len = -1; -	got_response = false; -	validate_ssl = false; -	use_ssl = false; -	accept_gzip = true; -	response_code = 0; -	request_sent = false; -	requesting = false;  	client.instance(); -	use_threads = false; -	thread_done = false; -	downloaded = 0; -	body_size_limit = -1; -	file = nullptr; -  	timer = memnew(Timer);  	timer->set_one_shot(true);  	timer->connect("timeout", callable_mp(this, &HTTPRequest::_timeout));  	add_child(timer); -	timeout = 0;  }  HTTPRequest::~HTTPRequest() { |