PatternHandler.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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) {
  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. if (numPatternTokens == tokenPositions->size()) {
  27. for (int i = 0; i < numPatternTokens; i++) {
  28. const StringToken urlTokenP = (*tokenPositions)[i];
  29. if (!patternTokens[i].startsWith(":")
  30. && patternTokens[i] != urlTokenP.extract(requestUri)) {
  31. canHandle = false;
  32. break;
  33. }
  34. }
  35. }
  36. return canHandle;
  37. }
  38. bool PatternHandler::handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
  39. if (! canHandle(requestMethod, requestUri)) {
  40. return false;
  41. }
  42. Serial.println("Trying to handle.");
  43. Serial.println(tokenPositions->size());
  44. UrlTokenBindings* bindings = new UrlTokenBindings(patternTokens, tokenPositions, requestUri);
  45. Serial.println("Constructed bindings");
  46. fn(bindings);
  47. Serial.println("Called handler");
  48. delete bindings;
  49. }
  50. void PatternHandler::tokenize(const String& path, Vector<StringToken>* tokenPositions) {
  51. int lastStart = 0;
  52. int currentPosition = 0;
  53. for (int i = 0; i < path.length(); i++) {
  54. if (path.charAt(i) == '/' || i == path.length()-1) {
  55. // If we're in the last position, include the last character if it isn't
  56. // a '/'
  57. if (path.charAt(i) != '/') {
  58. currentPosition++;
  59. }
  60. if (lastStart > 0 && currentPosition > lastStart) {
  61. StringToken token(lastStart, currentPosition);
  62. tokenPositions->push_back(token);
  63. }
  64. lastStart = i+1;
  65. }
  66. currentPosition++;
  67. }
  68. }