weatherstation/firmware/libraries/ESP8266_Influxdb/src/HTTPService.h
2022-09-15 10:23:02 +02:00

136 lines
5.3 KiB
C++

/**
*
* HTTPService.h: HTTP Service
*
* MIT License
*
* Copyright (c) 2020 InfluxData
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef _HTTP_SERVICE_H_
#define _HTTP_SERVICE_H_
#include <Arduino.h>
#if defined(ESP8266)
# include <WiFiClientSecureBearSSL.h>
# include <ESP8266HTTPClient.h>
#elif defined(ESP32)
# include <HTTPClient.h>
#else
# error "This library currently supports only ESP8266 and ESP32."
#endif
#include "Options.h"
class Test;
typedef std::function<bool(HTTPClient *client)> httpResponseCallback;
extern const char *TransferEncoding;
struct ConnectionInfo {
// Connection info
String serverUrl;
// Write & query targets
String bucket;
String org;
// v2 authetication token
String authToken;
// Version of InfluxDB 1 or 2
uint8_t dbVersion;
// V1 user authetication
String user;
String password;
// Certificate info
const char *certInfo;
// flag if https should ignore cert validation
bool insecure;
// Error message of last failed operation
String lastError;
};
/**
* HTTPService provides HTTP methods for communicating with InfluxDBServer,
* while taking care of Authorization and error handling
**/
class HTTPService {
friend class Test;
private:
// Connection info data
ConnectionInfo *_pConnInfo;
// Server API URL
String _apiURL;
// Last time in ms we made are a request to server
uint32_t _lastRequestTime = 0;
// HTTP status code of last request to server
int _lastStatusCode = 0;
// Underlying HTTPClient instance
HTTPClient *_httpClient = nullptr;
// Underlying connection object
WiFiClient *_wifiClient = nullptr;
#ifdef ESP8266
// Trusted cert chain
BearSSL::X509List *_cert = nullptr;
#endif
// Store retry timeout suggested by server after last request
int _lastRetryAfter = 0;
// HTTP options
HTTPOptions _httpOptions;
protected:
// Sets request params
bool beforeRequest(const char *url);
// Handles response
bool afterRequest(int expectedStatusCode, httpResponseCallback cb, bool modifyLastConnStatus = true);
public:
// Creates HTTPService instance
// serverUrl - url of the InfluxDB 2 server (e.g. http://localhost:8086)
// authToken - InfluxDB 2 authorization token
// certInfo - InfluxDB 2 server trusted certificate (or CA certificate) or certificate SHA1 fingerprint. Should be stored in PROGMEM.
HTTPService(ConnectionInfo *pConnInfo);
// Clean instance on deletion
~HTTPService();
// Sets custom HTTP options. See HTTPOptions doc for more info.
// Must be called before calling any method initiating a connection to server.
// Example:
// service.setHTTPOptions(HTTPOptions().httpReadTimeout(20000)).
void setHTTPOptions(const HTTPOptions &httpOptions);
// Returns current HTTPOption
HTTPOptions &getHTTPOptions() { return _httpOptions; }
// Performs HTTP POST by sending data. On success calls response call back
bool doPOST(const char *url, const char *data, const char *contentType, int expectedCode, httpResponseCallback cb);
// Performs HTTP POST by sending stream. On success calls response call back
bool doPOST(const char *url, Stream *stream, const char *contentType, int expectedCode, httpResponseCallback cb);
// Performs HTTP GET. On success calls response call back
bool doGET(const char *url, int expectedCode, httpResponseCallback cb);
// Performs HTTP DELETE. On success calls response call back
bool doDELETE(const char *url, int expectedCode, httpResponseCallback cb);
// Returns InfluxDBServer API URL
String getServerAPIURL() const { return _apiURL; }
// Returns value of the Retry-After HTTP header from recent call. 0 if it was missing.
int getLastRetryAfter() const { return _lastRetryAfter; }
// Returns HTTP status code of recent call.
int getLastStatusCode() const { return _lastStatusCode; }
// Returns time of recent call successful call.
uint32_t getLastRequestTime() const { return _lastRequestTime; }
// Returns response of last failed call.
String getLastErrorMessage() const { return _pConnInfo->lastError; }
// Returns true if HTTP connection is kept open
bool isConnected() const { return _httpClient && _httpClient->connected(); }
};
#endif //_HTTP_SERVICE_H_