3#ifdef FASTLED_HAS_NETWORKING
19HttpStreamClient::HttpStreamClient(
const fl::string& host, u16 port, u32 heartbeatIntervalMs)
21 , mHttpHeaderSent(false)
22 , mHttpHeaderReceived(false)
26 ConnectionConfig config;
34bool HttpStreamClient::connect() {
41 mHttpHeaderSent =
false;
42 mHttpHeaderReceived =
false;
45 if (!mNativeClient->connect()) {
50 if (!sendHttpRequestHeader()) {
51 mNativeClient->disconnect();
56 if (!readHttpResponseHeader()) {
57 mNativeClient->disconnect();
62 mConnection.onConnected();
67void HttpStreamClient::disconnect() {
69 mNativeClient->disconnect();
71 mHttpHeaderSent =
false;
72 mHttpHeaderReceived =
false;
73 mConnection.onDisconnected();
76bool HttpStreamClient::isConnected()
const {
77 return mNativeClient && mNativeClient->isConnected() && mHttpHeaderSent && mHttpHeaderReceived;
84 return mNativeClient->send(data);
91 return mNativeClient->recv(buffer);
94void HttpStreamClient::triggerReconnect() {
99bool HttpStreamClient::sendHttpRequestHeader() {
110 header.
append(
"POST /rpc HTTP/1.1\r\n");
120 header.
append(
"Content-Type: application/json\r\n");
121 header.
append(
"Transfer-Encoding: chunked\r\n");
122 header.
append(
"Connection: keep-alive\r\n");
127 if (sent !=
static_cast<int>(header.
size())) {
131 mHttpHeaderSent =
true;
135bool HttpStreamClient::readHttpResponseHeader() {
149 const size_t MAX_HEADER_SIZE = 4096;
150 const int MAX_READ_ATTEMPTS = 500;
151 int readAttempts = 0;
153 while (headerBuffer.
size() < MAX_HEADER_SIZE) {
154 int received = mNativeClient->recv(buffer);
164 if (readAttempts >= MAX_READ_ATTEMPTS) {
174 headerBuffer.
append(
reinterpret_cast<const char*
>(buffer), received);
177 if (headerBuffer.
size() >= 4) {
178 size_t pos = headerBuffer.
find(
"\r\n\r\n");
187 if (headerBuffer.
size() < 12) {
191 if (headerBuffer.
substr(0, 12) !=
"HTTP/1.1 200") {
200 bool hasChunked =
false;
210 mHttpHeaderReceived =
true;
FastLED chrono implementation - duration types for time measurements.
fl::size find(const char &value) const FL_NOEXCEPT
const char * c_str() const FL_NOEXCEPT
fl::size size() const FL_NOEXCEPT
Base class for HTTP streaming transport Implements RequestSource and ResponseSink for Remote class Ma...
string substr(fl::size start, fl::size length) const FL_NOEXCEPT
string & append(const bitset_fixed< N > &bs) FL_NOEXCEPT
static constexpr fl::size npos
duration< fl::i64, fl::milli > milliseconds
Milliseconds - duration with period of 1/1,000 seconds.
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
int snprintf(char *buffer, fl::size size, const char *format, const Args &... args) FL_NOEXCEPT
Snprintf-like formatting function that writes to a buffer.
Base definition for an LED controller.