PatternHandler.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include <PatternHandler.h>
  2. PatternHandler::PatternHandler(
  3. const String& pattern,
  4. const HTTPMethod method,
  5. const PatternHandler::TPatternHandlerFn fn
  6. ) : method(method), fn(fn), tokenPositions(NULL) {
  7. Vector<StringToken>* tokenPositions = new Vector<StringToken>();
  8. tokenize(pattern, tokenPositions);
  9. numPatternTokens = tokenPositions->size();
  10. patternTokens = new String[numPatternTokens];
  11. for (int i = 0; i < tokenPositions->size(); i++) {
  12. patternTokens[i] = (*tokenPositions)[i].extract(pattern);
  13. }
  14. delete tokenPositions;
  15. }
  16. bool PatternHandler::canHandle(HTTPMethod requestMethod, String requestUri) {
  17. if (requestMethod != HTTP_ANY && requestMethod != this->method) {
  18. return false;
  19. }
  20. if (tokenPositions) {
  21. delete tokenPositions;
  22. }
  23. bool canHandle = true;
  24. tokenPositions = new Vector<StringToken>();
  25. tokenize(requestUri, tokenPositions);
  26. Serial.print(tokenPositions->size());
  27. Serial.println(" tokens in URL");
  28. if (numPatternTokens == tokenPositions->size()) {
  29. for (int i = 0; i < numPatternTokens; i++) {
  30. const StringToken urlTokenP = (*tokenPositions)[i];
  31. if (!patternTokens[i].startsWith(":")
  32. && patternTokens[i] != urlTokenP.extract(requestUri)) {
  33. canHandle = false;
  34. break;
  35. }
  36. }
  37. }
  38. return canHandle;
  39. }
  40. bool PatternHandler::handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
  41. if (! canHandle(requestMethod, requestUri)) {
  42. return false;
  43. }
  44. Serial.println("Trying to handle.");
  45. Serial.println(tokenPositions->size());
  46. UrlTokenBindings* bindings = new UrlTokenBindings(patternTokens, tokenPositions, requestUri);
  47. Serial.println("Constructed bindings");
  48. fn(bindings);
  49. Serial.println("Called handler");
  50. delete bindings;
  51. }
  52. void PatternHandler::tokenize(const String& path, Vector<StringToken>* tokenPositions) {
  53. int lastStart = 0;
  54. int currentPosition = 0;
  55. for (int i = 0; i < path.length(); i++) {
  56. if (path.charAt(i) == '/' || i == path.length()-1) {
  57. // If we're in the last position, include the last character if it isn't
  58. // a '/'
  59. if (path.charAt(i) != '/') {
  60. currentPosition++;
  61. }
  62. if (lastStart > 0 && currentPosition > lastStart) {
  63. StringToken token(lastStart, currentPosition);
  64. tokenPositions->push_back(token);
  65. }
  66. lastStart = i+1;
  67. }
  68. currentPosition++;
  69. }
  70. }