Explorar o código

Use newly minted upstream library for REST route handling (#445)

* Use upstream library for path variables

* remove unused method

* Use published library instead of scm
Chris Mullins %!s(int64=6) %!d(string=hai) anos
pai
achega
2f5f02c288

+ 0 - 51
lib/Helpers/TokenIterator.cpp

@@ -1,51 +0,0 @@
-#include <TokenIterator.h>
-
-TokenIterator::TokenIterator(char* data, size_t length, const char sep)
-  : data(data),
-    current(data),
-    length(length),
-    sep(sep),
-    i(0)
-{
-  for (size_t i = 0; i < length; i++) {
-    if (data[i] == sep) {
-      data[i] = 0;
-    }
-  }
-}
-
-const char* TokenIterator::nextToken() {
-  if (i >= length) {
-    return NULL;
-  }
-
-  char* token = current;
-  char* nextToken = current;
-
-  for (; i < length && *nextToken != 0; i++, nextToken++);
-
-  if (i == length) {
-    nextToken = NULL;
-  } else {
-    i = (nextToken - data);
-
-    if (i < length) {
-      nextToken++;
-    } else {
-      nextToken = NULL;
-    }
-  }
-
-  current = nextToken;
-
-  return token;
-}
-
-void TokenIterator::reset() {
-  current = data;
-  i = 0;
-}
-
-bool TokenIterator::hasNext() {
-  return i < length;
-}

+ 0 - 21
lib/Helpers/TokenIterator.h

@@ -1,21 +0,0 @@
-#include <Arduino.h>
-
-#ifndef _TOKEN_ITERATOR_H
-#define _TOKEN_ITERATOR_H
-
-class TokenIterator {
-public:
-  TokenIterator(char* data, size_t length, char sep = ',');
-
-  bool hasNext();
-  const char* nextToken();
-  void reset();
-
-private:
-  char* data;
-  char* current;
-  size_t length;
-  char sep;
-  size_t i;
-};
-#endif

+ 0 - 35
lib/Helpers/UrlTokenBindings.cpp

@@ -1,35 +0,0 @@
-#include <UrlTokenBindings.h>
-
-UrlTokenBindings::UrlTokenBindings(TokenIterator& patternTokens, TokenIterator& requestTokens)
-  : patternTokens(patternTokens),
-    requestTokens(requestTokens)
-{ }
-
-bool UrlTokenBindings::hasBinding(const char* searchToken) const {
-  patternTokens.reset();
-  while (patternTokens.hasNext()) {
-    const char* token = patternTokens.nextToken();
-
-    if (token[0] == ':' && strcmp(token+1, searchToken) == 0) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-const char* UrlTokenBindings::get(const char* searchToken) const {
-  patternTokens.reset();
-  requestTokens.reset();
-
-  while (patternTokens.hasNext() && requestTokens.hasNext()) {
-    const char* token = patternTokens.nextToken();
-    const char* binding = requestTokens.nextToken();
-
-    if (token[0] == ':' && strcmp(token+1, searchToken) == 0) {
-      return binding;
-    }
-  }
-
-  return NULL;
-}

+ 0 - 18
lib/Helpers/UrlTokenBindings.h

@@ -1,18 +0,0 @@
-#include <TokenIterator.h>
-
-#ifndef _URL_TOKEN_BINDINGS_H
-#define _URL_TOKEN_BINDINGS_H
-
-class UrlTokenBindings {
-public:
-  UrlTokenBindings(TokenIterator& patternTokens, TokenIterator& requestTokens);
-
-  bool hasBinding(const char* key) const;
-  const char* get(const char* key) const;
-
-private:
-  TokenIterator& patternTokens;
-  TokenIterator& requestTokens;
-};
-
-#endif

+ 0 - 64
lib/WebServer/PatternHandler.cpp

@@ -1,64 +0,0 @@
-#include <PatternHandler.h>
-
-PatternHandler::PatternHandler(
-    const String& pattern,
-    const HTTPMethod method,
-    const PatternHandler::TPatternHandlerFn fn)
-  : _pattern(new char[pattern.length() + 1]),
-    patternTokens(NULL),
-    method(method),
-    fn(fn)
-{
-  strcpy(_pattern, pattern.c_str());
-  patternTokens = new TokenIterator(_pattern, pattern.length(), '/');
-}
-
-PatternHandler::~PatternHandler() {
-  delete _pattern;
-  delete patternTokens;
-}
-
-bool PatternHandler::canHandle(HTTPMethod requestMethod, String requestUri) {
-  if (this->method != HTTP_ANY && requestMethod != this->method) {
-    return false;
-  }
-
-  bool canHandle = true;
-
-  char requestUriCopy[requestUri.length() + 1];
-  strcpy(requestUriCopy, requestUri.c_str());
-  TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
-
-  patternTokens->reset();
-  while (patternTokens->hasNext() && requestTokens.hasNext()) {
-    const char* patternToken = patternTokens->nextToken();
-    const char* requestToken = requestTokens.nextToken();
-
-    if (patternToken[0] != ':' && strcmp(patternToken, requestToken) != 0) {
-      canHandle = false;
-      break;
-    }
-
-    if (patternTokens->hasNext() != requestTokens.hasNext()) {
-      canHandle = false;
-      break;
-    }
-  }
-
-  return canHandle;
-}
-
-bool PatternHandler::handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
-  if (! canHandle(requestMethod, requestUri)) {
-    return false;
-  }
-
-  char requestUriCopy[requestUri.length()];
-  strcpy(requestUriCopy, requestUri.c_str());
-  TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
-
-  UrlTokenBindings bindings(*patternTokens, requestTokens);
-  fn(&bindings);
-
-  return true;
-}

+ 0 - 30
lib/WebServer/PatternHandler.h

@@ -1,30 +0,0 @@
-#ifndef _PATTERNHANDLER_H
-#define _PATTERNHANDLER_H
-
-#include <Arduino.h>
-#include <ESP8266WebServer.h>
-#include <functional>
-#include <TokenIterator.h>
-#include <UrlTokenBindings.h>
-
-class PatternHandler : public RequestHandler {
-public:
-  typedef std::function<void(UrlTokenBindings*)> TPatternHandlerFn;
-
-  PatternHandler(const String& pattern,
-    const HTTPMethod method,
-    const TPatternHandlerFn fn);
-
-  ~PatternHandler();
-
-  bool canHandle(HTTPMethod requestMethod, String requestUri) override;
-  bool handle(ESP8266WebServer& server, HTTPMethod requesetMethod, String requestUri) override;
-
-private:
-  char* _pattern;
-  TokenIterator* patternTokens;
-  const HTTPMethod method;
-  const PatternHandler::TPatternHandlerFn fn;
-};
-
-#endif

+ 7 - 7
lib/WebServer/WebServer.cpp

@@ -1,5 +1,5 @@
 #include <WebServer.h>
-#include <PatternHandler.h>
+#include <PathVariableHandler.h>
 
 void WebServer::onAuthenticated(const String &uri, THandlerFunction handler) {
   THandlerFunction authHandler = [this, handler]() {
@@ -31,18 +31,18 @@ void WebServer::onAuthenticated(const String &uri, HTTPMethod method, THandlerFu
   ESP8266WebServer::on(uri, method, authHandler, ufn);
 }
 
-void WebServer::onPattern(const String& pattern, const HTTPMethod method, PatternHandler::TPatternHandlerFn handler) {
-  addHandler(new PatternHandler(pattern, method, handler));
+void WebServer::onPattern(const String& pattern, const HTTPMethod method, PathVariableHandler::TPathVariableHandlerFn handler) {
+  addHandler(new PathVariableHandler(pattern.c_str(), method, handler));
 }
 
-void WebServer::onPatternAuthenticated(const String& pattern, const HTTPMethod method, PatternHandler::TPatternHandlerFn fn) {
-  PatternHandler::TPatternHandlerFn authHandler = [this, fn](UrlTokenBindings* bindings) {
+void WebServer::onPatternAuthenticated(const String& pattern, const HTTPMethod method, PathVariableHandler::TPathVariableHandlerFn fn) {
+  PathVariableHandler::TPathVariableHandlerFn authHandler = [this, fn](UrlTokenBindings* bindings) {
     if (this->validateAuthentiation()) {
       fn(bindings);
     }
   };
 
-  addHandler(new PatternHandler(pattern, method, authHandler));
+  addHandler(new PathVariableHandler(pattern.c_str(), method, authHandler));
 }
 
 
@@ -58,7 +58,7 @@ void WebServer::disableAuthentication() {
 }
 
 bool WebServer::validateAuthentiation() {
-  if (this->authEnabled && 
+  if (this->authEnabled &&
     !authenticate(this->username.c_str(), this->password.c_str())) {
       requestAuthentication();
       return false;

+ 3 - 4
lib/WebServer/WebServer.h

@@ -4,7 +4,7 @@
 #include <Arduino.h>
 #include <ArduinoJson.h>
 #include <ESP8266WebServer.h>
-#include <PatternHandler.h>
+#include <PathVariableHandler.h>
 
 #define HTTP_DOWNLOAD_UNIT_SIZE 1460
 #define HTTP_MAX_SEND_WAIT 5000 //ms to wait for data chunk to be ACKed
@@ -17,9 +17,8 @@ public:
   void onAuthenticated(const String &uri, THandlerFunction handler);
   void onAuthenticated(const String &uri, HTTPMethod method, THandlerFunction fn);
   void onAuthenticated(const String &uri, HTTPMethod method, THandlerFunction fn, THandlerFunction ufn);
-  void onPattern(const String& pattern, const HTTPMethod method, PatternHandler::TPatternHandlerFn fn);
-  void onPatternAuthenticated(const String& pattern, const HTTPMethod method, PatternHandler::TPatternHandlerFn handler);
-  bool matchesPattern(const String& pattern, const String& url);
+  void onPattern(const String& pattern, const HTTPMethod method, PathVariableHandler::TPathVariableHandlerFn fn);
+  void onPatternAuthenticated(const String& pattern, const HTTPMethod method, PathVariableHandler::TPathVariableHandlerFn handler);
   void requireAuthentication(const String& username, const String& password);
   void disableAuthentication();
   bool validateAuthentiation();

+ 1 - 0
platformio.ini

@@ -22,6 +22,7 @@ lib_deps_external =
   ratkins/RGBConverter@07010f2
   WebSockets@~2.1.2
   CircularBuffer@~1.2.0
+  PathVariableHandlers@~1.0.0
 extra_scripts =
   pre:.build_web.py
 test_ignore = remote