| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #include <PatternHandler.h>
- UrlTokenBindings::UrlTokenBindings(TokenIterator& patternTokens, TokenIterator& requestTokens)
- : patternTokens(patternTokens),
- requestTokens(requestTokens)
- { }
- bool UrlTokenBindings::hasBinding(const String &key) const {
- const char* searchToken = key.c_str();
- patternTokens.reset();
- while (patternTokens.hasNext()) {
- const char* token = patternTokens.nextToken();
- if (strcmp(token, searchToken) == 0) {
- return true;
- }
- }
- return false;
- }
- const char* UrlTokenBindings::get(const String &key) const {
- const char* searchToken = key.c_str();
- patternTokens.reset();
- requestTokens.reset();
- while (patternTokens.hasNext() && requestTokens.hasNext()) {
- const char* token = patternTokens.nextToken();
- const char* binding = requestTokens.nextToken();
- if (token[0] == ':' && strcmp(token+1, searchToken) == 0) {
- return binding;
- }
- }
- return NULL;
- }
- PatternHandler::PatternHandler(
- const String& pattern,
- const HTTPMethod method,
- const PatternHandler::TPatternHandlerFn fn)
- : method(method),
- fn(fn),
- _pattern(new char[pattern.length() + 1]),
- patternTokens(NULL)
- {
- strcpy(_pattern, pattern.c_str());
- patternTokens = new TokenIterator(_pattern, pattern.length(), '/');
- }
- PatternHandler::~PatternHandler() {
- delete _pattern;
- delete patternTokens;
- }
- bool PatternHandler::canHandle(HTTPMethod requestMethod, String requestUri) {
- if (this->method != HTTP_ANY && requestMethod != this->method) {
- return false;
- }
- bool canHandle = true;
- char requestUriCopy[requestUri.length() + 1];
- strcpy(requestUriCopy, requestUri.c_str());
- TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
- patternTokens->reset();
- while (patternTokens->hasNext() && requestTokens.hasNext()) {
- const char* patternToken = patternTokens->nextToken();
- const char* requestToken = requestTokens.nextToken();
- if (patternToken[0] != ':' && strcmp(patternToken, requestToken) != 0) {
- canHandle = false;
- break;
- }
- if (patternTokens->hasNext() != requestTokens.hasNext()) {
- canHandle = false;
- break;
- }
- }
- return canHandle;
- }
- bool PatternHandler::handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
- if (! canHandle(requestMethod, requestUri)) {
- return false;
- }
- char requestUriCopy[requestUri.length()];
- strcpy(requestUriCopy, requestUri.c_str());
- TokenIterator requestTokens(requestUriCopy, requestUri.length(), '/');
- UrlTokenBindings bindings(*patternTokens, requestTokens);
- fn(&bindings);
- }
|