2016-06-18 14:46:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*  http_request.h                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                       This file is part of:                           */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                           GODOT ENGINE                                */  
						 
					
						
							
								
									
										
										
										
											2017-08-27 14:16:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*                      https://godotengine.org                          */  
						 
					
						
							
								
									
										
										
										
											2016-06-18 14:46:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2017-01-01 22:01:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur.                 */  
						 
					
						
							
								
									
										
										
										
											2017-04-08 00:11:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)    */  
						 
					
						
							
								
									
										
										
										
											2016-06-18 14:46:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Permission is hereby granted, free of charge, to any person obtaining */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* a copy of this software and associated documentation files (the       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* "Software"), to deal in the Software without restriction, including   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* without limitation the rights to use, copy, modify, merge, publish,   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* distribute, sublicense, and/or sell copies of the Software, and to    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* permit persons to whom the Software is furnished to do so, subject to */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* the following conditions:                                             */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* The above copyright notice and this permission notice shall be        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* included in all copies or substantial portions of the Software.       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifndef HTTPREQUEST_H 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define HTTPREQUEST_H 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "io/http_client.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "node.h" 
  
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "os/file_access.h" 
  
						 
					
						
							
								
									
										
										
										
											2016-07-24 16:09:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "os/thread.h" 
  
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  HTTPRequest  :  public  Node  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDCLASS ( HTTPRequest ,  Node ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								public :  
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									enum  Result  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_SUCCESS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_CHUNKED_BODY_SIZE_MISMATCH , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_CANT_CONNECT , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_CANT_RESOLVE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_CONNECTION_ERROR , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_SSL_HANDSHAKE_ERROR , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_NO_RESPONSE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_BODY_SIZE_LIMIT_EXCEEDED , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_REQUEST_FAILED , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										RESULT_DOWNLOAD_FILE_CANT_OPEN , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RESULT_DOWNLOAD_FILE_WRITE_ERROR , 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										RESULT_REDIRECT_LIMIT_REACHED 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								private :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  requesting ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  request_string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  url ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  port ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < String >  headers ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  validate_ssl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  use_ssl ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-31 17:59:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HTTPClient : : Method  method ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  request_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  request_sent ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < HTTPClient >  client ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-11 00:52:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PoolByteArray  body ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-24 16:09:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									volatile  bool  use_threads ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  got_response ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  response_code ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-07 18:25:37 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PoolVector < String >  response_headers ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  download_to_file ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									FileAccess  * file ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  body_len ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-24 16:09:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									volatile  int  downloaded ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									int  body_size_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  redirections ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HTTPClient : : Status  status ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  _update_connection ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  max_redirects ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  _redirect_request ( const  String  & p_new_url ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-24 16:09:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  _handle_response ( bool  * ret_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  _parse_url ( const  String  & p_url ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Error  _request ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-24 16:09:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									volatile  bool  thread_done ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									volatile  bool  thread_request_quit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Thread  * thread ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  _request_done ( int  p_status ,  int  p_code ,  const  PoolStringArray  & headers ,  const  PoolByteArray  & p_data ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-24 16:09:43 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  void  _thread_func ( void  * p_userdata ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								protected :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  _notification ( int  p_what ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static  void  _bind_methods ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								public :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Error  request ( const  String  & p_url ,  const  Vector < String >  & p_custom_headers  =  Vector < String > ( ) ,  bool  p_ssl_validate_domain  =  true ,  HTTPClient : : Method  p_method  =  HTTPClient : : METHOD_GET ,  const  String  & p_request_data  =  " " ) ;  //connects to a full url and perform request
 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									void  cancel_request ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HTTPClient : : Status  get_http_client_status ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  set_use_threads ( bool  p_use ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  is_using_threads ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									void  set_download_file ( const  String  & p_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  get_download_file ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									void  set_body_size_limit ( int  p_bytes ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  get_body_size_limit ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									void  set_max_redirects ( int  p_max ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  get_max_redirects ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  get_downloaded_bytes ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  get_body_size ( )  const ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									HTTPRequest ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-12 10:44:12 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									~ HTTPRequest ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-20 17:45:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								VARIANT_ENUM_CAST ( HTTPRequest : : Result ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-04 11:09:45 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif  // HTTPREQUEST_H