PatternHandler.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef _PATTERNHANDLER_H
  2. #define _PATTERNHANDLER_H
  3. #include <Arduino.h>
  4. #include <ESP8266WebServer.h>
  5. #include <Vector.h>
  6. #include <functional>
  7. struct StringToken {
  8. StringToken(const int start, const int end)
  9. : start(start), end(end) { }
  10. int start;
  11. int end;
  12. const String extract(const String& s) const {
  13. return s.substring(start, end);
  14. }
  15. };
  16. class UrlTokenBindings {
  17. public:
  18. UrlTokenBindings(const String* patternTokens,
  19. const Vector<StringToken>* urlTokenPositions,
  20. const String& url
  21. )
  22. : patternTokens(patternTokens),
  23. numTokens(urlTokenPositions->size())
  24. {
  25. urlTokens = new String[numTokens];
  26. for (int i = 0; i < numTokens; i++) {
  27. urlTokens[i] = (*urlTokenPositions)[i].extract(url);
  28. }
  29. }
  30. ~UrlTokenBindings() {
  31. delete[] urlTokens;
  32. }
  33. bool hasBinding(const String& key) const {
  34. for (int i = 0; i < numTokens; i++) {
  35. if (patternTokens[i] == key) {
  36. return true;
  37. }
  38. }
  39. return false;
  40. }
  41. String get(const String& key) const {
  42. for (int i = 0; i < numTokens; i++) {
  43. if (patternTokens[i].substring(1) == key) {
  44. return urlTokens[i];
  45. }
  46. }
  47. }
  48. private:
  49. const String* patternTokens;
  50. String* urlTokens;
  51. const size_t numTokens;
  52. };
  53. class PatternHandler : public RequestHandler {
  54. public:
  55. typedef std::function<void(UrlTokenBindings*)> TPatternHandlerFn;
  56. PatternHandler(const String& pattern,
  57. const HTTPMethod method,
  58. const TPatternHandlerFn fn);
  59. ~PatternHandler() {
  60. delete patternTokens;
  61. }
  62. static void tokenize(const String& path, Vector<StringToken>* tokenPositions);
  63. bool canHandle(HTTPMethod requestMethod, String requestUri) override;
  64. bool handle(ESP8266WebServer& server, HTTPMethod requesetMethod, String requestUri) override;
  65. private:
  66. size_t numPatternTokens;
  67. String* patternTokens;
  68. Vector<StringToken>* tokenPositions;
  69. const HTTPMethod method;
  70. const PatternHandler::TPatternHandlerFn fn;
  71. };
  72. #endif