PatternHandler.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <PatternHandler.h>
  2. PatternHandler::PatternHandler(
  3. const String& pattern,
  4. const HTTPMethod method,
  5. const PatternHandler::TPatternHandlerFn fn)
  6. : method(method),
  7. fn(fn),
  8. _pattern(new char[pattern.length() + 1]),
  9. patternTokens(NULL)
  10. {
  11. strcpy(_pattern, pattern.c_str());
  12. patternTokens = new TokenIterator(_pattern, pattern.length(), '/');
  13. }
  14. PatternHandler::~PatternHandler() {
  15. delete _pattern;
  16. delete patternTokens;
  17. }
  18. bool PatternHandler::canHandle(HTTPMethod requestMethod, String requestUri) {
  19. if (this->method != HTTP_ANY && requestMethod != this->method) {
  20. return false;
  21. }
  22. bool canHandle = true;
  23. char requestUriCopy[requestUri.length() + 1];
  24. strcpy(requestUriCopy, requestUri.c_str());
  25. TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
  26. patternTokens->reset();
  27. while (patternTokens->hasNext() && requestTokens.hasNext()) {
  28. const char* patternToken = patternTokens->nextToken();
  29. const char* requestToken = requestTokens.nextToken();
  30. if (patternToken[0] != ':' && strcmp(patternToken, requestToken) != 0) {
  31. canHandle = false;
  32. break;
  33. }
  34. if (patternTokens->hasNext() != requestTokens.hasNext()) {
  35. canHandle = false;
  36. break;
  37. }
  38. }
  39. return canHandle;
  40. }
  41. bool PatternHandler::handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
  42. if (! canHandle(requestMethod, requestUri)) {
  43. return false;
  44. }
  45. char requestUriCopy[requestUri.length()];
  46. strcpy(requestUriCopy, requestUri.c_str());
  47. TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
  48. UrlTokenBindings bindings(*patternTokens, requestTokens);
  49. fn(&bindings);
  50. }