Small wrapper of TLS_cyassl
Dependents: HTTPSClientExample2
This is a small wrapper of TLS_cyassl to easily sends GET requests over HTTPS. This library is used in the same way as HTTPSClient_axTLS.
Import programHTTPSClientExample2
This example shows how to use the TLS_cyassl library. It connects to twitter.com and downloads a webpage.
Diff: HTTPSClient.cpp
- Revision:
- 0:1abc65a0f50b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPSClient.cpp Mon Sep 16 10:39:01 2013 +0000 @@ -0,0 +1,88 @@ +#include "HTTPSClient.h" +#include "HTTPHeader.h" +#include <stdio.h> +#include <string.h> + +HTTPSClient::HTTPSClient(): + _con() +{ +} + +bool HTTPSClient::connect(const std::string& host) +{ + if(_con.is_connected()) + return false; + + return _con.connect(host.c_str()); +} + +std::string HTTPSClient::readLine() +{ + std::string line; + char c; + _con.receive(&c, 1); + while(c != '\r') { + line += c; + _con.receive(&c, 1); + } + _con.receive(&c, 1); // skip \n + return line; +} + +HTTPHeader HTTPSClient::readHeader() +{ + HTTPHeader hdr; + std::string line = readLine(); + sscanf(line.c_str(), "HTTP/1.%*d %d OK", &hdr._status); + do { + if(!line.compare(0,strlen("Content-Length"), "Content-Length")) + sscanf(line.c_str(), "Content-Length: %d", &hdr._bodyLength); + else if(!line.compare(0,strlen("content-length"), "content-length")) + sscanf(line.c_str(), "content-length: %d", &hdr._bodyLength); + line = readLine(); + } while(line.size()); + return hdr; +} + +int HTTPSClient::get(const std::string& path, HTTPHeader *hdr) +{ + if(!_con.is_connected()) + return -1; + + const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443); + + if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1) + return -1; + + *hdr = readHeader(); + return hdr->_status == HTTP_OK ? 0 : -1; +} + +int HTTPSClient::get(const std::string& path, HTTPHeader *hdr, char *data, int length) +{ + if(!_con.is_connected()) + return -1; + + if(hdr != NULL) { + const std::string &request = HTTPHeader::getRequest(path, _con.get_address(), 443); + if(_con.send_all((char*)request.c_str(), request.size()+1) != request.size()+1) + return -1; + *hdr = readHeader(); + if(hdr->_status != HTTP_OK) + return -1; + + if(hdr->_bodyLength > 0) + return _con.receive(data, hdr->_bodyLength > length ? length : hdr->_bodyLength); + + return 0; + } else + return _con.receive(data, length); +} + +bool HTTPSClient::disconnect() +{ + if(!_con.is_connected()) + return true; + + return _con.close() == 0; +}