From 1fb9a522692a4e0224792217626a3c8db9a81c11 Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 2 Nov 2022 14:17:19 +0800 Subject: [PATCH 1/6] updated to HTTP 1.51; duplicated 0.9.17's RequestHandlerFunction in HttpHelpers/handlers.jl --- Project.toml | 3 +- src/HttpHelpers/HttpHelpers.jl | 3 +- src/HttpHelpers/handlers.jl | 58 +++++++++++++++++++++++----------- src/HttpHelpers/router.jl | 2 +- src/handler/make_handler.jl | 2 +- test/callbacks.jl | 30 +++++++++--------- test/config_functional.jl | 26 +++++++-------- test/core.jl | 20 ++++++------ test/dash_creation.jl | 2 +- test/env.jl | 1 + test/handlers.jl | 46 +++++++++++++-------------- test/reload_hash.jl | 2 +- 12 files changed, 107 insertions(+), 88 deletions(-) diff --git a/Project.toml b/Project.toml index a678f81..6e005f8 100644 --- a/Project.toml +++ b/Project.toml @@ -30,14 +30,13 @@ DashCoreComponents = "2.0.0" DashHtmlComponents = "2.0.0" DashTable = "5.0.0" DataStructures = "0.17, 0.18" -HTTP = "0.8.10, 0.9" JSON = "0.21" JSON3 = "1.9" MD5 = "0.2" PlotlyBase = "0.8.5, 0.8.6" +Requires = "1.3" YAML = "0.4.7" julia = "1.3" -Requires = "1.3" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/src/HttpHelpers/HttpHelpers.jl b/src/HttpHelpers/HttpHelpers.jl index 036609f..4d8ab31 100644 --- a/src/HttpHelpers/HttpHelpers.jl +++ b/src/HttpHelpers/HttpHelpers.jl @@ -1,9 +1,8 @@ module HttpHelpers -export state_handler, exception_handling_handler, compress_handler, Route, Router, add_route! +export state_handler, exception_handling_handler, compress_handler, Route, Router, add_route!, handle import HTTP, CodecZlib - include("handlers.jl") include("router.jl") diff --git a/src/HttpHelpers/handlers.jl b/src/HttpHelpers/handlers.jl index 2a0d0eb..e7c3342 100644 --- a/src/HttpHelpers/handlers.jl +++ b/src/HttpHelpers/handlers.jl @@ -1,17 +1,37 @@ +struct RequestHandlerFunction <: HTTP.Handler + func::Function # func(req) +end + +function handle(h::RequestHandlerFunction, request::HTTP.Request, args...) + h.func(request, args...) +end + +function handle(handler::Function, request::HTTP.Request, args...) + handler(request, args) +end + +function handle(h::RequestHandlerFunction, request::HTTP.Request, state, args...) + h.func(request, state, args...) +end + +function handle(handler::Function, request::HTTP.Request, state, args...) + handler(request, state, args) +end + function state_handler(base_handler, state) - return HTTP.RequestHandlerFunction( - function(request::HTTP.Request, args...) - response = HTTP.handle(base_handler, request, state, args...) - if response.status == 200 - HTTP.defaultheader!(response, "Content-Type" => HTTP.sniff(response.body)) - HTTP.defaultheader!(response, "Content-Length" => string(sizeof(response.body))) - end - return response - end - ) + return RequestHandlerFunction( + function(request::HTTP.Request, args...) + response = handle(base_handler, request, state, args...) + if response.status == 200 + HTTP.defaultheader!(response, "Content-Type" => HTTP.sniff(response.body)) + HTTP.defaultheader!(response, "Content-Length" => string(sizeof(response.body))) + end + return response + end + ) end -state_handler(base_handler::Function, state) = state_handler(HTTP.RequestHandlerFunction(base_handler), state) +state_handler(base_handler::Function, state) = state_handler(RequestHandlerFunction(base_handler), state) function check_mime(message::HTTP.Message, mime_list) !HTTP.hasheader(message, "Content-Type") && return false @@ -22,9 +42,9 @@ end const default_compress_mimes = ["text/plain", "text/html", "text/css", "text/xml", "application/json", "application/javascript", "application/css"] function compress_handler(base_handler; mime_types::Vector{String} = default_compress_mimes, compress_min_size = 500) - return HTTP.RequestHandlerFunction( + return RequestHandlerFunction( function(request::HTTP.Request, args...) - response = HTTP.handle(base_handler, request, args...) + response = handle(base_handler, request, args...) if response.status == 200 && sizeof(response.body) >= compress_min_size && occursin("gzip", HTTP.header(request, "Accept-Encoding", "")) && check_mime(response, mime_types) HTTP.setheader(response, "Content-Encoding" => "gzip") @@ -38,14 +58,14 @@ function compress_handler(base_handler; mime_types::Vector{String} = default_com end function compress_handler(base_handler::Function; mime_types::Vector{String} = default_compress_mimes, compress_min_size = 500) - return compress_handler(HTTP.RequestHandlerFunction(base_handler), mime_types = mime_types, compress_min_size = compress_min_size) + return compress_handler(RequestHandlerFunction(base_handler), mime_types = mime_types, compress_min_size = compress_min_size) end function exception_handling_handler(ex_handling_func, base_handler) - return HTTP.RequestHandlerFunction( + return RequestHandlerFunction( function(request::HTTP.Request, args...) try - return HTTP.handle(base_handler, request, args...) + return handle(base_handler, request, args...) catch e return ex_handling_func(e) end @@ -55,12 +75,12 @@ function exception_handling_handler(ex_handling_func, base_handler) end exception_handling_handler(ex_handling_func, base_handler::Function) = - exception_handling_handler(ex_handling_func, HTTP.RequestHandlerFunction(base_handler)) + exception_handling_handler(ex_handling_func, RequestHandlerFunction(base_handler)) function request_logging_handler(base_handler; exclude = Regex[]) - return HTTP.RequestHandlerFunction( + return RequestHandlerFunction( function(request::HTTP.Request, args...) - response = HTTP.handle(base_handler, request, args...) + response = handle(base_handler, request, args...) return response end diff --git a/src/HttpHelpers/router.jl b/src/HttpHelpers/router.jl index d897bf8..0dda06e 100644 --- a/src/HttpHelpers/router.jl +++ b/src/HttpHelpers/router.jl @@ -124,7 +124,7 @@ end add_route!(handler::Function, router::Router, method, url) = add_route!(router, Route(handler, method, url)) add_route!(handler::Function, router::Router, url) = add_route!(handler, router, nothing, url) -function HTTP.handle(router::Router, request::HTTP.Request, args...) +function handle(router::Router, request::HTTP.Request, args...) path = HTTP.URI(request.target).path return handle(router.routes, path, request, args...) end diff --git a/src/handler/make_handler.jl b/src/handler/make_handler.jl index fbd87ec..14933a1 100644 --- a/src/handler/make_handler.jl +++ b/src/handler/make_handler.jl @@ -147,7 +147,7 @@ function make_handler(app::DashApp, registry::ResourcesRegistry; check_layout = compile_request = HTTP.Request("GET", prefix) HTTP.setheader(compile_request, "Accept-Encoding" => "gzip") - HTTP.handle(handler, compile_request) #For handler precompilation + handle(handler, compile_request) #For handler precompilation get_devsetting(app, :hot_reload) && start_reload_poll(state) diff --git a/test/callbacks.jl b/test/callbacks.jl index 21daeb9..2b8f6bd 100644 --- a/test/callbacks.jl +++ b/test/callbacks.jl @@ -21,7 +21,7 @@ using Dash handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test deps[1].prevent_initial_call == false @test deps[2].prevent_initial_call == false @@ -43,7 +43,7 @@ using Dash handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test deps[1].prevent_initial_call == true @test deps[2].prevent_initial_call == false @@ -65,7 +65,7 @@ using Dash handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test deps[1].prevent_initial_call == true @test deps[2].prevent_initial_call == true @@ -87,7 +87,7 @@ using Dash handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test deps[1].prevent_initial_call == true @test deps[2].prevent_initial_call == false @@ -110,7 +110,7 @@ end handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test length(deps) == 1 @@ -124,7 +124,7 @@ end handler = Dash.make_handler(app) test_json = """{"output":"my-div.children","changedPropIds":["my-id.value"],"inputs":[{"id":"my-id","property":"value","value":"test"}]}""" request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 resp_obj = JSON3.read(String(response.body)) @test in(:multi, keys(resp_obj)) @@ -149,7 +149,7 @@ end handler = Dash.make_handler(app) test_json = """{"output":"..my-div.children...my-div2.children..","changedPropIds":["my-id.value"],"inputs":[{"id":"my-id","property":"value","value":"test"}], "state":[{"id":"my-id","property":"type","value":"state"}]}""" request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 resp_obj = JSON3.read(String(response.body)) @test in(:multi, keys(resp_obj)) @@ -172,7 +172,7 @@ end handler = Dash.make_handler(app) test_json = """{"output":"..my-div.children..","changedPropIds":["my-id.value"],"inputs":[{"id":"my-id","property":"value","value":"test"}], "state":[{"id":"my-id","property":"type","value":"state"}]}""" request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 resp_obj = JSON3.read(String(response.body)) @test in(:multi, keys(resp_obj)) @@ -350,7 +350,7 @@ end ) test_json = JSON3.write(request) request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 @@ -389,7 +389,7 @@ end ) test_json = JSON3.write(request) request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 resp_obj = JSON3.read(String(response.body)) @@ -441,7 +441,7 @@ end ) test_json = JSON3.write(request) request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 s = String(response.body) resp_obj = JSON3.read(s) @@ -494,7 +494,7 @@ end ) test_json = JSON3.write(request) request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 resp_obj = JSON3.read(String(response.body)) @test in(:multi, keys(resp_obj)) @@ -597,7 +597,7 @@ end handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test length(deps) == 1 @@ -640,7 +640,7 @@ end handler = make_handler(app) request = HTTP.Request("GET", "/_dash-dependencies") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) deps = JSON3.read(String(resp.body)) @test length(deps) == 1 @@ -652,7 +652,7 @@ end @test cb.clientside_function.namespace == "_dashprivate_my-div" @test cb.clientside_function.function_name == "children" request = HTTP.Request("GET", "/") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) body = String(resp.body) @test occursin("clientside[\"_dashprivate_my-div\"]", body) @test occursin("ns[\"children\"]", body) diff --git a/test/config_functional.jl b/test/config_functional.jl index ea754fc..a98eb70 100644 --- a/test/config_functional.jl +++ b/test/config_functional.jl @@ -81,55 +81,55 @@ end app.layout = html_div() handler = make_handler(app) request = HTTP.Request("GET", "/assets/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 200 request = HTTP.Request("GET", "/assets/test3.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 404 request = HTTP.Request("GET", "/images/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test startswith(HTTP.header(res, "Content-Type"), "text/html") app = dash(url_base_pathname = "/test/") app.layout = html_div() handler = make_handler(app) request = HTTP.Request("GET", "/assets/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 404 request = HTTP.Request("GET", "/test/assets/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 200 request = HTTP.Request("GET", "/images/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 404 app = dash(assets_url_path = "ass") app.layout = html_div() handler = make_handler(app) request = HTTP.Request("GET", "/ass/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 200 request = HTTP.Request("GET", "/ass/test3.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 404 request = HTTP.Request("GET", "/assets/test3.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test startswith(HTTP.header(res, "Content-Type"), "text/html") request = HTTP.Request("GET", "/images/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test startswith(HTTP.header(res, "Content-Type"), "text/html") app = dash(assets_folder = "images") app.layout = html_div() handler = make_handler(app) request = HTTP.Request("GET", "/assets/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 404 request = HTTP.Request("GET", "/assets/test_images.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test res.status == 200 request = HTTP.Request("GET", "/images/test.png") - res = HTTP.handle(handler, request) + res = Dash.HttpHelpers.handle(handler, request) @test startswith(HTTP.header(res, "Content-Type"), "text/html") end diff --git a/test/core.jl b/test/core.jl index 00d4689..25c942e 100644 --- a/test/core.jl +++ b/test/core.jl @@ -47,18 +47,18 @@ end handler = Dash.make_handler(app) request = HTTP.Request("GET", "/") - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) request = HTTP.Request("GET", "/_dash-layout") - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) @test body_str == JSON3.write(app.layout) request = HTTP.Request("GET", "/_dash-dependencies") - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) resp_json = JSON3.read(body_str) @@ -76,7 +76,7 @@ end test_json = """{"output":"my-div.children","changedPropIds":["my-id.value"],"inputs":[{"id":"my-id","property":"value","value":"initial value3333"}]}""" request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) @@ -97,14 +97,14 @@ end handler = Dash.make_handler(app) request = HTTP.Request("GET", "/_dash-layout") - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) @test body_str == JSON3.write(layout_func()) @test occursin("my_div2", body_str) global_id = "my_div3" - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) @test body_str == JSON3.write(layout_func()) @@ -120,12 +120,12 @@ end @test Dash.get_assets_path(app) == joinpath(pwd(),"assets") handler = Dash.make_handler(app) request = HTTP.Request("GET", "/assets/test.png") - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 body_str = String(response.body) request = HTTP.Request("GET", "/assets/wrong.png") - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 404 body_str = String(response.body) @@ -147,7 +147,7 @@ end test_json = """{"output":"my-div.children","changedPropIds":["my-id.children"],"inputs":[{"id":"my-id","property":"children","value":10}]}""" request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 204 @test length(response.body) == 0 @@ -165,7 +165,7 @@ end test_json = """{"output":"..my-div.children...my-div2.children..","changedPropIds":["my-id.children"],"inputs":[{"id":"my-id","property":"children","value":10}]}""" request = HTTP.Request("POST", "/_dash-update-component", [], Vector{UInt8}(test_json)) - response = HTTP.handle(handler, request) + response = Dash.HttpHelpers.handle(handler, request) @test response.status == 200 result = JSON3.read(String(response.body)) diff --git a/test/dash_creation.jl b/test/dash_creation.jl index fa74c91..f9cd985 100644 --- a/test/dash_creation.jl +++ b/test/dash_creation.jl @@ -19,7 +19,7 @@ using Dash @test isempty(app.config.meta_tags) @test app.index_string == Dash.default_index - @test app.config.assets_external_path == nothing + @test app.config.assets_external_path === nothing @test app.config.include_assets_files == true @test app.config.show_undo_redo == false diff --git a/test/env.jl b/test/env.jl index ddf26f7..ba658a2 100644 --- a/test/env.jl +++ b/test/env.jl @@ -52,6 +52,7 @@ end @test dash_env("host") == "localhost" @test isnothing(dash_env("host", prefix = "")) + delete!(ENV, "PORT") @test dash_env(Int64, "port", 8050, prefix = "") == 8050 ENV["PORT"] = "2001" @test isnothing(dash_env(Int64, "port")) diff --git a/test/handlers.jl b/test/handlers.jl index 2af0b7a..31f0267 100644 --- a/test/handlers.jl +++ b/test/handlers.jl @@ -113,52 +113,52 @@ end add_route!((req;var1, var2) -> HTTP.Response(200, "var1=$var1,var2=$var2"), router, "/var///") - res = HTTP.handle(router, HTTP.Request("GET","")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","")) @test res.status == 200 @test String(res.body) == "index" - res = HTTP.handle(router, HTTP.Request("GET","/")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","/")) @test res.status == 200 @test String(res.body) == "index" - res = HTTP.handle(router, HTTP.Request("GET","/test_post")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","/test_post")) @test res.status == 404 - res = HTTP.handle(router, HTTP.Request("POST","/test_post")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/test_post")) @test res.status == 200 @test String(res.body) == "test_post" - res = HTTP.handle(router, HTTP.Request("POST","/var/")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/")) @test res.status == 404 - res = HTTP.handle(router, HTTP.Request("POST","/var/ass")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/ass")) @test res.status == 200 @test String(res.body) == "var1=ass" - res = HTTP.handle(router, HTTP.Request("POST","/var/ass/")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/ass/")) @test res.status == 200 @test String(res.body) == "var1=ass" - res = HTTP.handle(router, HTTP.Request("POST","/var/ass/fff")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/ass/fff")) @test res.status == 200 @test String(res.body) == "var1=ass,var2=fff" - res = HTTP.handle(router, HTTP.Request("POST","/var/ass/fff/")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/ass/fff/")) @test res.status == 200 @test String(res.body) == "var1=ass,var2=fff" - res = HTTP.handle(router, HTTP.Request("POST","/var/ass/fff/dd")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/ass/fff/dd")) @test res.status == 404 add_route!((req, param;var1) -> HTTP.Response(200, "$param, var1=$var1"), router, "POST", "/") - res = HTTP.handle(router, HTTP.Request("POST","/test_post")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/test_post")) @test res.status == 200 @test String(res.body) == "test_post" - res = HTTP.handle(router, HTTP.Request("POST","/test"), "aaa") + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/test"), "aaa") @test res.status == 200 @test String(res.body) == "aaa, var1=test" - res = HTTP.handle(router, HTTP.Request("POST","/test/renderer/r.js"), "aaa") + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/test/renderer/r.js"), "aaa") @test res.status == 200 @test String(res.body) == "aaa, var1=test/renderer/r.js" @@ -175,7 +175,7 @@ end state = TestState(true) test_handler = state_handler(base_handler, state) test_request = HTTP.Request("GET", "/test_path") - res = HTTP.handle(test_handler, test_request) + res = Dash.HttpHelpers.handle(test_handler, test_request) @test res.status == 200 @test String(res.body) == "test1" @test startswith(HTTP.header(res, "Content-Type", ""), "text/plain") @@ -191,7 +191,7 @@ end state = TestState(true) test_handler = state_handler(base_handler_http, state) test_request = HTTP.Request("GET", "/test_path2") - res = HTTP.handle(test_handler, test_request) + res = Dash.HttpHelpers.handle(test_handler, test_request) @test res.status == 200 @test String(res.body) == "" @test startswith(HTTP.header(res, "Content-Type", ""), "text/html") @@ -206,7 +206,7 @@ end test_handler = state_handler(base_handler_js, state) test_request = HTTP.Request("GET", "/test_path3") - res = HTTP.handle(test_handler, test_request) + res = Dash.HttpHelpers.handle(test_handler, test_request) @test res.status == 200 @test String(res.body) == "" @test startswith(HTTP.header(res, "Content-Type", ""), "text/javascript") @@ -225,7 +225,7 @@ end handler = compress_handler(state_handler(base_handler, state)) test_request = HTTP.Request("GET", "/test_path") HTTP.setheader(test_request, "Accept-Encoding" => "gzip") - res = HTTP.handle(handler, test_request) + res = Dash.HttpHelpers.handle(handler, test_request) @test res.status == 200 @test String(res.body) == "test1" @test !HTTP.hasheader(res, "Content-Encoding") @@ -240,7 +240,7 @@ end test_request = HTTP.Request("GET", "/test_big") HTTP.setheader(test_request, "Accept-Encoding" => "gzip") handler = compress_handler(state_handler(base_handler, state)) - res = HTTP.handle(handler, test_request) + res = Dash.HttpHelpers.handle(handler, test_request) @test res.status == 200 @test HTTP.header(res, "Content-Encoding") == "gzip" @test HTTP.header(res, "Content-Length") == string(sizeof(res.body)) @@ -284,7 +284,7 @@ end test_app = dash() handler = make_handler(test_app, test_registry) request = HTTP.Request("GET", "/_dash-component-suites/dash_renderer/dash-renderer/dash_renderer.js") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) @test resp.status == 200 @test String(resp.body) == "var a = [1,2,3,4,5,6]" @test HTTP.hasheader(resp, "ETag") @@ -293,11 +293,11 @@ end etag = HTTP.header(resp, "ETag") HTTP.setheader(request, "If-None-Match"=>etag) - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) @test resp.status == 304 request = HTTP.Request("GET", "/_dash-component-suites/dash_renderer/props.min.js") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) HTTP.setheader(request, "If-None-Match"=>bytes2hex(md5("var a = [1,2,3,4,5,6]"))) @test resp.status == 200 @test String(resp.body) == "var string = \"fffffff\"" @@ -305,12 +305,12 @@ end @test HTTP.header(resp, "ETag") == bytes2hex(md5("var string = \"fffffff\"")) etag = HTTP.header(resp, "ETag") HTTP.setheader(request, "If-None-Match"=>etag) - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) @test resp.status == 304 request = HTTP.Request("GET", "/_dash-component-suites/dash_renderer/props.v1_2_3m2333123.min.js") - resp = HTTP.handle(handler, request) + resp = Dash.HttpHelpers.handle(handler, request) HTTP.setheader(request, "If-None-Match"=>bytes2hex(md5("var a = [1,2,3,4,5,6]"))) @test resp.status == 200 @test String(resp.body) == "var string = \"fffffff\"" diff --git a/test/reload_hash.jl b/test/reload_hash.jl index d85e5a8..5c5e323 100644 --- a/test/reload_hash.jl +++ b/test/reload_hash.jl @@ -30,7 +30,7 @@ end handler = make_handler(app) write("assets/test2.css", "") sleep(2) - response = HTTP.handle(handler, HTTP.Request("GET", "/_reload-hash")) + response = Dash.HttpHelpers.handle(handler, HTTP.Request("GET", "/_reload-hash")) data = JSON3.read(response.body) @test length(data.files) == 1 @test data.files[1].url == "/assets/test2.css" From ddd73562f7513862805e86c58e1aecff370fab45 Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 2 Nov 2022 15:21:57 +0800 Subject: [PATCH 2/6] updates HTTP version --- Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Project.toml b/Project.toml index 6e005f8..0f703d2 100644 --- a/Project.toml +++ b/Project.toml @@ -30,6 +30,7 @@ DashCoreComponents = "2.0.0" DashHtmlComponents = "2.0.0" DashTable = "5.0.0" DataStructures = "0.17, 0.18" +HTTP = "1" JSON = "0.21" JSON3 = "1.9" MD5 = "0.2" From 325ea9a7be724d65fa39ac987a5837a98e98458d Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 2 Nov 2022 15:26:47 +0800 Subject: [PATCH 3/6] HTTP 1 needs Julia 1.6 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 0f703d2..3d0a263 100644 --- a/Project.toml +++ b/Project.toml @@ -37,7 +37,7 @@ MD5 = "0.2" PlotlyBase = "0.8.5, 0.8.6" Requires = "1.3" YAML = "0.4.7" -julia = "1.3" +julia = "1.6" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" From f81c65d1eb214809d596544a13235c8637d532ed Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Mon, 21 Nov 2022 02:24:41 +0800 Subject: [PATCH 4/6] update julia version used by CI --- CompatHelper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CompatHelper.yml b/CompatHelper.yml index 46670d7..bfb073a 100644 --- a/CompatHelper.yml +++ b/CompatHelper.yml @@ -11,7 +11,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - julia-version: [1.5.0] + julia-version: [1.6.7] julia-arch: [x86] os: [ubuntu-latest] steps: From 9866cf4522d808330928479685929628aec94a13 Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 25 Jan 2023 17:53:33 +0800 Subject: [PATCH 5/6] made RequestHandlerFunction callable and added tests for it --- Project.toml | 2 +- src/HttpHelpers/handlers.jl | 5 +++-- test/handlers.jl | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Project.toml b/Project.toml index 3d0a263..85ec336 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Dash" uuid = "1b08a953-4be3-4667-9a23-3db579824955" authors = ["Chris Parmer ", "Alexandr Romanenko "] -version = "1.1.2" +version = "1.1.3" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" diff --git a/src/HttpHelpers/handlers.jl b/src/HttpHelpers/handlers.jl index e7c3342..01500e9 100644 --- a/src/HttpHelpers/handlers.jl +++ b/src/HttpHelpers/handlers.jl @@ -1,9 +1,10 @@ struct RequestHandlerFunction <: HTTP.Handler func::Function # func(req) end +(x::RequestHandlerFunction)(args...) = x.func(args...) function handle(h::RequestHandlerFunction, request::HTTP.Request, args...) - h.func(request, args...) + h(request, args...) end function handle(handler::Function, request::HTTP.Request, args...) @@ -11,7 +12,7 @@ function handle(handler::Function, request::HTTP.Request, args...) end function handle(h::RequestHandlerFunction, request::HTTP.Request, state, args...) - h.func(request, state, args...) + h(request, state, args...) end function handle(handler::Function, request::HTTP.Request, state, args...) diff --git a/test/handlers.jl b/test/handlers.jl index 31f0267..1d461b9 100644 --- a/test/handlers.jl +++ b/test/handlers.jl @@ -165,6 +165,15 @@ end end @testset "base_handler" begin + function structsequal(a::T, b::T)::Bool where T + for name in propertynames(a) + if getfield(a, name) != getfield(b, name) + return false + end + end + return true + end + base_handler = function(request, state) @test request.target == "/test_path" @test state isa TestState @@ -176,6 +185,7 @@ end test_handler = state_handler(base_handler, state) test_request = HTTP.Request("GET", "/test_path") res = Dash.HttpHelpers.handle(test_handler, test_request) + @test structsequal(res, test_handler(test_request)) #RequestHandlerFunction must be directly callable since HTTP.jl will use it @test res.status == 200 @test String(res.body) == "test1" @test startswith(HTTP.header(res, "Content-Type", ""), "text/plain") @@ -192,7 +202,8 @@ end test_handler = state_handler(base_handler_http, state) test_request = HTTP.Request("GET", "/test_path2") res = Dash.HttpHelpers.handle(test_handler, test_request) - @test res.status == 200 + @test structsequal(res, test_handler(test_request)) + @test res.status == 200 @test String(res.body) == "" @test startswith(HTTP.header(res, "Content-Type", ""), "text/html") @test parse(Int, HTTP.header(res, "Content-Length", "0")) == sizeof("") @@ -207,7 +218,8 @@ end test_handler = state_handler(base_handler_js, state) test_request = HTTP.Request("GET", "/test_path3") res = Dash.HttpHelpers.handle(test_handler, test_request) - @test res.status == 200 + @test structsequal(res, test_handler(test_request)) + @test res.status == 200 @test String(res.body) == "" @test startswith(HTTP.header(res, "Content-Type", ""), "text/javascript") @test parse(Int, HTTP.header(res, "Content-Length", "0")) == sizeof("") From 30147b652930c3783a0aaf7e03a704505866eef4 Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Sat, 28 Jan 2023 14:55:34 +0800 Subject: [PATCH 6/6] reduce verbosity of HTTP server logging --- src/server.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.jl b/src/server.jl index 485fbaa..9350dda 100644 --- a/src/server.jl +++ b/src/server.jl @@ -52,7 +52,7 @@ function run_server(app::DashApp, start_server = () -> begin handler = make_handler(app); server = Sockets.listen(get_inetaddr(host, port)) - task = @async HTTP.serve(handler, host, port; server = server, verbose = true) + task = @async HTTP.serve(handler, host, port; server = server, verbose = debug==true) return (server, task) end