Arduino DLNA Server
Loading...
Searching...
No Matches
HttpRequest.h
Go to the documentation of this file.
1#pragma once
2
3#include <WiFi.h>
4
5#include "HttpHeader.h"
6// #include "Platform/AltClient.h"
7#include "HttpChunkReader.h"
8#include "WiFiClient.h"
9
10namespace tiny_dlna {
11
22 public:
24 DlnaLogger.log(DlnaLogLevel::Debug, "HttpRequest");
25 // default_client.setInsecure();
27 }
28
30 DlnaLogger.log(DlnaLogLevel::Debug, "HttpRequest");
32 }
33
35
36 void setClient(Client &client) { this->client_ptr = &client; }
37
38 // the requests usually need a host. This needs to be set if we did not
39 // provide a URL
40 void setHost(const char *host) {
41 DlnaLogger.log(DlnaLogLevel::Info, "setHost", host);
42 this->host_name = host;
43 }
44
45 operator bool() { return client_ptr != nullptr && (bool)*client_ptr; }
46
47 virtual bool connected() { return client_ptr->connected(); }
48
49 virtual int available() {
50 if (reply_header.isChunked()) {
51 return chunk_reader.available();
52 }
53 return client_ptr->available();
54 }
55
56 virtual void stop() {
58 client_ptr->stop();
59 }
60
61 virtual int post(Url &url, const char *mime, const char *data, int len = -1) {
63 return process(T_POST, url, mime, data, len);
64 }
65
66 virtual int put(Url &url, const char *mime, const char *data, int len = -1) {
68 return process(T_PUT, url, mime, data, len);
69 }
70
71 virtual int del(Url &url, const char *mime = nullptr,
72 const char *data = nullptr, int len = -1) {
74 return process(T_DELETE, url, mime, data, len);
75 }
76
77 virtual int get(Url &url, const char *acceptMime = nullptr,
78 const char *data = nullptr, int len = -1) {
80 this->accept = acceptMime;
81 return process(T_GET, url, nullptr, data, len);
82 }
83
84 virtual int head(Url &url, const char *acceptMime = nullptr,
85 const char *data = nullptr, int len = -1) {
87 this->accept = acceptMime;
88 return process(T_HEAD, url, nullptr, data, len);
89 }
90
91 virtual int subscribe(Url &url) {
93 return process(T_SUBSCRIBE, url, nullptr, nullptr, 0);
94 }
95
96 // reads the reply data
97 virtual int read(uint8_t *str, int len) {
98 if (reply_header.isChunked()) {
99 return chunk_reader.read(*client_ptr, str, len);
100 } else {
101 return client_ptr->read(str, len);
102 }
103 }
104
105 // read the reply data up to the next new line. For Chunked data we provide
106 // the full chunk!
107 virtual int readln(uint8_t *str, int len, bool incl_nl = true) {
108 if (reply_header.isChunked()) {
109 return chunk_reader.readln(*client_ptr, str, len);
110 } else {
111 return chunk_reader.readlnInternal(*client_ptr, str, len, incl_nl);
112 }
113 }
114
115 // provides the head information of the reply
116 virtual HttpReplyHeader &reply() { return reply_header; }
117
119
120 virtual void setAgent(const char *agent) { this->agent = agent; }
121
122 virtual void setConnection(const char *connection) {
123 this->connection = connection;
124 }
125
126 virtual void setAcceptsEncoding(const char *enc) {
127 this->accept_encoding = enc;
128 }
129
130 Client *client() { return client_ptr; }
131
132 void setTimeout(int ms) { client_ptr->setTimeout(ms); }
133
134 protected:
135 WiFiClient default_client;
136 Client *client_ptr;
142 const char *agent = nullptr;
143 const char *connection = CON_CLOSE;
144 const char *accept = ACCEPT_ALL;
145 const char *accept_encoding = nullptr;
146
147 const char *str(const char *in) { return in == nullptr ? "" : in; }
148
149 // opens a connection to the indicated host
150 virtual int connect(const char *ip, uint16_t port) {
151 DlnaLogger.log(DlnaLogLevel::Info, "connect %s", ip);
152 int rc = this->client_ptr->connect(ip, port);
153 uint64_t end = millis() + client_ptr->getTimeout();
154 DlnaLogger.log(DlnaLogLevel::Info, "Connected: %s (rc=%d) with timeout %ld",
155 connected() ? "true" : "false", rc,
156 client_ptr->getTimeout());
157 return rc;
158 }
159
160 // sends request and reads the reply_header from the server
161 virtual int process(TinyMethodID action, Url &url, const char *mime,
162 const char *data, int len = -1) {
163 if (!connected()) {
164 DlnaLogger.log(DlnaLogLevel::Info, "Connecting to host %s port %d", url.host(),
165 url.port());
166
167 connect(url.host(), url.port());
168 }
169
170 if (!connected()) {
171 DlnaLogger.log(DlnaLogLevel::Info, "Connected: %s", connected() ? "true" : "false");
172 return -1;
173 }
174
175 if (host_name.isEmpty()) {
176 host_name = url.host();
177 host_name.add(":");
179 }
180
181 request_header.setValues(action, url.path());
182 if (len == -1 && data != nullptr) {
183 len = strlen(data);
184 }
185 if (len > 0) {
187 }
188 if (!host_name.isEmpty()) {
190 }
191 if (agent != nullptr) {
193 }
194 if (accept_encoding != nullptr) {
196 }
197 if (mime != nullptr) {
199 }
200
203
205
206 if (len > 0) {
207 DlnaLogger.log(DlnaLogLevel::Info, "process - writing data: %d bytes", len);
208 client_ptr->write((const uint8_t *)data, len);
209 }
210
212
213 // if we use chunked tranfer we need to read the first chunked length
214 if (reply_header.isChunked()) {
216 };
217
218 return reply_header.statusCode();
219 }
220};
221
223
224} // namespace tiny_dlna
Http might reply with chunks. So we need to dechunk the data. see https://en.wikipedia....
Definition: HttpChunkReader.h:13
void open(Client &client)
Definition: HttpChunkReader.h:28
virtual int read(Client &client, uint8_t *str, int len)
Definition: HttpChunkReader.h:35
virtual int readln(Client &client, uint8_t *str, int len, bool incl_nl=true)
Definition: HttpChunkReader.h:55
int available()
Definition: HttpChunkReader.h:73
void read(Client &in)
Definition: HttpHeader.h:235
int statusCode()
Definition: HttpHeader.h:225
bool isChunked()
Definition: HttpHeader.h:229
HttpHeader & put(const char *key, const char *value)
Definition: HttpHeader.h:103
void write(Client &out)
Definition: HttpHeader.h:268
virtual int readlnInternal(Stream &client, uint8_t *str, int len, bool incl_nl=true)
Definition: HttpLineReader.h:18
Reading and Writing of Http Replys.
Definition: HttpHeader.h:413
Reading and writing of Http Requests.
Definition: HttpHeader.h:359
HttpHeader & setValues(TinyMethodID id, const char *urlPath, const char *protocol=nullptr)
Definition: HttpHeader.h:362
Simple API to process get, put, post, del http requests I tried to use Arduino HttpClient,...
Definition: HttpRequest.h:21
virtual int available()
Definition: HttpRequest.h:49
void setTimeout(int ms)
Definition: HttpRequest.h:132
Url url
Definition: HttpRequest.h:137
~HttpRequest()
Definition: HttpRequest.h:34
virtual HttpRequestHeader & request()
Definition: HttpRequest.h:118
const char * agent
Definition: HttpRequest.h:142
virtual int subscribe(Url &url)
Definition: HttpRequest.h:91
Client * client()
Definition: HttpRequest.h:130
HttpReplyHeader reply_header
Definition: HttpRequest.h:139
const char * accept
Definition: HttpRequest.h:144
HttpRequestHeader request_header
Definition: HttpRequest.h:138
Str host_name
Definition: HttpRequest.h:141
virtual int put(Url &url, const char *mime, const char *data, int len=-1)
Definition: HttpRequest.h:66
virtual int get(Url &url, const char *acceptMime=nullptr, const char *data=nullptr, int len=-1)
Definition: HttpRequest.h:77
virtual void setAcceptsEncoding(const char *enc)
Definition: HttpRequest.h:126
virtual void setAgent(const char *agent)
Definition: HttpRequest.h:120
HttpRequest()
Definition: HttpRequest.h:23
const char * accept_encoding
Definition: HttpRequest.h:145
virtual bool connected()
Definition: HttpRequest.h:47
virtual void setConnection(const char *connection)
Definition: HttpRequest.h:122
void setHost(const char *host)
Definition: HttpRequest.h:40
virtual int head(Url &url, const char *acceptMime=nullptr, const char *data=nullptr, int len=-1)
Definition: HttpRequest.h:84
HttpRequest(Client &client)
Definition: HttpRequest.h:29
virtual int post(Url &url, const char *mime, const char *data, int len=-1)
Definition: HttpRequest.h:61
virtual int readln(uint8_t *str, int len, bool incl_nl=true)
Definition: HttpRequest.h:107
Client * client_ptr
Definition: HttpRequest.h:136
virtual HttpReplyHeader & reply()
Definition: HttpRequest.h:116
const char * connection
Definition: HttpRequest.h:143
const char * str(const char *in)
Definition: HttpRequest.h:147
virtual int process(TinyMethodID action, Url &url, const char *mime, const char *data, int len=-1)
Definition: HttpRequest.h:161
virtual int del(Url &url, const char *mime=nullptr, const char *data=nullptr, int len=-1)
Definition: HttpRequest.h:71
virtual int connect(const char *ip, uint16_t port)
Definition: HttpRequest.h:150
WiFiClient default_client
Definition: HttpRequest.h:135
virtual void stop()
Definition: HttpRequest.h:56
HttpChunkReader chunk_reader
Definition: HttpRequest.h:140
virtual int read(uint8_t *str, int len)
Definition: HttpRequest.h:97
void setClient(Client &client)
Definition: HttpRequest.h:36
void log(DlnaLogLevel current_level, const char *fmt...)
Print log message.
Definition: Logger.h:40
virtual void add(int value)
adds a int value
Definition: StrView.h:129
virtual bool isEmpty()
checks if the string is empty
Definition: StrView.h:383
String implementation which keeps the data on the heap. We grow the allocated memory only if the copy...
Definition: Str.h:22
const char * c_str()
provides the string value as const char*
Definition: Str.h:187
URL parser which breaks a full url string up into its individual parts.
Definition: Url.h:18
int port()
Definition: Url.h:50
const char * host()
Definition: Url.h:45
const char * url()
Definition: Url.h:43
const char * path()
Definition: Url.h:44
Definition: Allocator.h:6
const char * CONTENT_TYPE
Definition: HttpHeader.h:16
const char * CONTENT_LENGTH
Definition: HttpHeader.h:17
const char * CON_CLOSE
Definition: HttpHeader.h:19
const char * HOST_C
Definition: HttpHeader.h:29
TinyMethodID
Definition: HttpHeader.h:35
@ T_DELETE
Definition: HttpHeader.h:41
@ T_SUBSCRIBE
Definition: HttpHeader.h:46
@ T_HEAD
Definition: HttpHeader.h:38
@ T_GET
Definition: HttpHeader.h:37
@ T_PUT
Definition: HttpHeader.h:40
@ T_POST
Definition: HttpHeader.h:39
const char * ACCEPT
Definition: HttpHeader.h:23
const char * ACCEPT_ENCODING
Definition: HttpHeader.h:30
LoggerClass DlnaLogger
Definition: Logger.cpp:5
const char * ACCEPT_ALL
Definition: HttpHeader.h:24
const char * USER_AGENT
Definition: HttpHeader.h:26
const char * CONNECTION
Definition: HttpHeader.h:18