Comments (9)
#34 should fix it.
Now merged to dev
.
from restrserve.
При добавлении роута чекаем наличие переменных в пути. Если переменные есть, ставим отметку о том, что передан шаблон пути с переменными и разбираем эти переменные.
Пример кода для извлечения переменных:
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.
Нашёл реализацию похожего функционала в пакете routr
: https://github.com/thomasp85/routr/blob/master/R/route.R#L273
from restrserve.
Plumber related code: https://github.com/trestletech/plumber/blob/master/R/query-string.R
from restrserve.
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.
Предложенный выше объект R6 предлагается использовать в add_route
. При этом организацию обработчиков предлагаю изменить следующим образом:
- вместо схемы:
handlers$path[[method]]
использоватьhandlers[[method]]$path
, что должно сократить область поиска. - При добавлении новых точек досутпа в
handlers[[method]]
сначала добавлять точки с методомexact
, а в самый конец с методовмregex
.partial
между ними.
from restrserve.
Если будет просадка по производительности, то для точного соответствия можно исопльзовать fastmatch
(нет зависимостей), а для regex
ore
(нет зависимостей. бенч) или stringi
.
from restrserve.
Думается надо запилить отдельный 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.
Могут ли совпадать префиксы путей для partial и regex или при добавлении бросаем ошибку? Например:
/weather/
и/weather/{city}
.
Думаю, ответ должен быть такой. Префикс /weather/
должен интерпретироваться как /weather/.+$
и является более общим случаем /weather/[^/]+/?$
. Поэтому вариант /weather/[^/]+/?$
должен проверяться в первую очередь.
from restrserve.
Related Issues (20)
- Configuration settings? HOT 1
- add response header Date HOT 1
- How to specify the amount of servers in parallell HOT 1
- Preferred way to use RestRserve from client R process HOT 8
- Static Route fails to return csv, rds, jpg, pdf (png and txt works) for folder HOT 5
- [BUG] POST request with content-type "application/x-www-form-urlencoded" failed HOT 1
- Question: content type zip / binary -> application/zip, application/octet-stream HOT 1
- Automated docker hub builds don't work anymore HOT 2
- Header Content is split on Comma HOT 7
- Example available with post request with json in, json out? HOT 2
- cannot use source or eval in Rserve.conf or in backend$start as additional args HOT 5
- [BUG] segfault when running umap in RestRserve endpoint HOT 4
- MacOS: "+[NSNumber initialize] may have been in progress in another thread when fork() was called." HOT 3
- serving static files HOT 5
- [BUG] slow to serve static file and swagger UI must use CDN
- [BUG] Rserve version wrong in description file
- Missing CORS response headers to some browsers' pre-flight checks? HOT 2
- Error when transfer is cancelled, leading to tempdir deletion HOT 7
- [BUG] "discarding buffer because too big" in ssl example HOT 2
- [BUG] to_json different form toJSON in jsonlite
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from restrserve.