Arduino DLNA Server
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 
10 namespace tiny_dlna {
11 
21 class HttpRequest {
22  public:
24  DlnaLogger.log(DlnaInfo, "HttpRequest");
25  // default_client.setInsecure();
27  }
28 
29  HttpRequest(Client &client) {
30  DlnaLogger.log(DlnaInfo, "HttpRequest");
32  }
33 
34  void setClient(Client &client) { this->client_ptr = &client; }
35 
36  // the requests usually need a host. This needs to be set if we did not
37  // provide a URL
38  void setHost(const char *host) {
39  DlnaLogger.log(DlnaInfo, "setHost", host);
40  this->host_name = host;
41  }
42 
43  operator bool() { return client_ptr != nullptr && (bool)*client_ptr; }
44 
45  virtual bool connected() { return client_ptr->connected(); }
46 
47  virtual int available() {
48  if (reply_header.isChunked()) {
49  return chunk_reader.available();
50  }
51  return client_ptr->available();
52  }
53 
54  virtual void stop() {
55  DlnaLogger.log(DlnaInfo, "stop");
56  client_ptr->stop();
57  }
58 
59  virtual int post(Url &url, const char *mime, const char *data, int len = -1) {
60  DlnaLogger.log(DlnaInfo, "post %s", url.url());
61  return process(T_POST, url, mime, data, len);
62  }
63 
64  virtual int put(Url &url, const char *mime, const char *data, int len = -1) {
65  DlnaLogger.log(DlnaInfo, "put %s", url.url());
66  return process(T_PUT, url, mime, data, len);
67  }
68 
69  virtual int del(Url &url, const char *mime = nullptr,
70  const char *data = nullptr, int len = -1) {
71  DlnaLogger.log(DlnaInfo, "del %s", url.url());
72  return process(T_DELETE, url, mime, data, len);
73  }
74 
75  virtual int get(Url &url, const char *acceptMime = nullptr,
76  const char *data = nullptr, int len = -1) {
77  DlnaLogger.log(DlnaInfo, "get %s", str(url.url()));
78  this->accept = acceptMime;
79  return process(T_GET, url, nullptr, data, len);
80  }
81 
82  virtual int head(Url &url, const char *acceptMime = nullptr,
83  const char *data = nullptr, int len = -1) {
84  DlnaLogger.log(DlnaInfo, "head %s", url.url());
85  this->accept = acceptMime;
86  return process(T_HEAD, url, nullptr, data, len);
87  }
88 
89  virtual int subscribe(Url &url) {
90  DlnaLogger.log(DlnaInfo, "post %s", url.url());
91  return process(T_SUBSCRIBE, url, nullptr, nullptr, 0);
92  }
93 
94  // reads the reply data
95  virtual int read(uint8_t *str, int len) {
96  if (reply_header.isChunked()) {
97  return chunk_reader.read(*client_ptr, str, len);
98  } else {
99  return client_ptr->read(str, len);
100  }
101  }
102 
103  // read the reply data up to the next new line. For Chunked data we provide
104  // the full chunk!
105  virtual int readln(uint8_t *str, int len, bool incl_nl = true) {
106  if (reply_header.isChunked()) {
107  return chunk_reader.readln(*client_ptr, str, len);
108  } else {
109  return chunk_reader.readlnInternal(*client_ptr, str, len, incl_nl);
110  }
111  }
112 
113  // provides the head information of the reply
114  virtual HttpReplyHeader &reply() { return reply_header; }
115 
116  virtual HttpRequestHeader &request() { return request_header; }
117 
118  virtual void setAgent(const char *agent) { this->agent = agent; }
119 
120  virtual void setConnection(const char *connection) {
121  this->connection = connection;
122  }
123 
124  virtual void setAcceptsEncoding(const char *enc) {
125  this->accept_encoding = enc;
126  }
127 
128  Client *client() { return client_ptr; }
129 
130  void setTimeout(int ms) { client_ptr->setTimeout(ms); }
131 
132  protected:
133  WiFiClient default_client;
134  Client *client_ptr;
140  const char *agent = nullptr;
141  const char *connection = CON_CLOSE;
142  const char *accept = ACCEPT_ALL;
143  const char *accept_encoding = nullptr;
144 
145  const char *str(const char *in) { return in == nullptr ? "" : in; }
146 
147  // opens a connection to the indicated host
148  virtual int connect(const char *ip, uint16_t port) {
149  DlnaLogger.log(DlnaInfo, "connect %s", ip);
150  int rc = this->client_ptr->connect(ip, port);
151  uint64_t end = millis() + client_ptr->getTimeout();
152  DlnaLogger.log(DlnaInfo, "Connected: %s (rc=%d) with timeout %ld",
153  connected() ? "true" : "false", rc,
154  client_ptr->getTimeout());
155  return rc;
156  }
157 
158  // sends request and reads the reply_header from the server
159  virtual int process(TinyMethodID action, Url &url, const char *mime,
160  const char *data, int len = -1) {
161  if (!connected()) {
162  DlnaLogger.log(DlnaInfo, "Connecting to host %s port %d", url.host(),
163  url.port());
164 
165  connect(url.host(), url.port());
166  }
167 
168  if (!connected()) {
169  DlnaLogger.log(DlnaInfo, "Connected: %s", connected() ? "true" : "false");
170  return -1;
171  }
172 
173  if (host_name.isEmpty()) {
174  host_name = url.host();
175  host_name.add(":");
176  host_name.add(url.port());
177  }
178 
179  request_header.setValues(action, url.path());
180  if (len == -1 && data != nullptr) {
181  len = strlen(data);
182  }
183  if (len > 0) {
185  }
186  if (!host_name.isEmpty()) {
188  }
189  if (agent != nullptr) {
191  }
192  if (accept_encoding != nullptr) {
194  }
195  if (mime != nullptr) {
197  }
198 
201 
203 
204  if (len > 0) {
205  DlnaLogger.log(DlnaInfo, "process - writing data");
206  client_ptr->write((const uint8_t *)data, len);
207  }
208 
210 
211  // if we use chunked tranfer we need to read the first chunked length
212  if (reply_header.isChunked()) {
214  };
215 
216  return reply_header.statusCode();
217  }
218 };
219 
221 
222 } // 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
HttpHeader & put(const char *key, const char *value)
Definition: HttpHeader.h:103
bool isChunked()
Definition: HttpHeader.h:229
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:47
void setTimeout(int ms)
Definition: HttpRequest.h:130
Url url
Definition: HttpRequest.h:135
const char * agent
Definition: HttpRequest.h:140
virtual HttpRequestHeader & request()
Definition: HttpRequest.h:116
virtual HttpReplyHeader & reply()
Definition: HttpRequest.h:114
virtual int subscribe(Url &url)
Definition: HttpRequest.h:89
HttpReplyHeader reply_header
Definition: HttpRequest.h:137
const char * accept
Definition: HttpRequest.h:142
HttpRequestHeader request_header
Definition: HttpRequest.h:136
Str host_name
Definition: HttpRequest.h:139
virtual int put(Url &url, const char *mime, const char *data, int len=-1)
Definition: HttpRequest.h:64
virtual int get(Url &url, const char *acceptMime=nullptr, const char *data=nullptr, int len=-1)
Definition: HttpRequest.h:75
virtual void setAcceptsEncoding(const char *enc)
Definition: HttpRequest.h:124
virtual void setAgent(const char *agent)
Definition: HttpRequest.h:118
HttpRequest()
Definition: HttpRequest.h:23
const char * accept_encoding
Definition: HttpRequest.h:143
virtual bool connected()
Definition: HttpRequest.h:45
virtual void setConnection(const char *connection)
Definition: HttpRequest.h:120
Client * client()
Definition: HttpRequest.h:128
void setHost(const char *host)
Definition: HttpRequest.h:38
virtual int head(Url &url, const char *acceptMime=nullptr, const char *data=nullptr, int len=-1)
Definition: HttpRequest.h:82
HttpRequest(Client &client)
Definition: HttpRequest.h:29
const char * str(const char *in)
Definition: HttpRequest.h:145
virtual int post(Url &url, const char *mime, const char *data, int len=-1)
Definition: HttpRequest.h:59
virtual int readln(uint8_t *str, int len, bool incl_nl=true)
Definition: HttpRequest.h:105
Client * client_ptr
Definition: HttpRequest.h:134
const char * connection
Definition: HttpRequest.h:141
virtual int process(TinyMethodID action, Url &url, const char *mime, const char *data, int len=-1)
Definition: HttpRequest.h:159
virtual int del(Url &url, const char *mime=nullptr, const char *data=nullptr, int len=-1)
Definition: HttpRequest.h:69
virtual int connect(const char *ip, uint16_t port)
Definition: HttpRequest.h:148
WiFiClient default_client
Definition: HttpRequest.h:133
virtual void stop()
Definition: HttpRequest.h:54
HttpChunkReader chunk_reader
Definition: HttpRequest.h:138
virtual int read(uint8_t *str, int len)
Definition: HttpRequest.h:95
void setClient(Client &client)
Definition: HttpRequest.h:34
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:124
virtual bool isEmpty()
checks if the string is empty
Definition: StrView.h:376
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:188
URL parser which breaks a full url string up into its individual parts.
Definition: Url.h:18
const char * path()
Definition: Url.h:47
int port()
Definition: Url.h:51
const char * url()
Definition: Url.h:46
const char * host()
Definition: Url.h:48
Definition: Allocator.h:6
const char * CONTENT_TYPE
Definition: HttpHeader.h:16
@ DlnaInfo
Definition: Logger.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