From 25542832dfad2fa95e9e3a9cea637891de8d8278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herling?= Date: Tue, 27 May 2025 10:20:45 +0200 Subject: [PATCH 1/3] Added method override --- .../config/initializers/method_override.jl | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 files/new_app/config/initializers/method_override.jl diff --git a/files/new_app/config/initializers/method_override.jl b/files/new_app/config/initializers/method_override.jl new file mode 100644 index 000000000..3596a2a94 --- /dev/null +++ b/files/new_app/config/initializers/method_override.jl @@ -0,0 +1,76 @@ +using Genie, HTTP + +""" + method_override(req::HTTP.Request, res::HTTP.Response, + params::Dict{Symbol,Any}) + +Install a pre-match hook that rewrites POSTs carrying a hidden `_method` field +into real PUT/PATCH/DELETE requests. + +Place this code in, for example, `config/initializers/method_override.jl`: + +# Example + +```jldoctest +julia> using Genie, HTTP + +julia> function method_override(req::HTTP.Request, res::HTTP.Response, + params::Dict{Symbol,Any}) + if req.method == "POST" + post = get(params, Genie.Router.PARAMS_POST_KEY, Dict{Symbol,Any}()) + if haskey(post, :_method) + m = uppercase(string(post[:_method])) + if m in ("PUT","PATCH","DELETE") + @info "Overriding method POST → $m" + req.method = m + end + end + end + return req, res, params +end + +julia> push!(Genie.Router.pre_match_hooks, method_override) + +julia> route("/foo", named = :test_get_override) do + "Hello from GET" +end + +julia> route("/foo", method = POST, named = :test_post_override) do + "Hello from POST" +end + +julia> route("/foo", method = PUT, named = :test_put_override) do + "Hello from PUT" +end + +julia> up(port=8000) + +julia> HTTP.request("GET", "http://127.0.0.1:8000/foo") + +julia> HTTP.request("POST", "http://127.0.0.1:8000/foo") + +julia> HTTP.request("PUT", "http://127.0.0.1:8000/foo") + +julia> Router.delete!(:test_get_override) + +julia> Router.delete!(:test_post_override) + +julia> Router.delete!(:test_put_override) +```` +""" +function method_override(req::HTTP.Request, res::HTTP.Response, + params::Dict{Symbol,Any}) + if req.method == "POST" + post = get(params, Genie.Router.PARAMS_POST_KEY, Dict{Symbol,Any}()) + if haskey(post, :_method) + m = uppercase(string(post[:_method])) + if m in ("PUT","PATCH","DELETE") + @info "Overriding method POST → $m" + req.method = m + end + end + end + return req, res, params +end + +push!(Genie.Router.pre_match_hooks, method_override) From 75159f603751f5e814349853aaa6be1b04775d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herling?= Date: Tue, 27 May 2025 10:28:15 +0200 Subject: [PATCH 2/3] Added method override (import) --- files/new_app/config/initializers/method_override.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/new_app/config/initializers/method_override.jl b/files/new_app/config/initializers/method_override.jl index 3596a2a94..81cb0c6fe 100644 --- a/files/new_app/config/initializers/method_override.jl +++ b/files/new_app/config/initializers/method_override.jl @@ -1,4 +1,4 @@ -using Genie, HTTP +import Genie, HTTP """ method_override(req::HTTP.Request, res::HTTP.Response, From 6e6c6464b09b05cc0038e35758e798b9cd63a9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Herling?= Date: Tue, 27 May 2025 12:01:27 +0200 Subject: [PATCH 3/3] Deleted @info --- files/new_app/config/initializers/method_override.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/files/new_app/config/initializers/method_override.jl b/files/new_app/config/initializers/method_override.jl index 81cb0c6fe..e39625b69 100644 --- a/files/new_app/config/initializers/method_override.jl +++ b/files/new_app/config/initializers/method_override.jl @@ -21,7 +21,6 @@ julia> function method_override(req::HTTP.Request, res::HTTP.Response, if haskey(post, :_method) m = uppercase(string(post[:_method])) if m in ("PUT","PATCH","DELETE") - @info "Overriding method POST → $m" req.method = m end end @@ -65,7 +64,6 @@ function method_override(req::HTTP.Request, res::HTTP.Response, if haskey(post, :_method) m = uppercase(string(post[:_method])) if m in ("PUT","PATCH","DELETE") - @info "Overriding method POST → $m" req.method = m end end