PatternHandler.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. 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. } else {
  36. canHandle = false;
  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. UrlTokenBindings* bindings = new UrlTokenBindings(patternTokens, tokenPositions, requestUri);
  45. fn(bindings);
  46. delete bindings;
  47. }
  48. void PatternHandler::tokenize(const String& path, Vector<StringToken>* tokenPositions) {
  49. int lastStart = 0;
  50. int currentPosition = 0;
  51. for (int i = 0; i < path.length(); i++) {
  52. if (path.charAt(i) == '/' || i == path.length()-1) {
  53. // If we're in the last position, include the last character if it isn't
  54. // a '/'
  55. if (path.charAt(i) != '/') {
  56. currentPosition++;
  57. }
  58. if (lastStart > 0 && currentPosition > lastStart) {
  59. StringToken token(lastStart, currentPosition);
  60. tokenPositions->push_back(token);
  61. }
  62. lastStart = i+1;
  63. }
  64. currentPosition++;
  65. }
  66. }