Giter VIP home page Giter VIP logo

Comments (9)

artemklevtsov avatar artemklevtsov commented on May 18, 2024 1

#34 should fix it.
Now merged to dev.

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

При добавлении роута чекаем наличие переменных в пути. Если переменные есть, ставим отметку о том, что передан шаблон пути с переменными и разбираем эти переменные.

Пример кода для извлечения переменных:

  if(grepl("/\\{|\\}/", path)) {
    splitted <- strsplit(path, "/", fixed = TRUE)[[1L]][-1L]
    pos <- which(startsWith(splitted, "{") & endsWith(splitted, "}"))
    vars <- substr(splitted[pos], 2L, nchar(splitted[pos]) - 1L)
    private$handlers[[path]][[vars]] <- list(name = vars, pos = pos)
  }

Его предполагается вставить вот сюда.

По поводу матчинга путей при поиске подходящего обработчика. После проверки точного совпадения можно сплитнуть путь и сопоставить его с имеющимися, причём при сопоставлении учесть длину вектора и исключить ранее извлечённые переменные. Текущий вариант со startsWith можно оставить для роутов без шаблонов.

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

Нашёл реализацию похожего функционала в пакете routr: https://github.com/thomasp85/routr/blob/master/R/route.R#L273

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

Plumber related code: https://github.com/trestletech/plumber/blob/master/R/query-string.R

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

First try to make structure for the paths: https://gist.github.com/artemklevtsov/a158e6cac89dc43c454552d8a83249fd
This code can detect, exrtact and parse variables from the URL templates. Also variables types supported (as native R classes).
We can separate exact, partial and regex paths and match its with same order.
We need to do some refactoring to use this structure.

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

Предложенный выше объект R6 предлагается использовать в add_route. При этом организацию обработчиков предлагаю изменить следующим образом:

  • вместо схемы: handlers$path[[method]] использовать handlers[[method]]$path, что должно сократить область поиска.
  • При добавлении новых точек досутпа в handlers[[method]] сначала добавлять точки с методом exact, а в самый конец с методовмregex. partial между ними.

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

Если будет просадка по производительности, то для точного соответствия можно исопльзовать fastmatch (нет зависимостей), а для regex ore (нет зависимостей. бенч) или stringi.

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

Думается надо запилить отдельный R6Class для хранения и обработки путей, которые будет инициализирован для каждого метода в handlers[[method]]. Все пути можно разделить на 3 группы:

  • Точный (exact). Для этих путей мы ищем точное соответствие с помощью == + which. Ограничение: не должен оканчиваться на /.
  • Частичный (partial). Для этих путей ищем частичное соответствие с помощью startsWith или аналогов (желательна параллельная проверка множества паттернов). Ограничение: должен оканчиваться на /? Также этот вариант может быть представлен как /prefix/.*.
  • Шаблон (regex). Для этих путей ищем с помощью stri_detect_regex_first или аналогов (желательна параллельная проверка множества паттернов). Переменные задаются в фигурных скобках ({var}). После разбора переменных формируется data.frame с названием переменной, типом данных (указывается через : и заменятеся на character в случае отсутствия) и позиция в пути от корня.
    При совпадении префикса у частичного пути и регулярки, сначала необъодимо проеврять регулярки, т.к. префикс будет более общим случаем, ибо может быть записано как /prefix/.*.
    Класс должен содержать метод add_path и match_path.
    Для сведения поиска по регуляркам к минимуму предалаегтся сначала искать частичное соответствие. Для примера в пути /weather/{city} сначала проверить startsWith(path, "/weather/") и в случае успеха stri_detect_regex_first(path, "/weather/[^\]/?$")
    Замечание: пакет re2r можео принимать несколько регулярок и гоняет их с помощью RcppParallel.
    Вопросы:
  • На что заменять названия переменных при генерации регулярных выражений. Текущий вариант - [^/]+.
  • Могут ли совпадать пути в exact и partial или при добавление бросаем ошибку? Например, /status и /status/. В unix-like ОС не могут существовать одновременно файл и директория с одним названием.
  • Могут ли совпадать префиксы путей для partial и regex или при добавлении бросаем ошибку? Например: /weather/ и /weather/{city}.

from restrserve.

artemklevtsov avatar artemklevtsov commented on May 18, 2024

Могут ли совпадать префиксы путей для partial и regex или при добавлении бросаем ошибку? Например: /weather/ и /weather/{city}.

Думаю, ответ должен быть такой. Префикс /weather/ должен интерпретироваться как /weather/.+$ и является более общим случаем /weather/[^/]+/?$. Поэтому вариант /weather/[^/]+/?$ должен проверяться в первую очередь.

from restrserve.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.