Fork of my original MQTTGateway

Dependencies:   mbed-http

Committer:
vpcola
Date:
Sat Apr 08 14:43:14 2017 +0000
Revision:
0:a1734fe1ec4b
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vpcola 0:a1734fe1ec4b 1 #include "DownloadFile.h"
vpcola 0:a1734fe1ec4b 2 #include "https_request.h"
vpcola 0:a1734fe1ec4b 3
vpcola 0:a1734fe1ec4b 4 void dump_response(HttpResponse* res)
vpcola 0:a1734fe1ec4b 5 {
vpcola 0:a1734fe1ec4b 6 mbedtls_printf("\r\nStatus: %d - %s\r\n", res->get_status_code(), res->get_status_message().c_str());
vpcola 0:a1734fe1ec4b 7
vpcola 0:a1734fe1ec4b 8 mbedtls_printf("Headers:\r\n");
vpcola 0:a1734fe1ec4b 9 for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
vpcola 0:a1734fe1ec4b 10 mbedtls_printf("\t%s: %s\r\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
vpcola 0:a1734fe1ec4b 11 }
vpcola 0:a1734fe1ec4b 12 mbedtls_printf("\nBody (%d bytes):\r\n\r\n%s\r\n", res->get_body_length(), res->get_body_as_string().c_str());
vpcola 0:a1734fe1ec4b 13 }
vpcola 0:a1734fe1ec4b 14
vpcola 0:a1734fe1ec4b 15 static unsigned int base64enc_len(const char *str)
vpcola 0:a1734fe1ec4b 16 {
vpcola 0:a1734fe1ec4b 17 return (((strlen(str)-1)/3)+1)<<2;
vpcola 0:a1734fe1ec4b 18 }
vpcola 0:a1734fe1ec4b 19
vpcola 0:a1734fe1ec4b 20 static void base64enc(const char *input, unsigned int length, char *output)
vpcola 0:a1734fe1ec4b 21 {
vpcola 0:a1734fe1ec4b 22 static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
vpcola 0:a1734fe1ec4b 23 unsigned int c, c1, c2, c3;
vpcola 0:a1734fe1ec4b 24 for(unsigned int i = 0, j = 0; i<length; i+=3,j+=4) {
vpcola 0:a1734fe1ec4b 25 c1 = ((((unsigned char)*((unsigned char *)&input[i]))));
vpcola 0:a1734fe1ec4b 26 c2 = (length>i+1)?((((unsigned char)*((unsigned char *)&input[i+1])))):0;
vpcola 0:a1734fe1ec4b 27 c3 = (length>i+2)?((((unsigned char)*((unsigned char *)&input[i+2])))):0;
vpcola 0:a1734fe1ec4b 28
vpcola 0:a1734fe1ec4b 29 c = ((c1 & 0xFC) >> 2);
vpcola 0:a1734fe1ec4b 30 output[j+0] = base64[c];
vpcola 0:a1734fe1ec4b 31 c = ((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4);
vpcola 0:a1734fe1ec4b 32 output[j+1] = base64[c];
vpcola 0:a1734fe1ec4b 33 c = ((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6);
vpcola 0:a1734fe1ec4b 34 output[j+2] = (length>i+1)?base64[c]:'=';
vpcola 0:a1734fe1ec4b 35 c = (c3 & 0x3F);
vpcola 0:a1734fe1ec4b 36 output[j+3] = (length>i+2)?base64[c]:'=';
vpcola 0:a1734fe1ec4b 37 }
vpcola 0:a1734fe1ec4b 38 output[(((length-1)/3)+1)<<2] = '\0';
vpcola 0:a1734fe1ec4b 39 }
vpcola 0:a1734fe1ec4b 40
vpcola 0:a1734fe1ec4b 41 static string encode(const string& str)
vpcola 0:a1734fe1ec4b 42 {
vpcola 0:a1734fe1ec4b 43 char* out = new char[ base64enc_len(str.c_str()) ];
vpcola 0:a1734fe1ec4b 44 base64enc(str.c_str(), str.length(), out);
vpcola 0:a1734fe1ec4b 45 string res(out);
vpcola 0:a1734fe1ec4b 46 delete[] out;
vpcola 0:a1734fe1ec4b 47 return res;
vpcola 0:a1734fe1ec4b 48 }
vpcola 0:a1734fe1ec4b 49
vpcola 0:a1734fe1ec4b 50 void DownloadFile::basic_auth(const char * user, const char * password)
vpcola 0:a1734fe1ec4b 51 {
vpcola 0:a1734fe1ec4b 52 authstr = user;
vpcola 0:a1734fe1ec4b 53 authstr += ":";
vpcola 0:a1734fe1ec4b 54 authstr += password;
vpcola 0:a1734fe1ec4b 55 printf("Auth Str : %s\r\n", authstr.c_str());
vpcola 0:a1734fe1ec4b 56
vpcola 0:a1734fe1ec4b 57 std::string base64str = encode(authstr);
vpcola 0:a1734fe1ec4b 58 printf("Base64 conversion : %s\r\n", base64str.c_str());
vpcola 0:a1734fe1ec4b 59
vpcola 0:a1734fe1ec4b 60 authstr = "Basic " + base64str;
vpcola 0:a1734fe1ec4b 61 printf("Authorization: %s\r\n", authstr.c_str());
vpcola 0:a1734fe1ec4b 62 }
vpcola 0:a1734fe1ec4b 63
vpcola 0:a1734fe1ec4b 64 HttpResponse* DownloadFile::get_file(const char * url)
vpcola 0:a1734fe1ec4b 65 {
vpcola 0:a1734fe1ec4b 66 if (url == NULL)
vpcola 0:a1734fe1ec4b 67 return NULL;
vpcola 0:a1734fe1ec4b 68
vpcola 0:a1734fe1ec4b 69 if(get_req != NULL)
vpcola 0:a1734fe1ec4b 70 delete get_req;
vpcola 0:a1734fe1ec4b 71
vpcola 0:a1734fe1ec4b 72 HttpResponse* get_res;
vpcola 0:a1734fe1ec4b 73 Callback<void(const char *at, size_t length)> aBodyCallback = NULL;
vpcola 0:a1734fe1ec4b 74
vpcola 0:a1734fe1ec4b 75 if (fp != NULL)
vpcola 0:a1734fe1ec4b 76 aBodyCallback = mbed::callback(this, &DownloadFile::body_callback);
vpcola 0:a1734fe1ec4b 77
vpcola 0:a1734fe1ec4b 78 if (useSSL)
vpcola 0:a1734fe1ec4b 79 {
vpcola 0:a1734fe1ec4b 80 get_req_ssl = new HttpsRequest(network,
vpcola 0:a1734fe1ec4b 81 pem, HTTP_GET,
vpcola 0:a1734fe1ec4b 82 url,
vpcola 0:a1734fe1ec4b 83 aBodyCallback);
vpcola 0:a1734fe1ec4b 84
vpcola 0:a1734fe1ec4b 85 if (!authstr.empty())
vpcola 0:a1734fe1ec4b 86 get_req_ssl->set_header("Authorization", authstr.c_str());
vpcola 0:a1734fe1ec4b 87
vpcola 0:a1734fe1ec4b 88 get_req_ssl->set_debug(true);
vpcola 0:a1734fe1ec4b 89
vpcola 0:a1734fe1ec4b 90 get_res = get_req_ssl->send();
vpcola 0:a1734fe1ec4b 91
vpcola 0:a1734fe1ec4b 92 }
vpcola 0:a1734fe1ec4b 93 else
vpcola 0:a1734fe1ec4b 94 {
vpcola 0:a1734fe1ec4b 95 get_req = new HttpRequest(network,
vpcola 0:a1734fe1ec4b 96 HTTP_GET,
vpcola 0:a1734fe1ec4b 97 url,
vpcola 0:a1734fe1ec4b 98 aBodyCallback);
vpcola 0:a1734fe1ec4b 99
vpcola 0:a1734fe1ec4b 100 if (!authstr.empty())
vpcola 0:a1734fe1ec4b 101 get_req->set_header("Authorization", authstr.c_str());
vpcola 0:a1734fe1ec4b 102
vpcola 0:a1734fe1ec4b 103 get_res = get_req->send();
vpcola 0:a1734fe1ec4b 104 }
vpcola 0:a1734fe1ec4b 105
vpcola 0:a1734fe1ec4b 106 if (!get_res) {
vpcola 0:a1734fe1ec4b 107 printf("HttpRequest failed (error code %d)\r\n", get_req->get_error());
vpcola 0:a1734fe1ec4b 108 return NULL;
vpcola 0:a1734fe1ec4b 109 }
vpcola 0:a1734fe1ec4b 110
vpcola 0:a1734fe1ec4b 111 //dump_response(get_res);
vpcola 0:a1734fe1ec4b 112
vpcola 0:a1734fe1ec4b 113 return get_res;
vpcola 0:a1734fe1ec4b 114 }
vpcola 0:a1734fe1ec4b 115
vpcola 0:a1734fe1ec4b 116 std::string DownloadFile::get_file_content()
vpcola 0:a1734fe1ec4b 117 {
vpcola 0:a1734fe1ec4b 118 size_t numread;
vpcola 0:a1734fe1ec4b 119
vpcola 0:a1734fe1ec4b 120 if (fp == NULL)
vpcola 0:a1734fe1ec4b 121 return "";
vpcola 0:a1734fe1ec4b 122
vpcola 0:a1734fe1ec4b 123 // plain old c ..
vpcola 0:a1734fe1ec4b 124 // Determine file size
vpcola 0:a1734fe1ec4b 125 fseek(fp, 0, SEEK_END);
vpcola 0:a1734fe1ec4b 126 size_t size = ftell(fp);
vpcola 0:a1734fe1ec4b 127
vpcola 0:a1734fe1ec4b 128 char* dummy = new char[(sizeof(char) * size) + 1];
vpcola 0:a1734fe1ec4b 129
vpcola 0:a1734fe1ec4b 130 rewind(fp);
vpcola 0:a1734fe1ec4b 131 numread = fread(dummy, sizeof(char), size, fp);
vpcola 0:a1734fe1ec4b 132 // Make sure its NULL terminanted
vpcola 0:a1734fe1ec4b 133 dummy[numread] = 0;
vpcola 0:a1734fe1ec4b 134
vpcola 0:a1734fe1ec4b 135 // create a return string
vpcola 0:a1734fe1ec4b 136 std::string retstr = std::string((const char *) dummy);
vpcola 0:a1734fe1ec4b 137
vpcola 0:a1734fe1ec4b 138 delete[] dummy;
vpcola 0:a1734fe1ec4b 139
vpcola 0:a1734fe1ec4b 140 return retstr;
vpcola 0:a1734fe1ec4b 141 }
vpcola 0:a1734fe1ec4b 142
vpcola 0:a1734fe1ec4b 143 void DownloadFile::body_callback(const char* data, size_t data_len)
vpcola 0:a1734fe1ec4b 144 {
vpcola 0:a1734fe1ec4b 145 // do something with the data
vpcola 0:a1734fe1ec4b 146 if (fp != NULL) {
vpcola 0:a1734fe1ec4b 147 size_written += fwrite((const void *) data, sizeof(char), data_len, fp);
vpcola 0:a1734fe1ec4b 148 }
vpcola 0:a1734fe1ec4b 149 }