summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorRémi Verschelde <remi@verschelde.fr>2016-05-05 09:30:33 +0200
committerRémi Verschelde <remi@verschelde.fr>2016-05-05 09:30:33 +0200
commitc71afda49916c61c4212bb5411af8d89124f8b81 (patch)
treea7a8a7674b4e82120c3e9a2fead0b5a261a1681e /core
parentc1b53a0c5da1c6cb7f8249b84f8238fbc3719b19 (diff)
parentab1da5dc1be0c24e0ac47c8e946372d8574ca575 (diff)
Merge pull request #4549 from AlexHolly/httpclient-rawbody-support
HTTPClient request with raw_array body
Diffstat (limited to 'core')
-rw-r--r--core/io/http_client.cpp58
-rw-r--r--core/io/http_client.h1
2 files changed, 57 insertions, 2 deletions
diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp
index d7098b4c43..680e0ef7f9 100644
--- a/core/io/http_client.cpp
+++ b/core/io/http_client.cpp
@@ -72,7 +72,6 @@ Error HTTPClient::connect(const String &p_host, int p_port, bool p_ssl,bool p_ve
return OK;
}
-
void HTTPClient::set_connection(const Ref<StreamPeer>& p_connection){
close();
@@ -80,12 +79,65 @@ void HTTPClient::set_connection(const Ref<StreamPeer>& p_connection){
}
-
Ref<StreamPeer> HTTPClient::get_connection() const {
return connection;
}
+Error HTTPClient::request_raw( Method p_method, const String& p_url, const Vector<String>& p_headers,const DVector<uint8_t>& p_body) {
+
+ ERR_FAIL_INDEX_V(p_method,METHOD_MAX,ERR_INVALID_PARAMETER);
+ ERR_FAIL_COND_V(status!=STATUS_CONNECTED,ERR_INVALID_PARAMETER);
+ ERR_FAIL_COND_V(connection.is_null(),ERR_INVALID_DATA);
+
+
+ static const char* _methods[METHOD_MAX]={
+ "GET",
+ "HEAD",
+ "POST",
+ "PUT",
+ "DELETE",
+ "OPTIONS",
+ "TRACE",
+ "CONNECT"};
+
+ String request=String(_methods[p_method])+" "+p_url+" HTTP/1.1\r\n";
+ request+="Host: "+conn_host+":"+itos(conn_port)+"\r\n";
+ bool add_clen=p_body.size()>0;
+ for(int i=0;i<p_headers.size();i++) {
+ request+=p_headers[i]+"\r\n";
+ if (add_clen && p_headers[i].find("Content-Length:")==0) {
+ add_clen=false;
+ }
+ }
+ if (add_clen) {
+ request+="Content-Length: "+itos(p_body.size())+"\r\n";
+ //should it add utf8 encoding? not sure
+ }
+ request+="\r\n";
+ CharString cs=request.utf8();
+
+ DVector<uint8_t> data;
+
+ //Maybe this goes faster somehow?
+ for(int i=0;i<cs.length();i++) {
+ data.append( cs[i] );
+ }
+ data.append_array( p_body );
+
+ DVector<uint8_t>::Read r = data.read();
+ Error err = connection->put_data(&r[0], data.size());
+
+ if (err) {
+ close();
+ status=STATUS_CONNECTION_ERROR;
+ return err;
+ }
+
+ status=STATUS_REQUESTING;
+
+ return OK;
+}
Error HTTPClient::request( Method p_method, const String& p_url, const Vector<String>& p_headers,const String& p_body) {
@@ -157,6 +209,7 @@ int HTTPClient::get_response_code() const {
return response_num;
}
+
Error HTTPClient::get_response_headers(List<String> *r_response) {
if (!response_headers.size())
@@ -586,6 +639,7 @@ void HTTPClient::_bind_methods() {
ObjectTypeDB::bind_method(_MD("connect:Error","host","port","use_ssl","verify_host"),&HTTPClient::connect,DEFVAL(false),DEFVAL(true));
ObjectTypeDB::bind_method(_MD("set_connection","connection:StreamPeer"),&HTTPClient::set_connection);
ObjectTypeDB::bind_method(_MD("get_connection:StreamPeer"),&HTTPClient::get_connection);
+ ObjectTypeDB::bind_method(_MD("request_raw","method","url","headers","body"),&HTTPClient::request_raw,DEFVAL(String()));
ObjectTypeDB::bind_method(_MD("request","method","url","headers","body"),&HTTPClient::request,DEFVAL(String()));
ObjectTypeDB::bind_method(_MD("send_body_text","body"),&HTTPClient::send_body_text);
ObjectTypeDB::bind_method(_MD("send_body_data","body"),&HTTPClient::send_body_data);
diff --git a/core/io/http_client.h b/core/io/http_client.h
index defde08524..a9cfb1ed73 100644
--- a/core/io/http_client.h
+++ b/core/io/http_client.h
@@ -170,6 +170,7 @@ public:
void set_connection(const Ref<StreamPeer>& p_connection);
Ref<StreamPeer> get_connection() const;
+ Error request_raw( Method p_method, const String& p_url, const Vector<String>& p_headers,const DVector<uint8_t>& p_body);
Error request( Method p_method, const String& p_url, const Vector<String>& p_headers,const String& p_body=String());
Error send_body_text(const String& p_body);
Error send_body_data(const ByteArray& p_body);