Preliminary main mbed library for nexpaq development

Committer:
nexpaq
Date:
Fri Nov 04 20:54:50 2016 +0000
Revision:
1:d96dbedaebdb
Parent:
0:6c56fb4bc5f0
Removed extra directories for other platforms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nexpaq 0:6c56fb4bc5f0 1 #include "HTTPSClient.h"
nexpaq 0:6c56fb4bc5f0 2 #include "HTTPHeader.h"
nexpaq 0:6c56fb4bc5f0 3 #include <string>
nexpaq 0:6c56fb4bc5f0 4 #include <cstring>
nexpaq 0:6c56fb4bc5f0 5 #include "mbed.h"
nexpaq 0:6c56fb4bc5f0 6 #include <stdlib.h>
nexpaq 0:6c56fb4bc5f0 7 #include <stdio.h>
nexpaq 0:6c56fb4bc5f0 8
nexpaq 0:6c56fb4bc5f0 9 using std::memset;
nexpaq 0:6c56fb4bc5f0 10 using std::memcpy;
nexpaq 0:6c56fb4bc5f0 11 using std::string;
nexpaq 0:6c56fb4bc5f0 12
nexpaq 0:6c56fb4bc5f0 13 const static int HTTPS_PORT = 443;
nexpaq 0:6c56fb4bc5f0 14 char buf[256];
nexpaq 0:6c56fb4bc5f0 15
nexpaq 0:6c56fb4bc5f0 16 HTTPSClient::HTTPSClient() :
nexpaq 0:6c56fb4bc5f0 17 _is_connected(false),
nexpaq 0:6c56fb4bc5f0 18 _ssl_ctx(),
nexpaq 0:6c56fb4bc5f0 19 _ssl(),
nexpaq 0:6c56fb4bc5f0 20 _host() {
nexpaq 0:6c56fb4bc5f0 21 }
nexpaq 0:6c56fb4bc5f0 22
nexpaq 0:6c56fb4bc5f0 23 HTTPSClient::~HTTPSClient() {
nexpaq 0:6c56fb4bc5f0 24 close();
nexpaq 0:6c56fb4bc5f0 25 }
nexpaq 0:6c56fb4bc5f0 26
nexpaq 0:6c56fb4bc5f0 27 int HTTPSClient::connect(const char* host) {
nexpaq 0:6c56fb4bc5f0 28 if (init_socket(SOCK_STREAM) < 0)
nexpaq 0:6c56fb4bc5f0 29 return -1;
nexpaq 0:6c56fb4bc5f0 30
nexpaq 0:6c56fb4bc5f0 31 if (set_address(host, HTTPS_PORT) != 0)
nexpaq 0:6c56fb4bc5f0 32 return -1;
nexpaq 0:6c56fb4bc5f0 33
nexpaq 0:6c56fb4bc5f0 34 if (lwip_connect(_sock_fd, (const struct sockaddr *) &_remoteHost, sizeof(_remoteHost)) < 0) {
nexpaq 0:6c56fb4bc5f0 35 close();
nexpaq 0:6c56fb4bc5f0 36 return -1;
nexpaq 0:6c56fb4bc5f0 37 }
nexpaq 0:6c56fb4bc5f0 38
nexpaq 0:6c56fb4bc5f0 39 if(ssl_ctx_new(&_ssl_ctx, SSL_SERVER_VERIFY_LATER, SSL_DEFAULT_CLNT_SESS) != &_ssl_ctx)
nexpaq 0:6c56fb4bc5f0 40 return -1;
nexpaq 0:6c56fb4bc5f0 41
nexpaq 0:6c56fb4bc5f0 42 _ssl.ssl_ctx = &_ssl_ctx;
nexpaq 0:6c56fb4bc5f0 43
nexpaq 0:6c56fb4bc5f0 44 if(ssl_client_new(&_ssl, _sock_fd, NULL, 0) == NULL)
nexpaq 0:6c56fb4bc5f0 45 {
nexpaq 0:6c56fb4bc5f0 46 close();
nexpaq 0:6c56fb4bc5f0 47 return -1;
nexpaq 0:6c56fb4bc5f0 48 }
nexpaq 0:6c56fb4bc5f0 49 if(_ssl.hs_status != SSL_OK)
nexpaq 0:6c56fb4bc5f0 50 {
nexpaq 0:6c56fb4bc5f0 51 close();
nexpaq 0:6c56fb4bc5f0 52 return -1;
nexpaq 0:6c56fb4bc5f0 53 }
nexpaq 0:6c56fb4bc5f0 54
nexpaq 0:6c56fb4bc5f0 55 _is_connected = true;
nexpaq 0:6c56fb4bc5f0 56 _host = host;
nexpaq 0:6c56fb4bc5f0 57 return 0;
nexpaq 0:6c56fb4bc5f0 58 }
nexpaq 0:6c56fb4bc5f0 59
nexpaq 0:6c56fb4bc5f0 60 bool HTTPSClient::is_connected(void) {
nexpaq 0:6c56fb4bc5f0 61 return _is_connected;
nexpaq 0:6c56fb4bc5f0 62 }
nexpaq 0:6c56fb4bc5f0 63
nexpaq 0:6c56fb4bc5f0 64 int HTTPSClient::send(char* data, int length) {
nexpaq 0:6c56fb4bc5f0 65 if ((_sock_fd < 0) || !_is_connected)
nexpaq 0:6c56fb4bc5f0 66 return -1;
nexpaq 0:6c56fb4bc5f0 67
nexpaq 0:6c56fb4bc5f0 68 return ssl_write(&_ssl, (uint8_t*)data, length);
nexpaq 0:6c56fb4bc5f0 69 }
nexpaq 0:6c56fb4bc5f0 70
nexpaq 0:6c56fb4bc5f0 71
nexpaq 0:6c56fb4bc5f0 72
nexpaq 0:6c56fb4bc5f0 73 HTTPHeader HTTPSClient::get(char *request)
nexpaq 0:6c56fb4bc5f0 74 {
nexpaq 0:6c56fb4bc5f0 75 if((_sock_fd < 0) || !_is_connected)
nexpaq 0:6c56fb4bc5f0 76 return HTTPHeader();
nexpaq 0:6c56fb4bc5f0 77
nexpaq 0:6c56fb4bc5f0 78 sprintf(buf, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", request, _host.c_str());
nexpaq 0:6c56fb4bc5f0 79 printf("buf=%s\n", buf);
nexpaq 0:6c56fb4bc5f0 80 if(send(buf, strlen(buf)) != strlen(buf))
nexpaq 0:6c56fb4bc5f0 81 return HTTPHeader();
nexpaq 0:6c56fb4bc5f0 82 printf("Finished sending request\n");
nexpaq 0:6c56fb4bc5f0 83 return read_header();
nexpaq 0:6c56fb4bc5f0 84 }
nexpaq 0:6c56fb4bc5f0 85
nexpaq 0:6c56fb4bc5f0 86
nexpaq 0:6c56fb4bc5f0 87 HTTPHeader HTTPSClient::read_header()
nexpaq 0:6c56fb4bc5f0 88 {
nexpaq 0:6c56fb4bc5f0 89 _ssl.bm_read_index = 0;
nexpaq 0:6c56fb4bc5f0 90 _ssl.bm_index = 0;
nexpaq 0:6c56fb4bc5f0 91 HTTPHeader hdr;
nexpaq 0:6c56fb4bc5f0 92 if(read_line())
nexpaq 0:6c56fb4bc5f0 93 return hdr;
nexpaq 0:6c56fb4bc5f0 94
nexpaq 0:6c56fb4bc5f0 95 int status;
nexpaq 0:6c56fb4bc5f0 96
nexpaq 0:6c56fb4bc5f0 97 if(sscanf(buf, "HTTP/%*d.%*d %d %*s", &status) == -1)
nexpaq 0:6c56fb4bc5f0 98 return hdr;
nexpaq 0:6c56fb4bc5f0 99
nexpaq 0:6c56fb4bc5f0 100 if(status == 200)
nexpaq 0:6c56fb4bc5f0 101 hdr._status = HTTP_OK;
nexpaq 0:6c56fb4bc5f0 102 if(read_line())
nexpaq 0:6c56fb4bc5f0 103 return hdr;
nexpaq 0:6c56fb4bc5f0 104 do
nexpaq 0:6c56fb4bc5f0 105 {
nexpaq 0:6c56fb4bc5f0 106 string tmp(buf);
nexpaq 0:6c56fb4bc5f0 107 std::size_t sep = tmp.find(':');
nexpaq 0:6c56fb4bc5f0 108 string name = tmp.substr(0, sep);
nexpaq 0:6c56fb4bc5f0 109 string value = tmp.substr(sep+2, tmp.size());
nexpaq 0:6c56fb4bc5f0 110 hdr._fields[name] = value;
nexpaq 0:6c56fb4bc5f0 111 if(read_line())
nexpaq 0:6c56fb4bc5f0 112 return hdr;
nexpaq 0:6c56fb4bc5f0 113 }while(strlen(buf));
nexpaq 0:6c56fb4bc5f0 114
nexpaq 0:6c56fb4bc5f0 115 return hdr;
nexpaq 0:6c56fb4bc5f0 116 }
nexpaq 0:6c56fb4bc5f0 117
nexpaq 0:6c56fb4bc5f0 118 uint8_t HTTPSClient::read_line()
nexpaq 0:6c56fb4bc5f0 119 {
nexpaq 0:6c56fb4bc5f0 120 int index = 0;
nexpaq 0:6c56fb4bc5f0 121 do
nexpaq 0:6c56fb4bc5f0 122 {
nexpaq 0:6c56fb4bc5f0 123 if(ssl_read(&_ssl, (uint8_t*)(&buf[index]), 1) != 1)
nexpaq 0:6c56fb4bc5f0 124 {
nexpaq 0:6c56fb4bc5f0 125 return 1;
nexpaq 0:6c56fb4bc5f0 126 }
nexpaq 0:6c56fb4bc5f0 127 index++;
nexpaq 0:6c56fb4bc5f0 128 }while(buf[index-1] != '\r' && index < 256);
nexpaq 0:6c56fb4bc5f0 129 ssl_read(&_ssl, (uint8_t*)(&buf[index-1]), 1); // skip '\n'
nexpaq 0:6c56fb4bc5f0 130 buf[index-1] = '\0';
nexpaq 0:6c56fb4bc5f0 131
nexpaq 0:6c56fb4bc5f0 132 return 0;
nexpaq 0:6c56fb4bc5f0 133 }
nexpaq 0:6c56fb4bc5f0 134
nexpaq 0:6c56fb4bc5f0 135 // -1:error
nexpaq 0:6c56fb4bc5f0 136 // otherwise return nb of characters read. Cannot be > than len
nexpaq 0:6c56fb4bc5f0 137 int HTTPSClient::read(char *data, int len)
nexpaq 0:6c56fb4bc5f0 138 {
nexpaq 0:6c56fb4bc5f0 139 return ssl_read(&_ssl, (uint8_t*)data, len);
nexpaq 0:6c56fb4bc5f0 140 }
nexpaq 0:6c56fb4bc5f0 141 /*
nexpaq 0:6c56fb4bc5f0 142 0 : must close connection
nexpaq 0:6c56fb4bc5f0 143 -1 : error
nexpaq 0:6c56fb4bc5f0 144 else : get data
nexpaq 0:6c56fb4bc5f0 145
nexpaq 0:6c56fb4bc5f0 146 int HTTPSClient::receive(char* data, int length) {
nexpaq 0:6c56fb4bc5f0 147 if ((_sock_fd < 0) || !_is_connected)
nexpaq 0:6c56fb4bc5f0 148 return -1;
nexpaq 0:6c56fb4bc5f0 149
nexpaq 0:6c56fb4bc5f0 150 if(read_record(&_ssl) < 0)
nexpaq 0:6c56fb4bc5f0 151 return -1;
nexpaq 0:6c56fb4bc5f0 152 return process_data(&_ssl, (uint8_t*)data, length);
nexpaq 0:6c56fb4bc5f0 153 }
nexpaq 0:6c56fb4bc5f0 154 */
nexpaq 0:6c56fb4bc5f0 155 void HTTPSClient::close()
nexpaq 0:6c56fb4bc5f0 156 {
nexpaq 0:6c56fb4bc5f0 157 if(!_is_connected)
nexpaq 0:6c56fb4bc5f0 158 return;
nexpaq 0:6c56fb4bc5f0 159 ssl_ctx_free(_ssl.ssl_ctx);
nexpaq 0:6c56fb4bc5f0 160 Socket::close();
nexpaq 0:6c56fb4bc5f0 161 _is_connected = false;
nexpaq 0:6c56fb4bc5f0 162 _host.clear();
nexpaq 0:6c56fb4bc5f0 163 }