1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-25 20:02:37 +03:00

first httpClient

This commit is contained in:
Markus Sattler 2015-11-16 19:29:33 +01:00
parent 83b452b824
commit 95dada180c
3 changed files with 282 additions and 0 deletions

View File

@ -0,0 +1,9 @@
name=ESP8266httpClient
version=1.0
author=Markus Sattler
maintainer=Markus Sattler
sentence=http Client for ESP8266
paragraph=
category=Communication
url=https://github.com/Links2004/Arduino/tree/libraries/ESP8266httpClient
architectures=esp8266

View File

@ -0,0 +1,195 @@
/**
* ESP8266httpClient.cpp
*
* Created on: 02.11.2015
*
* Copyright (c) 2015 Markus Sattler. All rights reserved.
* This file is part of the ESP8266httpClient for Arduino.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include "ESP8266httpClient.h"
httpClient::httpClient() {
_tcp = NULL;
_tcps = NULL;
}
httpClient::~httpClient() {
if(connected()) {
_tcp->stop();
}
}
void httpClient::begin(const char *host, uint16_t port, const char * url, bool https, const char * httpsFingerprint) {
_host = host;
_port = port;
_url = url;
_https = https;
_httpsFingerprint = httpsFingerprint;
}
void httpClient::begin(String host, uint16_t port, String url, bool https, String httpsFingerprint) {
begin(host.c_str(), port, url.c_str(), https, httpsFingerprint.c_str());
}
/**
* connected
* @return connected status
*/
bool httpClient::connected() {
if(_tcp) {
return _tcp->connected();
}
return false;
}
bool httpClient::GET() {
bool status;
status = connect();
if(status) {
status = sendHeader("GET");
}
return status;
}
/**
* sends a post request to the server
* @param payload uint8_t *
* @param size size_t
* @return status
*/
bool httpClient::POST(uint8_t * payload, size_t size) {
bool status;
status = connect();
if(status) {
addHeader("Content-Length", String(size));
status = sendHeader("POST");
}
if(status) {
status = _tcp->write(&payload[0], size);
}
return status;
}
bool httpClient::POST(String payload) {
return POST((uint8_t *) payload.c_str(), payload.length());
}
/**
* returns the stram of the tcp connection
* @return WiFiClient
*/
WiFiClient & httpClient::getStream(void) {
if(connected()) {
return *_tcp;
}
// todo return error?
}
/**
* adds Headder to the request
* @param name
* @param value
* @param first
*/
void httpClient::addHeader(const String& name, const String& value, bool first) {
String headerLine = name;
headerLine += ": ";
headerLine += value;
headerLine += "\r\n";
if(first) {
_Headers = headerLine + _Headers;
} else {
_Headers += headerLine;
}
}
/**
* init TCP connection and handle ssl verify if needed
* @return true if connection is ok
*/
bool httpClient::connect(void) {
if(connected()) {
DEBUG_HTTPCLIENT("[HTTP-Client] connect. already connected!\n");
return true;
}
if(_https) {
DEBUG_HTTPCLIENT("[HTTP-Client] connect https...\n");
_tcps = new WiFiClientSecure();
_tcp = _tcps;
} else {
DEBUG_HTTPCLIENT("[HTTP-Client] connect...\n");
_tcp = new WiFiClient();
}
if(!_tcp->connect(_host.c_str(), _port)) {
DEBUG_HTTPCLIENT("[HTTP-Client] failed connect to %s:%u.\n", _host.c_str(), _port);
return false;
}
DEBUG_HTTPCLIENT("[HTTP-Client] connected to %s:%u.\n", _host.c_str(), _port);
if(_https) {
if(_tcps->verify(_httpsFingerprint.c_str(), _host.c_str())) {
DEBUG_HTTPCLIENT("[HTTP-Client] https certificate matches\n");
} else {
DEBUG_HTTPCLIENT("[HTTP-Client] https certificate doesn't match!\n");
_tcp->stop();
return false;
}
}
// set Timeout for readBytesUntil and readStringUntil
_tcp->setTimeout(HTTPCLIENT_TCP_TIMEOUT);
#ifdef ESP8266
_tcp->setNoDelay(true);
#endif
return connected();
}
/**
* sends HTTP request header
* @param type (GET, POST, ...)
* @return status
*/
bool httpClient::sendHeader(const char * type) {
String header = String(type) + " " + _url + " HTTP/1.1\r\n"
"Host: " + _host + "\r\n"
"User-Agent: ESP8266httpClient\r\n"
"Connection: close\r\n" +
_Headers +
"\r\n";
return _tcp->write(header.c_str(), header.length());
}

View File

@ -0,0 +1,78 @@
/**
* ESP8266httpClient.h
*
* Created on: 02.11.2015
*
* Copyright (c) 2015 Markus Sattler. All rights reserved.
* This file is part of the ESP8266httpClient for Arduino.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef ESP8266HTTPCLIENT_H_
#define ESP8266HTTPCLIENT_H_
#define DEBUG_HTTPCLIENT(...) Serial1.printf( __VA_ARGS__ )
#ifndef DEBUG_HTTPCLIENT
#define DEBUG_HTTPCLIENT(...)
#endif
#define HTTPCLIENT_TCP_TIMEOUT (1000)
class httpClient {
public:
httpClient();
~httpClient();
void begin(const char *host, uint16_t port, const char * url = "/", bool https = false, const char * httpsFingerprint = "");
void begin(String host, uint16_t port, String url = "/", bool https = false, String httpsFingerprint = "");
bool connected(void);
bool GET();
bool POST(uint8_t * payload, size_t size);
bool POST(String payload);
void addHeader(const String& name, const String& value, bool first = false);
WiFiClient & getStream(void);
protected:
WiFiClient * _tcp;
WiFiClientSecure * _tcps;
String _host;
uint16_t _port;
String _url;
bool _https;
String _httpsFingerprint;
String _Headers;
bool connect(void);
bool sendHeader(const char * type);
};
#endif /* ESP8266HTTPCLIENT_H_ */