Vergil Cola
/
MQTTGateway2
Fork of my original MQTTGateway
Diff: DownloadFile.cpp
- Revision:
- 0:a1734fe1ec4b
diff -r 000000000000 -r a1734fe1ec4b DownloadFile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DownloadFile.cpp Sat Apr 08 14:43:14 2017 +0000 @@ -0,0 +1,149 @@ +#include "DownloadFile.h" +#include "https_request.h" + +void dump_response(HttpResponse* res) +{ + mbedtls_printf("\r\nStatus: %d - %s\r\n", res->get_status_code(), res->get_status_message().c_str()); + + mbedtls_printf("Headers:\r\n"); + for (size_t ix = 0; ix < res->get_headers_length(); ix++) { + mbedtls_printf("\t%s: %s\r\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str()); + } + mbedtls_printf("\nBody (%d bytes):\r\n\r\n%s\r\n", res->get_body_length(), res->get_body_as_string().c_str()); +} + +static unsigned int base64enc_len(const char *str) +{ + return (((strlen(str)-1)/3)+1)<<2; +} + +static void base64enc(const char *input, unsigned int length, char *output) +{ + static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + unsigned int c, c1, c2, c3; + for(unsigned int i = 0, j = 0; i<length; i+=3,j+=4) { + c1 = ((((unsigned char)*((unsigned char *)&input[i])))); + c2 = (length>i+1)?((((unsigned char)*((unsigned char *)&input[i+1])))):0; + c3 = (length>i+2)?((((unsigned char)*((unsigned char *)&input[i+2])))):0; + + c = ((c1 & 0xFC) >> 2); + output[j+0] = base64[c]; + c = ((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4); + output[j+1] = base64[c]; + c = ((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6); + output[j+2] = (length>i+1)?base64[c]:'='; + c = (c3 & 0x3F); + output[j+3] = (length>i+2)?base64[c]:'='; + } + output[(((length-1)/3)+1)<<2] = '\0'; +} + +static string encode(const string& str) +{ + char* out = new char[ base64enc_len(str.c_str()) ]; + base64enc(str.c_str(), str.length(), out); + string res(out); + delete[] out; + return res; +} + +void DownloadFile::basic_auth(const char * user, const char * password) +{ + authstr = user; + authstr += ":"; + authstr += password; + printf("Auth Str : %s\r\n", authstr.c_str()); + + std::string base64str = encode(authstr); + printf("Base64 conversion : %s\r\n", base64str.c_str()); + + authstr = "Basic " + base64str; + printf("Authorization: %s\r\n", authstr.c_str()); +} + +HttpResponse* DownloadFile::get_file(const char * url) +{ + if (url == NULL) + return NULL; + + if(get_req != NULL) + delete get_req; + + HttpResponse* get_res; + Callback<void(const char *at, size_t length)> aBodyCallback = NULL; + + if (fp != NULL) + aBodyCallback = mbed::callback(this, &DownloadFile::body_callback); + + if (useSSL) + { + get_req_ssl = new HttpsRequest(network, + pem, HTTP_GET, + url, + aBodyCallback); + + if (!authstr.empty()) + get_req_ssl->set_header("Authorization", authstr.c_str()); + + get_req_ssl->set_debug(true); + + get_res = get_req_ssl->send(); + + } + else + { + get_req = new HttpRequest(network, + HTTP_GET, + url, + aBodyCallback); + + if (!authstr.empty()) + get_req->set_header("Authorization", authstr.c_str()); + + get_res = get_req->send(); + } + + if (!get_res) { + printf("HttpRequest failed (error code %d)\r\n", get_req->get_error()); + return NULL; + } + + //dump_response(get_res); + + return get_res; +} + +std::string DownloadFile::get_file_content() +{ + size_t numread; + + if (fp == NULL) + return ""; + + // plain old c .. + // Determine file size + fseek(fp, 0, SEEK_END); + size_t size = ftell(fp); + + char* dummy = new char[(sizeof(char) * size) + 1]; + + rewind(fp); + numread = fread(dummy, sizeof(char), size, fp); + // Make sure its NULL terminanted + dummy[numread] = 0; + + // create a return string + std::string retstr = std::string((const char *) dummy); + + delete[] dummy; + + return retstr; +} + +void DownloadFile::body_callback(const char* data, size_t data_len) +{ + // do something with the data + if (fp != NULL) { + size_written += fwrite((const void *) data, sizeof(char), data_len, fp); + } +}