wrapper of TLS library to connect to HTTPS servers

Dependents:   HTTPSClientExample

This library provides a simple interface to send GET requests over HTTPS. Notice that this library uses the axTLS library for the implementation of TLS.

Import programHTTPSClientExample

Connect to twitter.com and copies this webpage to a file.

Committer:
feb11
Date:
Wed Sep 04 13:24:29 2013 +0000
Revision:
0:ab9011f6ede5
Child:
1:95f92eed4e09
initial import

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:ab9011f6ede5 1 #include "HTTPSClient.h"
feb11 0:ab9011f6ede5 2 #include "HTTPHeader.h"
feb11 0:ab9011f6ede5 3 #include <stdio.h>
feb11 0:ab9011f6ede5 4 #include <string.h>
feb11 0:ab9011f6ede5 5
feb11 0:ab9011f6ede5 6 HTTPSClient::HTTPSClient():
feb11 0:ab9011f6ede5 7 _con()
feb11 0:ab9011f6ede5 8 {
feb11 0:ab9011f6ede5 9 }
feb11 0:ab9011f6ede5 10
feb11 0:ab9011f6ede5 11 bool HTTPSClient::connect(const std::string& host)
feb11 0:ab9011f6ede5 12 {
feb11 0:ab9011f6ede5 13 if(_con.is_connected())
feb11 0:ab9011f6ede5 14 return false;
feb11 0:ab9011f6ede5 15
feb11 0:ab9011f6ede5 16 return _con.connect(host.c_str()) == 0;
feb11 0:ab9011f6ede5 17 }
feb11 0:ab9011f6ede5 18
feb11 0:ab9011f6ede5 19 std::string HTTPSClient::readLine()
feb11 0:ab9011f6ede5 20 {
feb11 0:ab9011f6ede5 21 std::string line;
feb11 0:ab9011f6ede5 22 char c;
feb11 0:ab9011f6ede5 23 _con.receive_all(&c, 1);
feb11 0:ab9011f6ede5 24 while(c != '\r')
feb11 0:ab9011f6ede5 25 {
feb11 0:ab9011f6ede5 26 line += c;
feb11 0:ab9011f6ede5 27 _con.receive_all(&c, 1);
feb11 0:ab9011f6ede5 28 }
feb11 0:ab9011f6ede5 29 _con.receive_all(&c, 1); // skip \n
feb11 0:ab9011f6ede5 30 return line;
feb11 0:ab9011f6ede5 31 }
feb11 0:ab9011f6ede5 32
feb11 0:ab9011f6ede5 33 HTTPHeader HTTPSClient::readHeader()
feb11 0:ab9011f6ede5 34 {
feb11 0:ab9011f6ede5 35 HTTPHeader hdr;
feb11 0:ab9011f6ede5 36 std::string line = readLine();
feb11 0:ab9011f6ede5 37 sscanf(line.c_str(), "HTTP/1.1 %d OK", &hdr._status);
feb11 0:ab9011f6ede5 38 do
feb11 0:ab9011f6ede5 39 {
feb11 0:ab9011f6ede5 40 if(!line.compare(0,strlen("Content-Length"), "Content-Length"))
feb11 0:ab9011f6ede5 41 sscanf(line.c_str(), "Content-Length: %d", &hdr._bodyLength);
feb11 0:ab9011f6ede5 42 line = readLine();
feb11 0:ab9011f6ede5 43 }while(line.size());
feb11 0:ab9011f6ede5 44 return hdr;
feb11 0:ab9011f6ede5 45 }
feb11 0:ab9011f6ede5 46
feb11 0:ab9011f6ede5 47 int HTTPSClient::get(const std::string& path, HTTPHeader *hdr)
feb11 0:ab9011f6ede5 48 {
feb11 0:ab9011f6ede5 49 if(!_con.is_connected())
feb11 0:ab9011f6ede5 50 return -1;
feb11 0:ab9011f6ede5 51
feb11 0:ab9011f6ede5 52 const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443);
feb11 0:ab9011f6ede5 53
feb11 0:ab9011f6ede5 54 if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1)
feb11 0:ab9011f6ede5 55 return -1;
feb11 0:ab9011f6ede5 56
feb11 0:ab9011f6ede5 57 *hdr = readHeader();
feb11 0:ab9011f6ede5 58 return hdr->_status == HTTP_OK ? 0 : -1;
feb11 0:ab9011f6ede5 59 }
feb11 0:ab9011f6ede5 60
feb11 0:ab9011f6ede5 61 int HTTPSClient::get(const std::string& path, HTTPHeader *hdr, char *data, int length)
feb11 0:ab9011f6ede5 62 {
feb11 0:ab9011f6ede5 63 if(!_con.is_connected())
feb11 0:ab9011f6ede5 64 return -1;
feb11 0:ab9011f6ede5 65
feb11 0:ab9011f6ede5 66 if(hdr != NULL)
feb11 0:ab9011f6ede5 67 {
feb11 0:ab9011f6ede5 68 const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443);
feb11 0:ab9011f6ede5 69 if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1)
feb11 0:ab9011f6ede5 70 return -1;
feb11 0:ab9011f6ede5 71 *hdr = readHeader();
feb11 0:ab9011f6ede5 72 if(hdr->_status != HTTP_OK)
feb11 0:ab9011f6ede5 73 return -1;
feb11 0:ab9011f6ede5 74
feb11 0:ab9011f6ede5 75 if(hdr->_bodyLength > 0)
feb11 0:ab9011f6ede5 76 return _con.receive_all(data, hdr->_bodyLength > length ? length : hdr->_bodyLength);
feb11 0:ab9011f6ede5 77
feb11 0:ab9011f6ede5 78 return 0;
feb11 0:ab9011f6ede5 79 }
feb11 0:ab9011f6ede5 80 else
feb11 0:ab9011f6ede5 81 return _con.receive_all(data, length);
feb11 0:ab9011f6ede5 82 }
feb11 0:ab9011f6ede5 83
feb11 0:ab9011f6ede5 84 bool HTTPSClient::disconnect()
feb11 0:ab9011f6ede5 85 {
feb11 0:ab9011f6ede5 86 if(!_con.is_connected())
feb11 0:ab9011f6ede5 87 return true;
feb11 0:ab9011f6ede5 88
feb11 0:ab9011f6ede5 89 return _con.close() == 0;
feb11 0:ab9011f6ede5 90 }