From 03e57e02877627c363595acf10e6887252b4e5e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 28 Nov 2022 17:21:32 -0500 Subject: [PATCH 01/17] add `jl_test` workflow to run the Julia `] test` on multiple Julia versions. --- .github/workflows/jl_test.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/jl_test.yml diff --git a/.github/workflows/jl_test.yml b/.github/workflows/jl_test.yml new file mode 100644 index 0000000..b17f260 --- /dev/null +++ b/.github/workflows/jl_test.yml @@ -0,0 +1,20 @@ +name: Run Julia tests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + jl_version: ["1.3", "1.6", "1.8"] + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.jl_version }} + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + with: + annotate: true From c2d4aca257730536b4e86ff0dc142fe1e09195b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 28 Nov 2022 18:07:18 -0500 Subject: [PATCH 02/17] bump lowest julia version tested to 1.4 to match PlotlyBase compat --- .github/workflows/jl_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jl_test.yml b/.github/workflows/jl_test.yml index b17f260..2e7823c 100644 --- a/.github/workflows/jl_test.yml +++ b/.github/workflows/jl_test.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - jl_version: ["1.3", "1.6", "1.8"] + jl_version: ["1.4", "1.6", "1.8"] steps: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@v1 From 6e316347ba78530bdf81bea45b3767c369d156d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Fri, 27 Jan 2023 13:54:28 -0500 Subject: [PATCH 03/17] disable CircleCI tests unti #177 is addressed --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0b8f832..8ccac48 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,3 +57,4 @@ workflows: build: jobs: - "test" + when: false # disable this workflow until Percy tests are functional again From 5c908f41f7e2dfbbf1322944a7d08ff00e552cea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Fri, 27 Jan 2023 14:14:18 -0500 Subject: [PATCH 04/17] add badge for `jl_test` workflow --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 66cb538..c867e5c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Dash for Julia +[![Juila tests](https://github.com/plotly/Dash.jl/actions/workflows/jl_test.yml/badge.svg)](https://github.com/plotly/Dash.jl/actions/workflows/jl_test.yml) [![CircleCI](https://circleci.com/gh/plotly/Dash.jl/tree/master.svg?style=svg)](https://circleci.com/gh/plotly/Dash.jl/tree/master) [![GitHub](https://img.shields.io/github/license/plotly/dashR.svg?color=dark-green)](https://github.com/plotly/Dash.jl/blob/master/LICENSE) [![GitHub commit activity](https://img.shields.io/github/commit-activity/y/plotly/Dash.jl.svg?color=dark-green)](https://github.com/plotly/Dash.jl/graphs/contributors) From f744c706f8b6c4bb101a7f02860d56f25f28677d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Fri, 27 Jan 2023 14:15:29 -0500 Subject: [PATCH 05/17] bump julia compat to `"1.4"` to match the compat of `PlotlyBase.jl` (one of our deps) --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index a678f81..af4388a 100644 --- a/Project.toml +++ b/Project.toml @@ -36,8 +36,8 @@ JSON3 = "1.9" MD5 = "0.2" PlotlyBase = "0.8.5, 0.8.6" YAML = "0.4.7" -julia = "1.3" Requires = "1.3" +julia = "1.4" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" From 45d291186811dd9d23c7f557238e8967104bfc2a Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 2 Nov 2022 14:17:19 +0800 Subject: [PATCH 06/17] 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 af4388a..eaab537 100644 --- a/Project.toml +++ b/Project.toml @@ -30,13 +30,12 @@ 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" -YAML = "0.4.7" Requires = "1.3" +YAML = "0.4.7" julia = "1.4" [extras] 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 2dc4bf6fd1f44956b86fb398d3252762403420b5 Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 2 Nov 2022 15:21:57 +0800 Subject: [PATCH 07/17] updates HTTP version --- Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Project.toml b/Project.toml index eaab537..2f7bb29 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 3019b2572ba0b9dadfe5044550c68797b6d9bd6d Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 2 Nov 2022 15:26:47 +0800 Subject: [PATCH 08/17] 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 2f7bb29..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.4" +julia = "1.6" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" From 8b20fc9290300729ed35061c8f20e4e9b9a1bbdc Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Wed, 25 Jan 2023 17:53:33 +0800 Subject: [PATCH 09/17] made RequestHandlerFunction callable and added tests for it --- src/HttpHelpers/handlers.jl | 5 +++-- test/handlers.jl | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) 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 a21275a147233dcd2db9737935dbdfa6e281831a Mon Sep 17 00:00:00 2001 From: Kirby Zhang Date: Sat, 28 Jan 2023 14:55:34 +0800 Subject: [PATCH 10/17] 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 From a4985bc712a75adeeff2972b892c96dd6147af6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 31 Jan 2023 17:21:34 -0500 Subject: [PATCH 11/17] rm unused CompatHelper.yml file the operational one is in `.github/workflows/` --- CompatHelper.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 CompatHelper.yml diff --git a/CompatHelper.yml b/CompatHelper.yml deleted file mode 100644 index 46670d7..0000000 --- a/CompatHelper.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: CompatHelper - -on: - schedule: - - cron: '00 * * * *' - issues: - types: [opened, reopened] - -jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - julia-version: [1.5.0] - julia-arch: [x86] - os: [ubuntu-latest] - steps: - - uses: julia-actions/setup-julia@latest - with: - version: ${{ matrix.julia-version }} - - name: Pkg.add("CompatHelper") - run: julia -e 'using Pkg; Pkg.add("CompatHelper")' - - name: CompatHelper.main() - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: julia -e 'using CompatHelper; CompatHelper.main()' From a2020381093cd18561109981fffd810f0dd0bcc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 31 Jan 2023 17:21:50 -0500 Subject: [PATCH 12/17] drop Julia `1.4` for test matrix --- .github/workflows/jl_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jl_test.yml b/.github/workflows/jl_test.yml index 2e7823c..0dd4c97 100644 --- a/.github/workflows/jl_test.yml +++ b/.github/workflows/jl_test.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - jl_version: ["1.4", "1.6", "1.8"] + jl_version: ["1.6", "1.8"] steps: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@v1 From dabbf5fe644dbf60c6677b3cd262511adfceb748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Fri, 3 Feb 2023 13:58:18 -0500 Subject: [PATCH 13/17] drop the `verbose` kwarg for `HTTP.serve`, the verbose HTTP logs are too much for Dash.jl users even while debugging. The `verbose` default is `false`, so we can drop it. --- src/server.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.jl b/src/server.jl index 9350dda..58aa979 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 = debug==true) + task = @async HTTP.serve(handler, host, port; server = server) return (server, task) end From 5b4ff826792ddd9fc9af92057857a3f4343a6349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Mon, 6 Feb 2023 16:32:41 -0500 Subject: [PATCH 14/17] 1.2.0 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 3d0a263..b049f8b 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.2.0" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From 99c2321a66292994e5ec5d326c954215b65d0524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 7 Feb 2023 10:59:29 -0500 Subject: [PATCH 15/17] lint modified files for 1.2.0 - replace tabs with spaces - cut white spaces at EOL - add newline at EOF --- src/HttpHelpers/HttpHelpers.jl | 2 +- src/HttpHelpers/handlers.jl | 30 ++++----- test/env.jl | 4 +- test/handlers.jl | 114 ++++++++++++++++----------------- test/reload_hash.jl | 2 +- 5 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/HttpHelpers/HttpHelpers.jl b/src/HttpHelpers/HttpHelpers.jl index 4d8ab31..0c392a1 100644 --- a/src/HttpHelpers/HttpHelpers.jl +++ b/src/HttpHelpers/HttpHelpers.jl @@ -6,4 +6,4 @@ import HTTP, CodecZlib include("handlers.jl") include("router.jl") -end \ No newline at end of file +end diff --git a/src/HttpHelpers/handlers.jl b/src/HttpHelpers/handlers.jl index 01500e9..c8fe3c0 100644 --- a/src/HttpHelpers/handlers.jl +++ b/src/HttpHelpers/handlers.jl @@ -1,35 +1,35 @@ struct RequestHandlerFunction <: HTTP.Handler - func::Function # func(req) + func::Function # func(req) end (x::RequestHandlerFunction)(args...) = x.func(args...) function handle(h::RequestHandlerFunction, request::HTTP.Request, args...) - h(request, args...) + h(request, args...) end function handle(handler::Function, request::HTTP.Request, args...) - handler(request, args) + handler(request, args) end function handle(h::RequestHandlerFunction, request::HTTP.Request, state, args...) - h(request, state, args...) + h(request, state, args...) end function handle(handler::Function, request::HTTP.Request, state, args...) - handler(request, state, args) + handler(request, state, args) end function state_handler(base_handler, state) - 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 - ) + 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(RequestHandlerFunction(base_handler), state) diff --git a/test/env.jl b/test/env.jl index ba658a2..075f9a8 100644 --- a/test/env.jl +++ b/test/env.jl @@ -52,9 +52,9 @@ end @test dash_env("host") == "localhost" @test isnothing(dash_env("host", prefix = "")) - delete!(ENV, "PORT") + delete!(ENV, "PORT") @test dash_env(Int64, "port", 8050, prefix = "") == 8050 ENV["PORT"] = "2001" @test isnothing(dash_env(Int64, "port")) @test dash_env(Int64, "port", prefix = "") == 2001 -end \ No newline at end of file +end diff --git a/test/handlers.jl b/test/handlers.jl index 1d461b9..710eb52 100644 --- a/test/handlers.jl +++ b/test/handlers.jl @@ -1,7 +1,7 @@ using Test using HTTP using Dash -using Dash: make_handler, compress_handler, process_resource, state_handler, HandlerState, +using Dash: make_handler, compress_handler, process_resource, state_handler, HandlerState, process_resource, Route, Router, add_route!, make_handler using Dash.HttpHelpers: StaticRoute, DynamicRoute, try_handle, RouteHandler, _make_route using CodecZlib @@ -22,17 +22,17 @@ end route = DynamicRoute("/ddd//fff/") @test route.static_segments == ((1,"ddd"), (3, "fff")) - route.variables.var1 == 2 + route.variables.var1 == 2 route.variables.var2 == 4 - - route = _make_route("/fff/sss/ggg/vvvv") + + route = _make_route("/fff/sss/ggg/vvvv") @test route isa StaticRoute @test route.url == "/fff/sss/ggg/vvvv" - route = _make_route("/fff/sss//vvvv") + route = _make_route("/fff/sss//vvvv") @test route isa DynamicRoute - route = _make_route("/test_req/test1") + route = _make_route("/test_req/test1") handler = (req) -> HTTP.Response(200) route_handler = RouteHandler(route, handler) res = try_handle(route_handler, path_request("/test_req/test2")...) @@ -43,7 +43,7 @@ end @test res.status == 200 - route = _make_route("/test_req//test1") + route = _make_route("/test_req//test1") handler = (req;kwargs...) -> begin tmp = String[] @@ -63,7 +63,7 @@ end @test res.status == 200 @test String(res.body) == "var1->asdasd" - route = _make_route("/test_req/*/test1") + route = _make_route("/test_req/*/test1") route_handler = RouteHandler(route, handler) res = try_handle(route_handler, path_request("/test_req/asdasd/test2")...) @test isnothing(res) @@ -71,15 +71,15 @@ end @test res.status == 200 @test String(res.body) == "" - route = _make_route("/test_req/*/test1/") + route = _make_route("/test_req/*/test1/") route_handler = RouteHandler(route, handler) res = try_handle(route_handler, path_request("/test_req/asdasd/test1")...) @test isnothing(res) res = try_handle(route_handler, path_request("/test_req/asdasd/test1/ddd")...) @test res.status == 200 @test String(res.body) == "var1->ddd" - - route = _make_route("/test_req//test1/") + + route = _make_route("/test_req//test1/") route_handler = RouteHandler(route, handler) res = try_handle(route_handler, path_request("/test_req/asdasd/test1")...) @test isnothing(res) @@ -109,73 +109,73 @@ end handler1 = (req;var1) -> HTTP.Response(200, "var1=$var1") add_route!(handler1, router, "/var//") - - add_route!((req;var1, var2) -> HTTP.Response(200, "var1=$var1,var2=$var2"), - router, "/var///") - - res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","")) + + add_route!((req;var1, var2) -> HTTP.Response(200, "var1=$var1,var2=$var2"), + router, "/var///") + + res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","")) @test res.status == 200 @test String(res.body) == "index" - res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","/")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","/")) @test res.status == 200 @test String(res.body) == "index" - res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","/test_post")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("GET","/test_post")) @test res.status == 404 - - res = Dash.HttpHelpers.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 = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/")) + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/var/")) @test res.status == 404 - res = Dash.HttpHelpers.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 = Dash.HttpHelpers.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 = Dash.HttpHelpers.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 = Dash.HttpHelpers.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 = Dash.HttpHelpers.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 = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/test_post")) + add_route!((req, param;var1) -> HTTP.Response(200, "$param, var1=$var1"), + router, "POST", "/") + + res = Dash.HttpHelpers.handle(router, HTTP.Request("POST","/test_post")) @test res.status == 200 @test String(res.body) == "test_post" - res = Dash.HttpHelpers.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 = Dash.HttpHelpers.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" - -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 + 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 request.target == "/test_path" @test state isa TestState @test state.setting return HTTP.Response(200, "test1") @@ -185,31 +185,31 @@ 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 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") @test parse(Int, HTTP.header(res, "Content-Length", "0")) == sizeof("test1") base_handler_http = function(request, state) - @test request.target == "/test_path2" + @test request.target == "/test_path2" @test state isa TestState @test state.setting return HTTP.Response(200, "") end - + state = TestState(true) test_handler = state_handler(base_handler_http, state) test_request = HTTP.Request("GET", "/test_path2") res = Dash.HttpHelpers.handle(test_handler, test_request) - @test structsequal(res, 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("") base_handler_js = function(request, state) - @test request.target == "/test_path3" + @test request.target == "/test_path3" @test state isa TestState @test state.setting return HTTP.Response(200, ["Content-Type"=>"text/javascript"], body = "") @@ -218,8 +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 structsequal(res, 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("") @@ -227,12 +227,12 @@ end @testset "compression" begin base_handler = function(request, state) - @test request.target == "/test_path" + @test request.target == "/test_path" @test state isa TestState @test state.setting return HTTP.Response(200, "test1") end - + state = TestState(true) handler = compress_handler(state_handler(base_handler, state)) test_request = HTTP.Request("GET", "/test_path") @@ -243,7 +243,7 @@ end @test !HTTP.hasheader(res, "Content-Encoding") base_handler = function(request, state) - @test request.target == "/test_big" + @test request.target == "/test_big" @test state isa TestState @test state.setting return HTTP.Response(200, repeat("", 500)) @@ -290,7 +290,7 @@ end dev_package_path = "dash-renderer/dash_renderer.js", ) ] - ) + ) ) test_app = dash() @@ -319,7 +319,7 @@ end HTTP.setheader(request, "If-None-Match"=>etag) 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 = Dash.HttpHelpers.handle(handler, request) @@ -327,6 +327,6 @@ end @test resp.status == 200 @test String(resp.body) == "var string = \"fffffff\"" @test HTTP.hasheader(resp, "Cache-Control") - + end diff --git a/test/reload_hash.jl b/test/reload_hash.jl index 5c5e323..030522a 100644 --- a/test/reload_hash.jl +++ b/test/reload_hash.jl @@ -36,4 +36,4 @@ end @test data.files[1].url == "/assets/test2.css" @test data.files[1].is_css == true rm("assets/test2.css", force = true) -end \ No newline at end of file +end From 4600fffeb8f8f7badd193381f7972cd8150ca716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 7 Feb 2023 11:03:51 -0500 Subject: [PATCH 16/17] lint (re-indent `RequestHandlerFunction` callback) --- src/HttpHelpers/handlers.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/HttpHelpers/handlers.jl b/src/HttpHelpers/handlers.jl index c8fe3c0..645ccf7 100644 --- a/src/HttpHelpers/handlers.jl +++ b/src/HttpHelpers/handlers.jl @@ -21,14 +21,14 @@ end function state_handler(base_handler, state) return RequestHandlerFunction( - function(request::HTTP.Request, args...) - response = handle(base_handler, request, state, args...) - if response.status == 200 + 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 + return response + end ) end From 680422084425a1d80f80d6865577ded27c5b592f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 7 Feb 2023 11:04:41 -0500 Subject: [PATCH 17/17] lint (re-indent `RequestHandlerFunction` callback, again) --- src/HttpHelpers/handlers.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/HttpHelpers/handlers.jl b/src/HttpHelpers/handlers.jl index 645ccf7..e54cbce 100644 --- a/src/HttpHelpers/handlers.jl +++ b/src/HttpHelpers/handlers.jl @@ -24,8 +24,8 @@ function state_handler(base_handler, state) 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))) + HTTP.defaultheader!(response, "Content-Type" => HTTP.sniff(response.body)) + HTTP.defaultheader!(response, "Content-Length" => string(sizeof(response.body))) end return response end