PatternHandler.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <PatternHandler.h>
  2. UrlTokenBindings::UrlTokenBindings(TokenIterator& patternTokens, TokenIterator& requestTokens)
  3. : patternTokens(patternTokens),
  4. requestTokens(requestTokens)
  5. { }
  6. bool UrlTokenBindings::hasBinding(const String &key) const {
  7. const char* searchToken = key.c_str();
  8. patternTokens.reset();
  9. while (patternTokens.hasNext()) {
  10. const char* token = patternTokens.nextToken();
  11. if (strcmp(token, searchToken) == 0) {
  12. return true;
  13. }
  14. }
  15. return false;
  16. }
  17. const char* UrlTokenBindings::get(const String &key) const {
  18. const char* searchToken = key.c_str();
  19. patternTokens.reset();
  20. requestTokens.reset();
  21. while (patternTokens.hasNext() && requestTokens.hasNext()) {
  22. const char* token = patternTokens.nextToken();
  23. const char* binding = requestTokens.nextToken();
  24. if (token[0] == ':' && strcmp(token+1, searchToken) == 0) {
  25. return binding;
  26. }
  27. }
  28. return NULL;
  29. }
  30. PatternHandler::PatternHandler(
  31. const String& pattern,
  32. const HTTPMethod method,
  33. const PatternHandler::TPatternHandlerFn fn)
  34. : method(method),
  35. fn(fn),
  36. _pattern(new char[pattern.length() + 1]),
  37. patternTokens(NULL)
  38. {
  39. strcpy(_pattern, pattern.c_str());
  40. patternTokens = new TokenIterator(_pattern, pattern.length(), '/');
  41. }
  42. PatternHandler::~PatternHandler() {
  43. delete _pattern;
  44. delete patternTokens;
  45. }
  46. bool PatternHandler::canHandle(HTTPMethod requestMethod, String requestUri) {
  47. if (this->method != HTTP_ANY && requestMethod != this->method) {
  48. return false;
  49. }
  50. bool canHandle = true;
  51. char requestUriCopy[requestUri.length() + 1];
  52. strcpy(requestUriCopy, requestUri.c_str());
  53. TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
  54. patternTokens->reset();
  55. while (patternTokens->hasNext() && requestTokens.hasNext()) {
  56. const char* patternToken = patternTokens->nextToken();
  57. const char* requestToken = requestTokens.nextToken();
  58. if (patternToken[0] != ':' && strcmp(patternToken, requestToken) != 0) {
  59. canHandle = false;
  60. break;
  61. }
  62. if (patternTokens->hasNext() != requestTokens.hasNext()) {
  63. canHandle = false;
  64. break;
  65. }
  66. }
  67. return canHandle;
  68. }
  69. bool PatternHandler::handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
  70. if (! canHandle(requestMethod, requestUri)) {
  71. return false;
  72. }
  73. char requestUriCopy[requestUri.length()];
  74. strcpy(requestUriCopy, requestUri.c_str());
  75. TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
  76. UrlTokenBindings bindings(*patternTokens, requestTokens);
  77. fn(&bindings);
  78. }