From: Michael Raitza Date: Tue, 16 Jan 2024 17:16:02 +0000 (+0100) Subject: http.server: Implement DELETE, PATCH; handle unknown methods X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=e06b962f4c559c761e79162e90568bdaee322554 http.server: Implement DELETE, PATCH; handle unknown methods Handle DELETE and PATCH. Be lenient and hand URL query parameters to the user with a DELETE. There is debate about whether DELETE should handle query parameters. Additionally, some implementations even reject DELETE requests with a body. So, leave all these additional "protections" for a later implementation (e.g. in furnace). Treat unknown methods like requests without parameters. --- diff --git a/basis/http/server/server-docs.factor b/basis/http/server/server-docs.factor index a3a24c462f..9b8d4d7bbb 100644 --- a/basis/http/server/server-docs.factor +++ b/basis/http/server/server-docs.factor @@ -34,7 +34,11 @@ HELP: main-responder HELP: post-request? { $values { "?" boolean } } -{ $description "Outputs if the current request is a POST request.s" } ; +{ $description "Outputs if the current request is a POST request." } ; + +HELP: method= +{ $values { "str" "a string" } { "?" boolean } } +{ $description "Outputs if the current request matches the expected method." } ; HELP: responder-nesting { $description "A sequence of " { $snippet "{ path responder }" } " pairs." } ; diff --git a/basis/http/server/server.factor b/basis/http/server/server.factor index 2d5b333714..2083667940 100644 --- a/basis/http/server/server.factor +++ b/basis/http/server/server.factor @@ -70,7 +70,9 @@ M: raw-response write-response M: raw-response write-full-response nip write-response ; -: post-request? ( -- ? ) request get method>> "POST" = ; +: method= ( str -- ? ) request get method>> = ; + +: post-request? ( -- ? ) "POST" method= ; SYMBOL: responder-nesting @@ -142,8 +144,11 @@ LOG: httpd-header NOTICE { "GET" [ url>> query>> ] } { "HEAD" [ url>> query>> ] } { "OPTIONS" [ url>> query>> ] } + { "DELETE" [ url>> query>> ] } { "POST" [ post-data>> params>> ] } + { "PATCH" [ post-data>> params>> ] } { "PUT" [ post-data>> params>> ] } + [ 2drop H{ } clone ] } case ; SYMBOL: params