HttpImportResource.h
Go to the documentation of this file.
1 
20 #pragma once
21 
22 #include "../Database.h"
24 
25 namespace ConfigDB
26 {
31 {
32 public:
41 
50  using OnComplete = Delegate<void(HttpRequest& request, HttpResponse& response, ImportStream& stream)>;
51 
55  HttpImportResource(OnRequest onRequest, OnComplete onComplete) : onRequest(onRequest), onComplete(onComplete)
56  {
57  init();
58  }
59 
61  {
62  init();
63 
64  onRequest = [&database, &format](HttpRequest&, MimeType mimeType) -> std::unique_ptr<ImportStream> {
65  debug_i("POST REQ");
66  if(mimeType != format.getMimeType()) {
67  return nullptr;
68  }
69  return database.createImportStream(format);
70  };
71 
72  onComplete = [](HttpRequest&, HttpResponse& response, ImportStream& stream) -> void {
73  String msg;
74  msg += F("Result: ");
75  auto status = stream.getStatus();
76  msg += toString(status);
77  response.sendString(msg);
78  debug_i("%s", msg.c_str());
79  switch(status.error) {
80  case Error::OK:
81  break;
82  case Error::FormatError:
83  response.code = HTTP_STATUS_BAD_REQUEST;
84  break;
85  case Error::UpdateConflict:
86  response.code = HTTP_STATUS_CONFLICT;
87  break;
88  case Error::FileError:
89  response.code = HTTP_STATUS_INTERNAL_SERVER_ERROR;
90  break;
91  }
92  };
93  }
94 
95 private:
96  void init()
97  {
98  onHeadersComplete = [this](HttpServerConnection&, HttpRequest& request, HttpResponse& response) -> int {
99  if(request.args) {
100  response.code = HTTP_STATUS_INTERNAL_SERVER_ERROR;
101  return 0;
102  }
103 
104  if(request.method != HTTP_POST) {
105  response.code = HTTP_STATUS_BAD_REQUEST;
106  return 0;
107  }
108 
109  String contentType = request.headers[HTTP_HEADER_CONTENT_TYPE];
110  auto stream = this->onRequest(request, ContentType::fromString(contentType));
111  if(!stream) {
112  response.code = HTTP_STATUS_BAD_REQUEST;
113  return 0;
114  }
115 
116  request.args = stream.release();
117  return 0;
118  };
119 
120  onBody = [](HttpServerConnection&, HttpRequest& request, const char* at, int length) -> int {
121  auto stream = static_cast<ImportStream*>(request.args);
122  if(!stream) {
123  return 0;
124  }
125  return stream->write(at, length) == size_t(length) ? 0 : 1;
126  };
127 
128  onRequestComplete = [this](HttpServerConnection&, HttpRequest& request, HttpResponse& response) -> int {
129  auto stream = static_cast<ImportStream*>(request.args);
130  if(stream) {
131  this->onComplete(request, response, *stream);
132  delete stream;
133  request.args = nullptr;
134  }
135  return 0;
136  };
137  }
138 
139  OnRequest onRequest;
140  OnComplete onComplete;
141 };
142 
143 } // namespace ConfigDB
std::enable_if< std::is_integral< T >::value, String >::type toString(T value)
Definition: BitSet.h:481
#define F(string_literal)
Wrap a string literal stored in flash and access it using a String object.
Definition: WString.h:109
Definition: Database.h:30
std::unique_ptr< ImportStream > createImportStream(const Format &format)
Create a write-only stream for de-serializing the database.
Definition: Database.h:147
HttpResource handler to support streaming updates to a configuration database.
Definition: HttpImportResource.h:31
HttpImportResource(Database &database, const Format &format)
Definition: HttpImportResource.h:60
Delegate< void(HttpRequest &request, HttpResponse &response, ImportStream &stream)> OnComplete
Callback invoked when a POST request has completed.
Definition: HttpImportResource.h:50
HttpImportResource(OnRequest onRequest, OnComplete onComplete)
Construct a resource handler.
Definition: HttpImportResource.h:55
Delegate< std::unique_ptr< ImportStream >(HttpRequest &request, MimeType mimeType)> OnRequest
Callback invoked when a POST request received.
Definition: HttpImportResource.h:40
Definition: Libraries/ConfigDB/src/include/ConfigDB/Format.h:33
MimeType getMimeType() const override
Get the MIME type for this reader format.
Definition: Libraries/ConfigDB/src/include/ConfigDB/Json/Format.h:48
Encapsulates an incoming or outgoing request.
Definition: HttpRequest.h:37
Instances of this class are registered with an HttpServer for a specific URL.
Definition: HttpResource.h:34
HttpResourceDelegate onHeadersComplete
headers are ready
Definition: HttpResource.h:66
HttpResourceDelegate onRequestComplete
request is complete OR upgraded
Definition: HttpResource.h:67
HttpServerConnectionBodyDelegate onBody
resource wants to process the raw body data
Definition: HttpResource.h:65
Represents either an incoming or outgoing response to a HTTP request.
Definition: HttpResponse.h:26
Definition: HttpServerConnection.h:34
The String class.
Definition: WString.h:133
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:609
#define debug_i
Definition: debug_progmem.h:99
MimeType
Definition: WebConstants.h:53
Definition: Array.h:26
FormatError
Definition: Status.h:48
MimeType fromString(const char *str)
Get enumerated value for a MIME type string.
Definition: Formatter.h:20