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.
HTTPSClient.cpp@3:18af58231990, 2013-09-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |