PatternHandler.cpp 2.5 KB

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