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:
Thu Sep 05 10:33:20 2013 +0000
Revision:
1:95f92eed4e09
Parent:
0:ab9011f6ede5
Child:
2:6d7bc51cc77b
remove printf

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 1:95f92eed4e09 42 else if(!line.compare(0,strlen("content-length"), "content-length"))
feb11 1:95f92eed4e09 43 sscanf(line.c_str(), "content-length: %d", &hdr._bodyLength);
feb11 0:ab9011f6ede5 44 line = readLine();
feb11 0:ab9011f6ede5 45 }while(line.size());
feb11 0:ab9011f6ede5 46 return hdr;
feb11 0:ab9011f6ede5 47 }
feb11 0:ab9011f6ede5 48
feb11 0:ab9011f6ede5 49 int HTTPSClient::get(const std::string& path, HTTPHeader *hdr)
feb11 0:ab9011f6ede5 50 {
feb11 0:ab9011f6ede5 51 if(!_con.is_connected())
feb11 0:ab9011f6ede5 52 return -1;
feb11 0:ab9011f6ede5 53
feb11 0:ab9011f6ede5 54 const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443);
feb11 0:ab9011f6ede5 55
feb11 0:ab9011f6ede5 56 if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1)
feb11 0:ab9011f6ede5 57 return -1;
feb11 0:ab9011f6ede5 58
feb11 0:ab9011f6ede5 59 *hdr = readHeader();
feb11 0:ab9011f6ede5 60 return hdr->_status == HTTP_OK ? 0 : -1;
feb11 0:ab9011f6ede5 61 }
feb11 0:ab9011f6ede5 62
feb11 0:ab9011f6ede5 63 int HTTPSClient::get(const std::string& path, HTTPHeader *hdr, char *data, int length)
feb11 0:ab9011f6ede5 64 {
feb11 0:ab9011f6ede5 65 if(!_con.is_connected())
feb11 0:ab9011f6ede5 66 return -1;
feb11 0:ab9011f6ede5 67
feb11 0:ab9011f6ede5 68 if(hdr != NULL)
feb11 0:ab9011f6ede5 69 {
feb11 0:ab9011f6ede5 70 const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443);
feb11 0:ab9011f6ede5 71 if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1)
feb11 0:ab9011f6ede5 72 return -1;
feb11 0:ab9011f6ede5 73 *hdr = readHeader();
feb11 0:ab9011f6ede5 74 if(hdr->_status != HTTP_OK)
feb11 0:ab9011f6ede5 75 return -1;
feb11 0:ab9011f6ede5 76
feb11 0:ab9011f6ede5 77 if(hdr->_bodyLength > 0)
feb11 0:ab9011f6ede5 78 return _con.receive_all(data, hdr->_bodyLength > length ? length : hdr->_bodyLength);
feb11 0:ab9011f6ede5 79
feb11 0:ab9011f6ede5 80 return 0;
feb11 0:ab9011f6ede5 81 }
feb11 0:ab9011f6ede5 82 else
feb11 0:ab9011f6ede5 83 return _con.receive_all(data, length);
feb11 0:ab9011f6ede5 84 }
feb11 0:ab9011f6ede5 85
feb11 0:ab9011f6ede5 86 bool HTTPSClient::disconnect()
feb11 0:ab9011f6ede5 87 {
feb11 0:ab9011f6ede5 88 if(!_con.is_connected())
feb11 0:ab9011f6ede5 89 return true;
feb11 0:ab9011f6ede5 90
feb11 0:ab9011f6ede5 91 return _con.close() == 0;
feb11 0:ab9011f6ede5 92 }