HttpServerConnection.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * HttpServerConnection.h
8  *
9  * Modified: 2017 - Slavey Karadzhov <slav@attachix.com>
10  *
11  ****/
12 
13 #pragma once
14 
15 #include "HttpConnection.h"
16 #include "HttpResource.h"
17 #include "HttpBodyParser.h"
18 
19 #include <functional>
20 
26 class HttpResourceTree;
28 
30 
32 
34 {
35 public:
36  HttpServerConnection(tcp_pcb* clientTcp) : HttpConnection(clientTcp, HTTP_REQUEST)
37  {
38  }
39 
41  {
42  if(this->resource != nullptr) {
43  this->resource->shutdown(*this);
44  }
45 
46  if(bodyParser && request.args != nullptr) {
47  bodyParser(request, nullptr, PARSE_DATAEND);
48  }
49  }
50 
51  void setResourceTree(HttpResourceTree* resourceTree)
52  {
53  this->resourceTree = resourceTree;
54  }
55 
56  void setBodyParsers(const BodyParsers* bodyParsers)
57  {
58  this->bodyParsers = bodyParsers;
59  }
60 
61  void send()
62  {
65  }
66 
67  using TcpClient::send;
68 
70  {
71  upgradeCallback = callback;
72  }
73 
74  HttpRequest* getRequest() override
75  {
76  return &request;
77  }
78 
79  void setCloseOnContentError(bool close = true)
80  {
81  closeOnContentError = close;
82  }
83 
84 protected:
85  // HTTP parser methods
86 
87  int onMessageBegin(http_parser* parser) override;
88  int onPath(const Url& path) override;
89  int onHeadersComplete(const HttpHeaders& headers) override;
90  int onBody(const char* at, size_t length) override;
91  int onMessageComplete(http_parser* parser) override;
92 
93  bool onProtocolUpgrade(http_parser* parser) override
94  {
95  if(upgradeCallback) {
96  return upgradeCallback();
97  }
98 
99  return true;
100  }
101 
102  bool onHttpError(http_errno error) override;
103 
104  // TCP methods
105  void onReadyToSendData(TcpConnectionEvent sourceEvent) override;
106  virtual void sendError(const String& message = nullptr, enum http_status code = HTTP_STATUS_BAD_REQUEST);
107 
108 private:
109  void sendResponseHeaders(HttpResponse* response);
110  bool sendResponseBody(HttpResponse* response);
111 
112 public:
113  void* userData = nullptr;
114 
115 private:
116  HttpResourceTree* resourceTree = nullptr;
117  HttpResource* resource = nullptr;
118 
119  HttpRequest request;
120 
121  HttpResourceDelegate headersCompleteDelegate = nullptr;
122  HttpResourceDelegate requestCompletedDelegate = nullptr;
123  HttpServerConnectionBodyDelegate onBodyDelegate = nullptr;
124  HttpServerProtocolUpgradeCallback upgradeCallback = nullptr;
125 
126  const BodyParsers* bodyParsers = nullptr;
127  HttpBodyParserDelegate bodyParser = nullptr;
128  bool closeOnContentError = false;
129  bool hasContentError = false;
130 };
131 
~HttpServerConnection()
Definition: HttpServerConnection.h:40
Class to manage URL instance.
Definition: Url.h:66
int onMessageBegin(http_parser *parser) override
Called when a new incoming data is beginning to come.
bool onHttpError(http_errno error) override
Called when there was an error.
HttpResponse response
Definition: HttpConnection.h:239
void close() override
Occurs on data receive.
Definition: TcpConnection.h:27
int onMessageComplete(http_parser *parser) override
Called when the incoming data is complete.
Definition: HttpServerConnection.h:33
The String class.
Definition: WString.h:136
http_parser parser
Definition: HttpConnection.h:233
Encapsulates a set of HTTP header information.
Definition: HttpHeaders.h:96
bool onProtocolUpgrade(http_parser *parser) override
Called when the HTTP protocol should be upgraded.
Definition: HttpServerConnection.h:93
const int PARSE_DATAEND
End of incoming data.
Definition: HttpBodyParser.h:20
Definition: Delegate.h:20
TcpConnectionEvent
Definition: TcpConnection.h:25
int onHeadersComplete(const HttpHeaders &headers) override
Called when all headers are received.
Delegate< bool()> HttpServerProtocolUpgradeCallback
Definition: HttpServerConnection.h:31
Definition: HttpResource.h:30
bool send(const char *data, uint16_t len, bool forceCloseAfterSent=false)
void onReadyToSendData(TcpConnectionEvent sourceEvent) override
void * args
Definition: HttpRequest.h:268
HttpServerConnection(tcp_pcb *clientTcp)
Definition: HttpServerConnection.h:36
Delegate< void(HttpServerConnection &connection)> HttpServerConnectionDelegate
Definition: HttpServerConnection.h:27
void setResourceTree(HttpResourceTree *resourceTree)
Definition: HttpServerConnection.h:51
void setBodyParsers(const BodyParsers *bodyParsers)
Definition: HttpServerConnection.h:56
void * userData
use to pass user data between requests
Definition: HttpServerConnection.h:113
int onBody(const char *at, size_t length) override
Called when a piece of body data is received.
Class to map URL paths to classes which handle them.
Definition: HttpResourceTree.h:24
Definition: HttpRequest.h:35
HttpRequest * getRequest() override
Returns pointer to the current request.
Definition: HttpServerConnection.h:74
virtual void shutdown(HttpServerConnection &connection)
Takes care to cleanup the connection.
Definition: HttpResource.h:40
void setCloseOnContentError(bool close=true)
Definition: HttpServerConnection.h:79
Provides http base used for client and server connections.
Definition: HttpConnection.h:27
virtual void sendError(const String &message=nullptr, enum http_status code=HTTP_STATUS_BAD_REQUEST)
int onPath(const Url &path) override
Called when the URL path is known.
void setUpgradeCallback(HttpServerProtocolUpgradeCallback callback)
Definition: HttpServerConnection.h:69
void send()
Definition: HttpServerConnection.h:61
Definition: HttpCommon.h:38
HttpConnectionState state
Definition: HttpConnection.h:237
Definition: HttpResponse.h:20