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 12 09:05:02 2013 +0000
Revision:
3:18af58231990
Parent:
2:6d7bc51cc77b
fixed scanf status line

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 2:6d7bc51cc77b 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 2:6d7bc51cc77b 16 return _con.connect(host.c_str());
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 2:6d7bc51cc77b 23 _con.receive(&c, 1);
feb11 2:6d7bc51cc77b 24 while(c != '\r') {
feb11 0:ab9011f6ede5 25 line += c;
feb11 2:6d7bc51cc77b 26 _con.receive(&c, 1);
feb11 0:ab9011f6ede5 27 }
feb11 2:6d7bc51cc77b 28 _con.receive(&c, 1); // skip \n
feb11 0:ab9011f6ede5 29 return line;
feb11 0:ab9011f6ede5 30 }
feb11 0:ab9011f6ede5 31
feb11 0:ab9011f6ede5 32 HTTPHeader HTTPSClient::readHeader()
feb11 0:ab9011f6ede5 33 {
feb11 0:ab9011f6ede5 34 HTTPHeader hdr;
feb11 0:ab9011f6ede5 35 std::string line = readLine();
feb11 3:18af58231990 36 sscanf(line.c_str(), "HTTP/1.%*d %d OK", &hdr._status);
feb11 2:6d7bc51cc77b 37 do {
feb11 0:ab9011f6ede5 38 if(!line.compare(0,strlen("Content-Length"), "Content-Length"))
feb11 0:ab9011f6ede5 39 sscanf(line.c_str(), "Content-Length: %d", &hdr._bodyLength);
feb11 1:95f92eed4e09 40 else if(!line.compare(0,strlen("content-length"), "content-length"))
feb11 1:95f92eed4e09 41 sscanf(line.c_str(), "content-length: %d", &hdr._bodyLength);
feb11 0:ab9011f6ede5 42 line = readLine();
feb11 2:6d7bc51cc77b 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 2:6d7bc51cc77b 51
feb11 0:ab9011f6ede5 52 const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443);
feb11 2:6d7bc51cc77b 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 2:6d7bc51cc77b 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 2:6d7bc51cc77b 65
feb11 2:6d7bc51cc77b 66 if(hdr != NULL) {
feb11 0:ab9011f6ede5 67 const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443);
feb11 0:ab9011f6ede5 68 if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1)
feb11 0:ab9011f6ede5 69 return -1;
feb11 0:ab9011f6ede5 70 *hdr = readHeader();
feb11 0:ab9011f6ede5 71 if(hdr->_status != HTTP_OK)
feb11 0:ab9011f6ede5 72 return -1;
feb11 2:6d7bc51cc77b 73
feb11 0:ab9011f6ede5 74 if(hdr->_bodyLength > 0)
feb11 2:6d7bc51cc77b 75 return _con.receive(data, hdr->_bodyLength > length ? length : hdr->_bodyLength);
feb11 0:ab9011f6ede5 76
feb11 0:ab9011f6ede5 77 return 0;
feb11 2:6d7bc51cc77b 78 } else
feb11 2:6d7bc51cc77b 79 return _con.receive(data, length);
feb11 0:ab9011f6ede5 80 }
feb11 0:ab9011f6ede5 81
feb11 0:ab9011f6ede5 82 bool HTTPSClient::disconnect()
feb11 0:ab9011f6ede5 83 {
feb11 0:ab9011f6ede5 84 if(!_con.is_connected())
feb11 0:ab9011f6ede5 85 return true;
feb11 2:6d7bc51cc77b 86
feb11 0:ab9011f6ede5 87 return _con.close() == 0;
feb11 0:ab9011f6ede5 88 }