itsi-server 0.1.1 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of itsi-server might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +7 -0
- data/Cargo.lock +4417 -0
- data/Cargo.toml +7 -0
- data/README.md +4 -0
- data/Rakefile +8 -1
- data/_index.md +6 -0
- data/exe/itsi +94 -45
- data/ext/itsi_error/Cargo.toml +2 -0
- data/ext/itsi_error/src/from.rs +68 -0
- data/ext/itsi_error/src/lib.rs +18 -34
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
- data/ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
- data/ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock +0 -0
- data/ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock +0 -0
- data/ext/itsi_instrument_entry/Cargo.toml +15 -0
- data/ext/itsi_instrument_entry/src/lib.rs +31 -0
- data/ext/itsi_rb_helpers/Cargo.toml +3 -0
- data/ext/itsi_rb_helpers/src/heap_value.rs +139 -0
- data/ext/itsi_rb_helpers/src/lib.rs +140 -10
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs +355 -0
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs +276 -0
- data/ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs +49 -0
- data/ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs +8865 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock +0 -0
- data/ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock +0 -0
- data/ext/itsi_scheduler/Cargo.toml +24 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs +56 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs +44 -0
- data/ext/itsi_scheduler/src/itsi_scheduler/timer.rs +44 -0
- data/ext/itsi_scheduler/src/itsi_scheduler.rs +308 -0
- data/ext/itsi_scheduler/src/lib.rs +38 -0
- data/ext/itsi_server/Cargo.lock +2956 -0
- data/ext/itsi_server/Cargo.toml +73 -13
- data/ext/itsi_server/extconf.rb +1 -1
- data/ext/itsi_server/src/env.rs +43 -0
- data/ext/itsi_server/src/lib.rs +100 -40
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs +109 -0
- data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +141 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_request.rs +147 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_response.rs +19 -0
- data/ext/itsi_server/src/ruby_types/itsi_grpc_stream/mod.rs +216 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +282 -0
- data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +388 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +225 -0
- data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +355 -0
- data/ext/itsi_server/src/ruby_types/itsi_server.rs +82 -0
- data/ext/itsi_server/src/ruby_types/mod.rs +55 -0
- data/ext/itsi_server/src/server/bind.rs +75 -31
- data/ext/itsi_server/src/server/bind_protocol.rs +37 -0
- data/ext/itsi_server/src/server/byte_frame.rs +32 -0
- data/ext/itsi_server/src/server/cache_store.rs +74 -0
- data/ext/itsi_server/src/server/io_stream.rs +104 -0
- data/ext/itsi_server/src/server/itsi_service.rs +172 -0
- data/ext/itsi_server/src/server/lifecycle_event.rs +12 -0
- data/ext/itsi_server/src/server/listener.rs +332 -132
- data/ext/itsi_server/src/server/middleware_stack/middleware.rs +153 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +47 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +58 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +82 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +321 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +139 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +300 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +287 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +48 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +127 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +191 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs +72 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs +85 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +195 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +82 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs +82 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +216 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +124 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +76 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +43 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +34 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs +93 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +162 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +158 -0
- data/ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +12 -0
- data/ext/itsi_server/src/server/middleware_stack/mod.rs +315 -0
- data/ext/itsi_server/src/server/mod.rs +15 -2
- data/ext/itsi_server/src/server/process_worker.rs +229 -0
- data/ext/itsi_server/src/server/rate_limiter.rs +565 -0
- data/ext/itsi_server/src/server/request_job.rs +11 -0
- data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +337 -0
- data/ext/itsi_server/src/server/serve_strategy/mod.rs +30 -0
- data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +421 -0
- data/ext/itsi_server/src/server/signal.rs +93 -0
- data/ext/itsi_server/src/server/static_file_server.rs +984 -0
- data/ext/itsi_server/src/server/thread_worker.rs +444 -0
- data/ext/itsi_server/src/server/tls/locked_dir_cache.rs +132 -0
- data/ext/itsi_server/src/server/tls.rs +187 -60
- data/ext/itsi_server/src/server/types.rs +43 -0
- data/ext/itsi_tracing/Cargo.toml +5 -0
- data/ext/itsi_tracing/src/lib.rs +225 -7
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock +0 -0
- data/ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock +0 -0
- data/lib/itsi/http_request.rb +87 -0
- data/lib/itsi/http_response.rb +39 -0
- data/lib/itsi/server/Itsi.rb +119 -0
- data/lib/itsi/server/config/dsl.rb +506 -0
- data/lib/itsi/server/config.rb +131 -0
- data/lib/itsi/server/default_app/default_app.rb +38 -0
- data/lib/itsi/server/default_app/index.html +91 -0
- data/lib/itsi/server/grpc_interface.rb +213 -0
- data/lib/itsi/server/rack/handler/itsi.rb +27 -0
- data/lib/itsi/server/rack_interface.rb +94 -0
- data/lib/itsi/server/scheduler_interface.rb +21 -0
- data/lib/itsi/server/scheduler_mode.rb +10 -0
- data/lib/itsi/server/signal_trap.rb +29 -0
- data/lib/itsi/server/version.rb +1 -1
- data/lib/itsi/server.rb +90 -9
- data/lib/itsi/standard_headers.rb +86 -0
- metadata +122 -31
- data/ext/itsi_server/src/request/itsi_request.rs +0 -143
- data/ext/itsi_server/src/request/mod.rs +0 -1
- data/ext/itsi_server/src/server/itsi_ca/itsi_ca.crt +0 -32
- data/ext/itsi_server/src/server/itsi_ca/itsi_ca.key +0 -52
- data/ext/itsi_server/src/server/itsi_server.rs +0 -182
- data/ext/itsi_server/src/server/transfer_protocol.rs +0 -23
- data/ext/itsi_server/src/stream_writer/mod.rs +0 -21
- data/lib/itsi/request.rb +0 -39
    
        metadata
    CHANGED
    
    | @@ -1,28 +1,28 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: itsi-server
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.13
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Wouter Coppieters
         | 
| 8 8 | 
             
            bindir: exe
         | 
| 9 9 | 
             
            cert_chain: []
         | 
| 10 | 
            -
            date: 2025-03- | 
| 10 | 
            +
            date: 2025-03-29 00:00:00.000000000 Z
         | 
| 11 11 | 
             
            dependencies:
         | 
| 12 12 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 13 | 
            -
              name:  | 
| 13 | 
            +
              name: rack
         | 
| 14 14 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 15 15 | 
             
                requirements:
         | 
| 16 | 
            -
                - - " | 
| 16 | 
            +
                - - ">="
         | 
| 17 17 | 
             
                  - !ruby/object:Gem::Version
         | 
| 18 | 
            -
                    version: ' | 
| 18 | 
            +
                    version: '1.6'
         | 
| 19 19 | 
             
              type: :runtime
         | 
| 20 20 | 
             
              prerelease: false
         | 
| 21 21 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 22 22 | 
             
                requirements:
         | 
| 23 | 
            -
                - - " | 
| 23 | 
            +
                - - ">="
         | 
| 24 24 | 
             
                  - !ruby/object:Gem::Version
         | 
| 25 | 
            -
                    version: ' | 
| 25 | 
            +
                    version: '1.6'
         | 
| 26 26 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 27 27 | 
             
              name: rb_sys
         | 
| 28 28 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -37,20 +37,6 @@ dependencies: | |
| 37 37 | 
             
                - - "~>"
         | 
| 38 38 | 
             
                  - !ruby/object:Gem::Version
         | 
| 39 39 | 
             
                    version: 0.9.91
         | 
| 40 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 41 | 
            -
              name: rack
         | 
| 42 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 43 | 
            -
                requirements:
         | 
| 44 | 
            -
                - - "~>"
         | 
| 45 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 46 | 
            -
                    version: '2'
         | 
| 47 | 
            -
              type: :runtime
         | 
| 48 | 
            -
              prerelease: false
         | 
| 49 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 50 | 
            -
                requirements:
         | 
| 51 | 
            -
                - - "~>"
         | 
| 52 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            -
                    version: '2'
         | 
| 54 40 | 
             
            description: Itsi Server - A light-weight Rack Server implementation for Ruby
         | 
| 55 41 | 
             
            email:
         | 
| 56 42 | 
             
            - wc@pico.net.nz
         | 
| @@ -63,36 +49,141 @@ files: | |
| 63 49 | 
             
            - ".rubocop.yml"
         | 
| 64 50 | 
             
            - CHANGELOG.md
         | 
| 65 51 | 
             
            - CODE_OF_CONDUCT.md
         | 
| 52 | 
            +
            - Cargo.lock
         | 
| 53 | 
            +
            - Cargo.toml
         | 
| 66 54 | 
             
            - LICENSE.txt
         | 
| 67 55 | 
             
            - README.md
         | 
| 68 56 | 
             
            - Rakefile
         | 
| 57 | 
            +
            - _index.md
         | 
| 69 58 | 
             
            - exe/itsi
         | 
| 70 59 | 
             
            - ext/itsi_error/Cargo.lock
         | 
| 71 60 | 
             
            - ext/itsi_error/Cargo.toml
         | 
| 61 | 
            +
            - ext/itsi_error/src/from.rs
         | 
| 72 62 | 
             
            - ext/itsi_error/src/lib.rs
         | 
| 63 | 
            +
            - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/common.rs
         | 
| 64 | 
            +
            - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs
         | 
| 65 | 
            +
            - ext/itsi_error/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs
         | 
| 66 | 
            +
            - ext/itsi_error/target/debug/build/rb-sys-49f554618693db24/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs
         | 
| 67 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-1mmt5sux7jb0i/s-h510z7m8v9-0bxu7yd.lock
         | 
| 68 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-2vn3jey74oiw0/s-h5113n0e7e-1v5qzs6.lock
         | 
| 69 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510ykifhe-0tbnep2.lock
         | 
| 70 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510yyocpj-0tz7ug7.lock
         | 
| 71 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-37uv9dicz7awp/s-h510z0xc8g-14ol18k.lock
         | 
| 72 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-3g5qf4y7d54uj/s-h5113n0e7d-1trk8on.lock
         | 
| 73 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-3lpfftm45d3e2/s-h510z7m8r3-1pxp20o.lock
         | 
| 74 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510ykifek-1uxasnk.lock
         | 
| 75 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510yyocki-11u37qm.lock
         | 
| 76 | 
            +
            - ext/itsi_error/target/debug/incremental/itsi_error-3o4qownhl3d7n/s-h510z0xc93-0pmy0zm.lock
         | 
| 77 | 
            +
            - ext/itsi_instrument_entry/Cargo.toml
         | 
| 78 | 
            +
            - ext/itsi_instrument_entry/src/lib.rs
         | 
| 73 79 | 
             
            - ext/itsi_rb_helpers/Cargo.lock
         | 
| 74 80 | 
             
            - ext/itsi_rb_helpers/Cargo.toml
         | 
| 81 | 
            +
            - ext/itsi_rb_helpers/src/heap_value.rs
         | 
| 75 82 | 
             
            - ext/itsi_rb_helpers/src/lib.rs
         | 
| 83 | 
            +
            - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/common.rs
         | 
| 84 | 
            +
            - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/dynamic.rs
         | 
| 85 | 
            +
            - ext/itsi_rb_helpers/target/debug/build/clang-sys-da71b0344e568175/out/macros.rs
         | 
| 86 | 
            +
            - ext/itsi_rb_helpers/target/debug/build/rb-sys-eb9ed4ff3a60f995/out/bindings-0.9.110-mri-arm64-darwin23-3.4.2.rs
         | 
| 87 | 
            +
            - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-040pxg6yhb3g3/s-h5113n7a1b-03bwlt4.lock
         | 
| 88 | 
            +
            - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h51113xnh3-1eik1ip.lock
         | 
| 89 | 
            +
            - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-131g1u4dzkt1a/s-h5111704jj-0g4rj8x.lock
         | 
| 90 | 
            +
            - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-1q2d3drtxrzs5/s-h5113n79yl-0bxcqc5.lock
         | 
| 91 | 
            +
            - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h51113xoox-10de2hp.lock
         | 
| 92 | 
            +
            - ext/itsi_rb_helpers/target/debug/incremental/itsi_rb_helpers-374a9h7ovycj0/s-h5111704w7-0vdq7gq.lock
         | 
| 93 | 
            +
            - ext/itsi_scheduler/Cargo.toml
         | 
| 94 | 
            +
            - ext/itsi_scheduler/src/itsi_scheduler.rs
         | 
| 95 | 
            +
            - ext/itsi_scheduler/src/itsi_scheduler/io_helpers.rs
         | 
| 96 | 
            +
            - ext/itsi_scheduler/src/itsi_scheduler/io_waiter.rs
         | 
| 97 | 
            +
            - ext/itsi_scheduler/src/itsi_scheduler/timer.rs
         | 
| 98 | 
            +
            - ext/itsi_scheduler/src/lib.rs
         | 
| 99 | 
            +
            - ext/itsi_server/Cargo.lock
         | 
| 76 100 | 
             
            - ext/itsi_server/Cargo.toml
         | 
| 77 101 | 
             
            - ext/itsi_server/extconf.rb
         | 
| 102 | 
            +
            - ext/itsi_server/src/env.rs
         | 
| 78 103 | 
             
            - ext/itsi_server/src/lib.rs
         | 
| 79 | 
            -
            - ext/itsi_server/src/ | 
| 80 | 
            -
            - ext/itsi_server/src/ | 
| 104 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_body_proxy/big_bytes.rs
         | 
| 105 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs
         | 
| 106 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_grpc_request.rs
         | 
| 107 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_grpc_response.rs
         | 
| 108 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_grpc_stream/mod.rs
         | 
| 109 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_http_request.rs
         | 
| 110 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_http_response.rs
         | 
| 111 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_server.rs
         | 
| 112 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs
         | 
| 113 | 
            +
            - ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs
         | 
| 114 | 
            +
            - ext/itsi_server/src/ruby_types/mod.rs
         | 
| 81 115 | 
             
            - ext/itsi_server/src/server/bind.rs
         | 
| 82 | 
            -
            - ext/itsi_server/src/server/ | 
| 83 | 
            -
            - ext/itsi_server/src/server/ | 
| 84 | 
            -
            - ext/itsi_server/src/server/ | 
| 116 | 
            +
            - ext/itsi_server/src/server/bind_protocol.rs
         | 
| 117 | 
            +
            - ext/itsi_server/src/server/byte_frame.rs
         | 
| 118 | 
            +
            - ext/itsi_server/src/server/cache_store.rs
         | 
| 119 | 
            +
            - ext/itsi_server/src/server/io_stream.rs
         | 
| 120 | 
            +
            - ext/itsi_server/src/server/itsi_service.rs
         | 
| 121 | 
            +
            - ext/itsi_server/src/server/lifecycle_event.rs
         | 
| 85 122 | 
             
            - ext/itsi_server/src/server/listener.rs
         | 
| 123 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middleware.rs
         | 
| 124 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs
         | 
| 125 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs
         | 
| 126 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs
         | 
| 127 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs
         | 
| 128 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs
         | 
| 129 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs
         | 
| 130 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs
         | 
| 131 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs
         | 
| 132 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs
         | 
| 133 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs
         | 
| 134 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/grpc_service.rs
         | 
| 135 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/header_interpretation.rs
         | 
| 136 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs
         | 
| 137 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs
         | 
| 138 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/mod.rs
         | 
| 139 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs
         | 
| 140 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs
         | 
| 141 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs
         | 
| 142 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs
         | 
| 143 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs
         | 
| 144 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/ruby_app.rs
         | 
| 145 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs
         | 
| 146 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs
         | 
| 147 | 
            +
            - ext/itsi_server/src/server/middleware_stack/middlewares/token_source.rs
         | 
| 148 | 
            +
            - ext/itsi_server/src/server/middleware_stack/mod.rs
         | 
| 86 149 | 
             
            - ext/itsi_server/src/server/mod.rs
         | 
| 150 | 
            +
            - ext/itsi_server/src/server/process_worker.rs
         | 
| 151 | 
            +
            - ext/itsi_server/src/server/rate_limiter.rs
         | 
| 152 | 
            +
            - ext/itsi_server/src/server/request_job.rs
         | 
| 153 | 
            +
            - ext/itsi_server/src/server/serve_strategy/cluster_mode.rs
         | 
| 154 | 
            +
            - ext/itsi_server/src/server/serve_strategy/mod.rs
         | 
| 155 | 
            +
            - ext/itsi_server/src/server/serve_strategy/single_mode.rs
         | 
| 156 | 
            +
            - ext/itsi_server/src/server/signal.rs
         | 
| 157 | 
            +
            - ext/itsi_server/src/server/static_file_server.rs
         | 
| 158 | 
            +
            - ext/itsi_server/src/server/thread_worker.rs
         | 
| 87 159 | 
             
            - ext/itsi_server/src/server/tls.rs
         | 
| 88 | 
            -
            - ext/itsi_server/src/server/ | 
| 89 | 
            -
            - ext/itsi_server/src/ | 
| 160 | 
            +
            - ext/itsi_server/src/server/tls/locked_dir_cache.rs
         | 
| 161 | 
            +
            - ext/itsi_server/src/server/types.rs
         | 
| 90 162 | 
             
            - ext/itsi_tracing/Cargo.lock
         | 
| 91 163 | 
             
            - ext/itsi_tracing/Cargo.toml
         | 
| 92 164 | 
             
            - ext/itsi_tracing/src/lib.rs
         | 
| 93 | 
            -
            -  | 
| 165 | 
            +
            - ext/itsi_tracing/target/debug/incremental/itsi_tracing-0994n8rpvvt9m/s-h510hfz1f6-1kbycmq.lock
         | 
| 166 | 
            +
            - ext/itsi_tracing/target/debug/incremental/itsi_tracing-0bob7bf4yq34i/s-h5113125h5-0lh4rag.lock
         | 
| 167 | 
            +
            - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2fcodulrxbbxo/s-h510h2infk-0hp5kjw.lock
         | 
| 168 | 
            +
            - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2iak63r1woi1l/s-h510h2in4q-0kxfzw1.lock
         | 
| 169 | 
            +
            - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2kk4qj9gn5dg2/s-h5113124kv-0enwon2.lock
         | 
| 170 | 
            +
            - ext/itsi_tracing/target/debug/incremental/itsi_tracing-2mwo0yas7dtw4/s-h510hfz1ha-1udgpei.lock
         | 
| 171 | 
            +
            - lib/itsi/http_request.rb
         | 
| 172 | 
            +
            - lib/itsi/http_response.rb
         | 
| 94 173 | 
             
            - lib/itsi/server.rb
         | 
| 174 | 
            +
            - lib/itsi/server/Itsi.rb
         | 
| 175 | 
            +
            - lib/itsi/server/config.rb
         | 
| 176 | 
            +
            - lib/itsi/server/config/dsl.rb
         | 
| 177 | 
            +
            - lib/itsi/server/default_app/default_app.rb
         | 
| 178 | 
            +
            - lib/itsi/server/default_app/index.html
         | 
| 179 | 
            +
            - lib/itsi/server/grpc_interface.rb
         | 
| 180 | 
            +
            - lib/itsi/server/rack/handler/itsi.rb
         | 
| 181 | 
            +
            - lib/itsi/server/rack_interface.rb
         | 
| 182 | 
            +
            - lib/itsi/server/scheduler_interface.rb
         | 
| 183 | 
            +
            - lib/itsi/server/scheduler_mode.rb
         | 
| 184 | 
            +
            - lib/itsi/server/signal_trap.rb
         | 
| 95 185 | 
             
            - lib/itsi/server/version.rb
         | 
| 186 | 
            +
            - lib/itsi/standard_headers.rb
         | 
| 96 187 | 
             
            - sig/itsi_server.rbs
         | 
| 97 188 | 
             
            homepage: https://itsi.fyi
         | 
| 98 189 | 
             
            licenses:
         | 
| @@ -108,12 +199,12 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 108 199 | 
             
              requirements:
         | 
| 109 200 | 
             
              - - ">="
         | 
| 110 201 | 
             
                - !ruby/object:Gem::Version
         | 
| 111 | 
            -
                  version:  | 
| 202 | 
            +
                  version: 2.7.0
         | 
| 112 203 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 113 204 | 
             
              requirements:
         | 
| 114 205 | 
             
              - - ">="
         | 
| 115 206 | 
             
                - !ruby/object:Gem::Version
         | 
| 116 | 
            -
                  version: 3. | 
| 207 | 
            +
                  version: '3.1'
         | 
| 117 208 | 
             
            requirements: []
         | 
| 118 209 | 
             
            rubygems_version: 3.6.2
         | 
| 119 210 | 
             
            specification_version: 4
         | 
| @@ -1,143 +0,0 @@ | |
| 1 | 
            -
            use std::{collections::HashMap, sync::Arc};
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            use crate::server::listener::{Listener, SockAddr};
         | 
| 4 | 
            -
            use bytes::Bytes;
         | 
| 5 | 
            -
            use http::request::Parts;
         | 
| 6 | 
            -
            use http_body_util::BodyExt;
         | 
| 7 | 
            -
            use hyper::{body::Incoming, Request};
         | 
| 8 | 
            -
            use magnus::error::Result;
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            #[magnus::wrap(class = "Itsi::Request", free_immediately, size)]
         | 
| 11 | 
            -
            #[derive(Debug)]
         | 
| 12 | 
            -
            pub struct ItsiRequest {
         | 
| 13 | 
            -
                pub path: String,
         | 
| 14 | 
            -
                pub script_name: String,
         | 
| 15 | 
            -
                pub query_string: String,
         | 
| 16 | 
            -
                pub method: String,
         | 
| 17 | 
            -
                pub version: String,
         | 
| 18 | 
            -
                pub rack_protocol: Vec<String>,
         | 
| 19 | 
            -
                pub host: String,
         | 
| 20 | 
            -
                pub scheme: String,
         | 
| 21 | 
            -
                pub headers: HashMap<String, String>,
         | 
| 22 | 
            -
                pub remote_addr: String,
         | 
| 23 | 
            -
                pub port: u16,
         | 
| 24 | 
            -
                pub body: Bytes,
         | 
| 25 | 
            -
                pub parts: Parts,
         | 
| 26 | 
            -
            }
         | 
| 27 | 
            -
             | 
| 28 | 
            -
            impl ItsiRequest {
         | 
| 29 | 
            -
                pub(crate) async fn build_from(
         | 
| 30 | 
            -
                    request: Request<Incoming>,
         | 
| 31 | 
            -
                    sock_addr: SockAddr,
         | 
| 32 | 
            -
                    script_name: String,
         | 
| 33 | 
            -
                    listener: Arc<Listener>,
         | 
| 34 | 
            -
                ) -> Self {
         | 
| 35 | 
            -
                    let (parts, body) = request.into_parts();
         | 
| 36 | 
            -
                    let method = parts.method.to_string();
         | 
| 37 | 
            -
                    let port = parts.uri.port_u16().unwrap_or(listener.port());
         | 
| 38 | 
            -
                    let query_string = parts.uri.query().unwrap_or("").to_string();
         | 
| 39 | 
            -
                    let rack_protocol = parts
         | 
| 40 | 
            -
                        .headers
         | 
| 41 | 
            -
                        .get("upgrade")
         | 
| 42 | 
            -
                        .or_else(|| parts.headers.get("protocol"))
         | 
| 43 | 
            -
                        .map(|value| {
         | 
| 44 | 
            -
                            value
         | 
| 45 | 
            -
                                .to_str()
         | 
| 46 | 
            -
                                .unwrap_or("")
         | 
| 47 | 
            -
                                .split(',')
         | 
| 48 | 
            -
                                .map(|s| s.trim().to_owned())
         | 
| 49 | 
            -
                                .collect::<Vec<String>>()
         | 
| 50 | 
            -
                        })
         | 
| 51 | 
            -
                        .unwrap_or_else(|| vec!["http".to_string()]);
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                    let host = parts
         | 
| 54 | 
            -
                        .uri
         | 
| 55 | 
            -
                        .host()
         | 
| 56 | 
            -
                        .map(ToOwned::to_owned)
         | 
| 57 | 
            -
                        .unwrap_or_else(|| listener.host());
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                    let scheme = parts
         | 
| 60 | 
            -
                        .uri
         | 
| 61 | 
            -
                        .scheme()
         | 
| 62 | 
            -
                        .map(|s| s.to_string())
         | 
| 63 | 
            -
                        .unwrap_or_else(|| listener.scheme());
         | 
| 64 | 
            -
             | 
| 65 | 
            -
                    let headers = parts
         | 
| 66 | 
            -
                        .headers
         | 
| 67 | 
            -
                        .iter()
         | 
| 68 | 
            -
                        .map(|(k, v)| (k.to_string(), v.to_str().unwrap_or("").to_string()))
         | 
| 69 | 
            -
                        .collect();
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                    let path = parts
         | 
| 72 | 
            -
                        .uri
         | 
| 73 | 
            -
                        .path()
         | 
| 74 | 
            -
                        .strip_prefix(&script_name)
         | 
| 75 | 
            -
                        .unwrap_or(parts.uri.path())
         | 
| 76 | 
            -
                        .to_string();
         | 
| 77 | 
            -
             | 
| 78 | 
            -
                    let version = format!("{:?}", parts.version);
         | 
| 79 | 
            -
                    let body = body.collect().await.unwrap().to_bytes();
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                    Self {
         | 
| 82 | 
            -
                        remote_addr: sock_addr.to_string(),
         | 
| 83 | 
            -
                        body,
         | 
| 84 | 
            -
                        parts,
         | 
| 85 | 
            -
                        script_name,
         | 
| 86 | 
            -
                        query_string,
         | 
| 87 | 
            -
                        method,
         | 
| 88 | 
            -
                        headers,
         | 
| 89 | 
            -
                        path,
         | 
| 90 | 
            -
                        version,
         | 
| 91 | 
            -
                        rack_protocol,
         | 
| 92 | 
            -
                        host,
         | 
| 93 | 
            -
                        scheme,
         | 
| 94 | 
            -
                        port,
         | 
| 95 | 
            -
                    }
         | 
| 96 | 
            -
                }
         | 
| 97 | 
            -
            }
         | 
| 98 | 
            -
             | 
| 99 | 
            -
            impl ItsiRequest {
         | 
| 100 | 
            -
                pub(crate) fn path(&self) -> Result<String> {
         | 
| 101 | 
            -
                    Ok(self.path.clone())
         | 
| 102 | 
            -
                }
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                pub(crate) fn script_name(&self) -> Result<String> {
         | 
| 105 | 
            -
                    Ok(self.script_name.clone())
         | 
| 106 | 
            -
                }
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                pub(crate) fn query_string(&self) -> Result<String> {
         | 
| 109 | 
            -
                    Ok(self.query_string.clone())
         | 
| 110 | 
            -
                }
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                pub(crate) fn method(&self) -> Result<String> {
         | 
| 113 | 
            -
                    Ok(self.method.clone())
         | 
| 114 | 
            -
                }
         | 
| 115 | 
            -
             | 
| 116 | 
            -
                pub(crate) fn version(&self) -> Result<String> {
         | 
| 117 | 
            -
                    Ok(self.version.clone())
         | 
| 118 | 
            -
                }
         | 
| 119 | 
            -
             | 
| 120 | 
            -
                pub(crate) fn rack_protocol(&self) -> Result<Vec<String>> {
         | 
| 121 | 
            -
                    Ok(self.rack_protocol.clone())
         | 
| 122 | 
            -
                }
         | 
| 123 | 
            -
             | 
| 124 | 
            -
                pub(crate) fn host(&self) -> Result<String> {
         | 
| 125 | 
            -
                    Ok(self.host.clone())
         | 
| 126 | 
            -
                }
         | 
| 127 | 
            -
             | 
| 128 | 
            -
                pub(crate) fn headers(&self) -> Result<HashMap<String, String>> {
         | 
| 129 | 
            -
                    Ok(self.headers.clone())
         | 
| 130 | 
            -
                }
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                pub(crate) fn remote_addr(&self) -> Result<String> {
         | 
| 133 | 
            -
                    Ok(self.remote_addr.clone())
         | 
| 134 | 
            -
                }
         | 
| 135 | 
            -
             | 
| 136 | 
            -
                pub(crate) fn port(&self) -> Result<u16> {
         | 
| 137 | 
            -
                    Ok(self.port)
         | 
| 138 | 
            -
                }
         | 
| 139 | 
            -
             | 
| 140 | 
            -
                pub(crate) fn body(&self) -> Result<Bytes> {
         | 
| 141 | 
            -
                    Ok(self.body.clone())
         | 
| 142 | 
            -
                }
         | 
| 143 | 
            -
            }
         | 
| @@ -1 +0,0 @@ | |
| 1 | 
            -
            pub mod itsi_request;
         | 
| @@ -1,32 +0,0 @@ | |
| 1 | 
            -
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            -
            MIIFgTCCA2mgAwIBAgIUe316+G3qdkcWtRxYKlNBEAEenzAwDQYJKoZIhvcNAQEL
         | 
| 3 | 
            -
            BQAwUDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBEl0c2kxDTALBgNVBAcMBEl0c2kx
         | 
| 4 | 
            -
            EDAOBgNVBAoMB0l0c2kgQ0ExETAPBgNVBAMMCGl0c2kuZnlpMB4XDTI1MDIyODAy
         | 
| 5 | 
            -
            NTkyNVoXDTM1MDIyNjAyNTkyNVowUDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBEl0
         | 
| 6 | 
            -
            c2kxDTALBgNVBAcMBEl0c2kxEDAOBgNVBAoMB0l0c2kgQ0ExETAPBgNVBAMMCGl0
         | 
| 7 | 
            -
            c2kuZnlpMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzKAK2RIvnATa
         | 
| 8 | 
            -
            pOxNYubaGjOx8z4thxwWM/KxMqI8gABmgRFTa99n1vrTenlfdX4PcoRyCXEJ3krh
         | 
| 9 | 
            -
            nPsRmP1nnUS1BEIX4Ha9xVPIy0UoP0JN1a4kVInejZe2ZTcpRv8k2KlkafIw0ISt
         | 
| 10 | 
            -
            /hSoopNV2SESCMDxx2e3F9d4wzHmkfs2+6k+12TTYkkifXaXgSOXm91a5ABqTfa8
         | 
| 11 | 
            -
            wS6td/zmwv6W5RNBU3kS3TsqoKjc0xdu25aifJ40i/+82b5OOWhWt+psSPlTZb+Y
         | 
| 12 | 
            -
            5elMhlh8Hjs52S3u48wz5joPsBi9r4yLYGhgB+AiW+b+y0uss7EiTQR24U+CroEB
         | 
| 13 | 
            -
            4c1LA4qTgQPUvUIXyyFGC3lPsjKHGiEitbIT4sDQOz3nMMvT0FIP7DPtiSAuyx0I
         | 
| 14 | 
            -
            J6/3+/QQ/8dzGqZskolKTSWGToOysNWcIxbbBprDAXYseOTJvREVpwC/Qra5OUqU
         | 
| 15 | 
            -
            6P8K72yp2hSCu/5EQwV3kwKMw0JmjJFyaL8SC2GJnueWWCIIZjYdc0ZAA9Dvl9eo
         | 
| 16 | 
            -
            SfQA4emLjUcScFpj8kv3Iu5tGJxnO1gqJ4JV+NKJ/09AxXvFYpNhaBXJ0xUOTA8/
         | 
| 17 | 
            -
            vBTkAs9hTFV1IFIgJNP5CxEbkWr5FcFYUKAopFhDKfQkXGCKEn4s3wuNqUuzEEdE
         | 
| 18 | 
            -
            Sx2YVV8XKbb9eKpHN5cQ6ljeFvanKpMCAwEAAaNTMFEwHQYDVR0OBBYEFIaKuU5Z
         | 
| 19 | 
            -
            CCv9JAsdqvHyR5QnE1OdMB8GA1UdIwQYMBaAFIaKuU5ZCCv9JAsdqvHyR5QnE1Od
         | 
| 20 | 
            -
            MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAGslKyiOzrJzfVEA
         | 
| 21 | 
            -
            HwJu/4CpDs7MpZuzAJ/AS0shWR3qlpHJUn6c/NIaQBfmVIo+vfxTvwV+ih6tZ+4A
         | 
| 22 | 
            -
            HmIZrCQm7rn5uQm2Q9G++JQ0RgQfLngnz3FBL+aERW2wxw1vOcPwg8JWCeGUSCd4
         | 
| 23 | 
            -
            Lj4jtpvlniS5uIiCD2GYxRIub401egX60XAiHdR0k6rS2dKxab9vMKW28RvRddak
         | 
| 24 | 
            -
            YCk7UKSXOZlj39XVH/JCB8+4IokDLTikpoAUqiNfytO+kx9+1JHKti8NjSQJwjqO
         | 
| 25 | 
            -
            JtBd1OD2ziQqd0gVKjr3J4IwIBv3Yl3GGUi3c5HVyDejriPciPrK+4G6a4IDGiyG
         | 
| 26 | 
            -
            rQRTzTR98ILsPX5uvOJadF1TAyZpS8oN7xFM8BnKfdpB34x3p9KgBqk34dRIXxbF
         | 
| 27 | 
            -
            nM3AJRT5dHlcHkn6z1snFqRHko4QvG0bSHlZFepogLG9yOGB0B1Hp4JPTSimEb6f
         | 
| 28 | 
            -
            b+CL5o8mXzAMRDIzdjTkBM/nQg5NMoXaXvmKypw/zIYI/ffb6Kwu/Y6gWmXubQrA
         | 
| 29 | 
            -
            fJ95Ssb14RKtmW6IDmHD5mNpybjhoSzwtBZyuHAyVZT/5P8/QHNkMBwpfQsevY5f
         | 
| 30 | 
            -
            FmOcAZIq9bHTBvn5SNNvi2NxZfTRD7sTMogXgqKKcxwe2rs52IYecamNekQMjrPL
         | 
| 31 | 
            -
            jI16bCLO/G1NaQ+N9YFL4TGfvbCe
         | 
| 32 | 
            -
            -----END CERTIFICATE-----
         | 
| @@ -1,52 +0,0 @@ | |
| 1 | 
            -
            -----BEGIN PRIVATE KEY-----
         | 
| 2 | 
            -
            MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDMoArZEi+cBNqk
         | 
| 3 | 
            -
            7E1i5toaM7HzPi2HHBYz8rEyojyAAGaBEVNr32fW+tN6eV91fg9yhHIJcQneSuGc
         | 
| 4 | 
            -
            +xGY/WedRLUEQhfgdr3FU8jLRSg/Qk3VriRUid6Nl7ZlNylG/yTYqWRp8jDQhK3+
         | 
| 5 | 
            -
            FKiik1XZIRIIwPHHZ7cX13jDMeaR+zb7qT7XZNNiSSJ9dpeBI5eb3VrkAGpN9rzB
         | 
| 6 | 
            -
            Lq13/ObC/pblE0FTeRLdOyqgqNzTF27blqJ8njSL/7zZvk45aFa36mxI+VNlv5jl
         | 
| 7 | 
            -
            6UyGWHweOznZLe7jzDPmOg+wGL2vjItgaGAH4CJb5v7LS6yzsSJNBHbhT4KugQHh
         | 
| 8 | 
            -
            zUsDipOBA9S9QhfLIUYLeU+yMocaISK1shPiwNA7Pecwy9PQUg/sM+2JIC7LHQgn
         | 
| 9 | 
            -
            r/f79BD/x3MapmySiUpNJYZOg7Kw1ZwjFtsGmsMBdix45Mm9ERWnAL9Ctrk5SpTo
         | 
| 10 | 
            -
            /wrvbKnaFIK7/kRDBXeTAozDQmaMkXJovxILYYme55ZYIghmNh1zRkAD0O+X16hJ
         | 
| 11 | 
            -
            9ADh6YuNRxJwWmPyS/ci7m0YnGc7WConglX40on/T0DFe8Vik2FoFcnTFQ5MDz+8
         | 
| 12 | 
            -
            FOQCz2FMVXUgUiAk0/kLERuRavkVwVhQoCikWEMp9CRcYIoSfizfC42pS7MQR0RL
         | 
| 13 | 
            -
            HZhVXxcptv14qkc3lxDqWN4W9qcqkwIDAQABAoICADBfoVDhuLmUeC/G4SCBXIwX
         | 
| 14 | 
            -
            LnlHeLHZFPKg6/0BV3YXIiRe+S6mOMEcuMPaT5PSAkrbPq42t9OCNkXLIMTfGxCV
         | 
| 15 | 
            -
            volMKqLYz1IH1Y8gQTx7KzVZnqMRmLg2ZlsVKD/tb0N9AAz/wUR6KTvInHkahY/3
         | 
| 16 | 
            -
            /nBtVHsEbMdJG/ZhJJXcIopp3z5CSqqQiYPJdlWEGYIyWRtPcdIOg17T7xRPiCoO
         | 
| 17 | 
            -
            z5NF8wqNs8TzCMfEQ7fvcTieKrl1GQ0DnxyGna16mg2OcJzrvChwm++2MG4OGwF2
         | 
| 18 | 
            -
            lN1fu3rEunwxu6Wwo58NhaF76z/RX64ENLXQpPox5N76MDRhfI5OVyiPRK2IpAfO
         | 
| 19 | 
            -
            rgMY4tbiE+OMRqM553MpfcrmxmafxI7287OqraHWRaayHKARDrF42m5XXJG5sYUP
         | 
| 20 | 
            -
            2RDKlt8LOOmhQWbnpzOifzyk8Rn57yIGPda2Wqc9vvH3efMcLJ/ZhDPeHBaA2JIN
         | 
| 21 | 
            -
            7JWJNZ5G58muXBzh2+q4mBJTKN9RBHE+CHeNDR6Yp2/Tul0P7GesMMx78De4iNsu
         | 
| 22 | 
            -
            uMiBhrx6FB5qsoBlFGD5FUyBVRYyIfZXbzGGh7dEHzOl1YVcZszjE/xm6QlLr0HD
         | 
| 23 | 
            -
            pVH+Wf+y6rltz+Hw/XOJfvF1Wx42NmXX+FOGnVG0VPQB8s/oRnsUerYt9DrzV2BT
         | 
| 24 | 
            -
            1oppvacvemTeryKx6LRBAoIBAQDlnMDBRoxvbJpzNcVQtZQr9GokIVockhKn2pHb
         | 
| 25 | 
            -
            /2y4Y7Kl6q7LM8lEjSeCxvl2joEEDIvX6ex+mcB45D3CgKb1kCrjSsFgOgRMPjB1
         | 
| 26 | 
            -
            yDDyQ9wf4UqJNKXriDy5v3HQVZKiFiDQPG1X4VEofIaNxMDSo2fx9v93bO3YeCJ9
         | 
| 27 | 
            -
            2KTX5091Hx31UCZnBzE8siZtizz9iVqQ4qILbluxRQf8YMlLyT2KtCZzJ8wYfk9h
         | 
| 28 | 
            -
            zHsr+v3wyrOUzbSxTOG9NfBuBUrz4gg3z08e+2ymfrl3lZdZ11iHkBMvfSIzZPUP
         | 
| 29 | 
            -
            7TysZFR/DukW2Uh9szgSP8biaP8PDvqpZ+p493MwdEl2YCShAoIBAQDkJClmQ9b+
         | 
| 30 | 
            -
            eRk/b2CFkpV1NNT9A5RaoI+aL4qfgOdDCBA/6lQy3P3aurIn0qAjNEsFl45mOBEy
         | 
| 31 | 
            -
            GWCrU8HrccxhHVma48gxrTnQ0kJ7YEzgxTTN3ccqsly1e8mpNroWjZFqN85B9JwV
         | 
| 32 | 
            -
            rzswu6pXD+673u7m/q8nIz9JSS2A0KKFr5BXVHiyxM9EgOW+v4Lx2r5f18iATTbs
         | 
| 33 | 
            -
            qs8GSHMc1OPwFe/KKnrLPzpx1tGuBQkdXdv1WzSvfZdznPjMFNhapEWsvS+J5lKo
         | 
| 34 | 
            -
            56t2EyxOR0d/TmyZVphw0qdD/eM57aWXxlJJoIs/NF+XG2pghK0YhoP2Y0bcCkOI
         | 
| 35 | 
            -
            Hy1Hk6JbdM6zAoIBAQCiIkcF81AVGgYR1mVHMYC4bPVKH/bmd8sOlcsrIrjdlyC+
         | 
| 36 | 
            -
            AfJ9cErtyhKdSO08ZzH47vcMdpTVbLI5a0mk/31lpvBx4QadcTo5sCw97yeI2pwk
         | 
| 37 | 
            -
            MsyUCAYlQ+VFcEboypQpOiDfidvYEzVgtlW447cYxeQPOs93wAZPNb19Sa5U+nPk
         | 
| 38 | 
            -
            Cx33bCpB1BVTe6Sg85IUoZm+9xlfowTCLzGNZ7acejSnrb/8zpxSq1ZYg7ByBOCt
         | 
| 39 | 
            -
            2CRorbyq+dPo7J6iwcAEaJZO+mcvRHCbPJ6wL4RZHzPXPcgeX2j4C5D0NxwByzLT
         | 
| 40 | 
            -
            KW80ACgtApFUaY6Br4xzUKt1Vfh+hJTlISgCm68hAoIBAQCEkGKh8q99hF5gVtZu
         | 
| 41 | 
            -
            JwPDbCSKtEbC9mMbA574Gc3HTGssyHuOZoz3SN52d1PnwN4K7MqoqNGNG+PpCa03
         | 
| 42 | 
            -
            oxNQJt7HOq47910N8u8Ag6+IN+775G9zZtqp9bjzI0K0EiS55J1sA7eifgTVx2Yu
         | 
| 43 | 
            -
            Wqqs7dhBzyF1i2ydp/DR1elp5t7nb8UGk4egVYmp8dwjrqhKRrdRngxZLtNG4lhJ
         | 
| 44 | 
            -
            G4crHYQNI+vgJ+hM97c09+YY8035XrrZcg/L9R04cLBa0vNNcUyrQ3MqhBtEa9Wl
         | 
| 45 | 
            -
            0pM/7RD7dK71d+ILhv4+zdEXxPxRngDrhAI7aonAdbei9Z6+T2eAOlKNSRhla+q+
         | 
| 46 | 
            -
            W7wzAoIBAQDGX2nnfmdzDdDyFSJj5mIfj/nMG1FQg4BlxtFn6BRJmAVxCasi8tP9
         | 
| 47 | 
            -
            LLlMy4n6jYNxUUad5jwmFTcH3WBIaNtKyMhvzpY7lb6zp2i8U6GS6ctbzrWCobM5
         | 
| 48 | 
            -
            ivhuz0WuayZzI9fQGBb+EjAEhDgVRAFPG+xRowxC+vUw30kTAW15ENUN3HRRBLPo
         | 
| 49 | 
            -
            b2VWCatESqGIuuweu44aZcj0c7QLOQiDry4QqrpIuIR2HIzOhX8Uuxq1kdSPuXBh
         | 
| 50 | 
            -
            3YQBLl7YtOi/UNpRqlYrJpVlLoDZol4HgsQBqd5dqYUYCbl5fpgxM25vww6LFFjK
         | 
| 51 | 
            -
            cN5973/E4MpAKMt1shs0YWr3axraOhkg
         | 
| 52 | 
            -
            -----END PRIVATE KEY-----
         | 
| @@ -1,182 +0,0 @@ | |
| 1 | 
            -
            use super::{
         | 
| 2 | 
            -
                bind::Bind,
         | 
| 3 | 
            -
                listener::{Listener, SockAddr},
         | 
| 4 | 
            -
            };
         | 
| 5 | 
            -
            use crate::{request::itsi_request::ItsiRequest, ITSI_SERVER};
         | 
| 6 | 
            -
            use bytes::Bytes;
         | 
| 7 | 
            -
            use derive_more::Debug;
         | 
| 8 | 
            -
            use http_body_util::{combinators::BoxBody, Empty};
         | 
| 9 | 
            -
            use hyper::{
         | 
| 10 | 
            -
                body::Incoming, header::HeaderName, service::service_fn, HeaderMap, Request, Response,
         | 
| 11 | 
            -
                StatusCode,
         | 
| 12 | 
            -
            };
         | 
| 13 | 
            -
            use hyper_util::{rt::TokioExecutor, server::conn::auto::Builder};
         | 
| 14 | 
            -
            use itsi_tracing::{error, info};
         | 
| 15 | 
            -
            use magnus::{
         | 
| 16 | 
            -
                error::Result,
         | 
| 17 | 
            -
                scan_args::{get_kwargs, scan_args, Args, KwArgs},
         | 
| 18 | 
            -
                value::{Opaque, ReprValue},
         | 
| 19 | 
            -
                RHash, Ruby, Value,
         | 
| 20 | 
            -
            };
         | 
| 21 | 
            -
            use parking_lot::Mutex;
         | 
| 22 | 
            -
            use std::{collections::HashMap, convert::Infallible, sync::Arc};
         | 
| 23 | 
            -
            use tokio::runtime::Builder as RuntimeBuilder;
         | 
| 24 | 
            -
            use tokio::task::JoinSet;
         | 
| 25 | 
            -
             | 
| 26 | 
            -
            #[magnus::wrap(class = "Itsi::Server", free_immediately, size)]
         | 
| 27 | 
            -
            #[derive(Debug)]
         | 
| 28 | 
            -
            pub struct Server {
         | 
| 29 | 
            -
                #[debug(skip)]
         | 
| 30 | 
            -
                app: Opaque<Value>,
         | 
| 31 | 
            -
                #[allow(unused)]
         | 
| 32 | 
            -
                workers: u16,
         | 
| 33 | 
            -
                #[allow(unused)]
         | 
| 34 | 
            -
                threads: u16,
         | 
| 35 | 
            -
                #[allow(unused)]
         | 
| 36 | 
            -
                shutdown_timeout: f64,
         | 
| 37 | 
            -
                script_name: String,
         | 
| 38 | 
            -
                pub(crate) binds: Mutex<Vec<Bind>>,
         | 
| 39 | 
            -
            }
         | 
| 40 | 
            -
             | 
| 41 | 
            -
            impl Server {
         | 
| 42 | 
            -
                pub fn new(args: &[Value]) -> Result<Self> {
         | 
| 43 | 
            -
                    type OptionalArgs = (
         | 
| 44 | 
            -
                        Option<u16>,
         | 
| 45 | 
            -
                        Option<u16>,
         | 
| 46 | 
            -
                        Option<f64>,
         | 
| 47 | 
            -
                        Option<String>,
         | 
| 48 | 
            -
                        Option<Vec<String>>,
         | 
| 49 | 
            -
                    );
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                    let scan_args: Args<(), (), (), (), RHash, ()> = scan_args(args)?;
         | 
| 52 | 
            -
                    let args: KwArgs<(Value,), OptionalArgs, ()> = get_kwargs(
         | 
| 53 | 
            -
                        scan_args.keywords,
         | 
| 54 | 
            -
                        &["app"],
         | 
| 55 | 
            -
                        &[
         | 
| 56 | 
            -
                            "workers",
         | 
| 57 | 
            -
                            "threads",
         | 
| 58 | 
            -
                            "shutdown_timeout",
         | 
| 59 | 
            -
                            "script_name",
         | 
| 60 | 
            -
                            "binds",
         | 
| 61 | 
            -
                        ],
         | 
| 62 | 
            -
                    )?;
         | 
| 63 | 
            -
                    let server = Server {
         | 
| 64 | 
            -
                        app: Opaque::from(args.required.0),
         | 
| 65 | 
            -
                        workers: args.optional.0.unwrap_or(1),
         | 
| 66 | 
            -
                        threads: args.optional.1.unwrap_or(1),
         | 
| 67 | 
            -
                        shutdown_timeout: args.optional.2.unwrap_or(5.0),
         | 
| 68 | 
            -
                        script_name: args.optional.3.unwrap_or("".to_string()),
         | 
| 69 | 
            -
                        binds: Mutex::new(
         | 
| 70 | 
            -
                            args.optional
         | 
| 71 | 
            -
                                .4
         | 
| 72 | 
            -
                                .unwrap_or_else(|| vec!["localhost:3000".to_string()])
         | 
| 73 | 
            -
                                .into_iter()
         | 
| 74 | 
            -
                                .map(|s| s.parse().unwrap_or_else(|_| Bind::default()))
         | 
| 75 | 
            -
                                .collect(),
         | 
| 76 | 
            -
                        ),
         | 
| 77 | 
            -
                    };
         | 
| 78 | 
            -
                    Ok(server)
         | 
| 79 | 
            -
                }
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                pub(crate) async fn process_request(
         | 
| 82 | 
            -
                    hyper_request: Request<Incoming>,
         | 
| 83 | 
            -
                    app: Opaque<Value>,
         | 
| 84 | 
            -
                    script_name: String,
         | 
| 85 | 
            -
                    listener: Arc<Listener>,
         | 
| 86 | 
            -
                    addr: SockAddr,
         | 
| 87 | 
            -
                ) -> itsi_error::Result<Response<BoxBody<Bytes, Infallible>>> {
         | 
| 88 | 
            -
                    let request = ItsiRequest::build_from(hyper_request, addr, script_name, listener).await;
         | 
| 89 | 
            -
                    let ruby = Ruby::get().unwrap();
         | 
| 90 | 
            -
                    let server = ruby.get_inner(&ITSI_SERVER);
         | 
| 91 | 
            -
                    let response: Result<(u16, HashMap<String, String>, Value)> =
         | 
| 92 | 
            -
                        server.funcall("call", (app, request));
         | 
| 93 | 
            -
                    if let Ok((status, headers_raw, body)) = response {
         | 
| 94 | 
            -
                        let mut body_buf = vec![];
         | 
| 95 | 
            -
                        for body_chunk in body.enumeratorize("each", ()) {
         | 
| 96 | 
            -
                            body_buf.push(body_chunk.unwrap().to_string())
         | 
| 97 | 
            -
                        }
         | 
| 98 | 
            -
                        body.check_funcall::<_, _, Value>("close", ());
         | 
| 99 | 
            -
                        let boxed_body = BoxBody::new(body_buf.join(""));
         | 
| 100 | 
            -
                        let mut response = Response::new(boxed_body);
         | 
| 101 | 
            -
                        let mut headers = HeaderMap::new();
         | 
| 102 | 
            -
                        headers_raw.into_iter().for_each(|(key, value)| {
         | 
| 103 | 
            -
                            let header_name: HeaderName = key.parse().unwrap();
         | 
| 104 | 
            -
                            headers.insert(header_name, value.parse().unwrap());
         | 
| 105 | 
            -
                        });
         | 
| 106 | 
            -
                        *response.headers_mut() = headers;
         | 
| 107 | 
            -
                        *response.status_mut() = StatusCode::from_u16(status).unwrap();
         | 
| 108 | 
            -
                        Ok(response)
         | 
| 109 | 
            -
                    } else {
         | 
| 110 | 
            -
                        let mut response = Response::new(BoxBody::new(Empty::new()));
         | 
| 111 | 
            -
                        *response.status_mut() = StatusCode::BAD_REQUEST;
         | 
| 112 | 
            -
                        Ok(response)
         | 
| 113 | 
            -
                    }
         | 
| 114 | 
            -
                }
         | 
| 115 | 
            -
             | 
| 116 | 
            -
                pub fn start(&self) {
         | 
| 117 | 
            -
                    let mut builder: RuntimeBuilder = RuntimeBuilder::new_current_thread();
         | 
| 118 | 
            -
                    let runtime = builder
         | 
| 119 | 
            -
                        .thread_name("itsi-server-accept-loop")
         | 
| 120 | 
            -
                        .thread_stack_size(3 * 1024 * 1024)
         | 
| 121 | 
            -
                        .enable_io()
         | 
| 122 | 
            -
                        .enable_time()
         | 
| 123 | 
            -
                        .build()
         | 
| 124 | 
            -
                        .expect("Failed to build Tokio runtime");
         | 
| 125 | 
            -
             | 
| 126 | 
            -
                    runtime.block_on(async {
         | 
| 127 | 
            -
                        let server = Arc::new(Builder::new(TokioExecutor::new()));
         | 
| 128 | 
            -
                        let listeners: Vec<Listener> = self
         | 
| 129 | 
            -
                            .binds
         | 
| 130 | 
            -
                            .lock()
         | 
| 131 | 
            -
                            .iter()
         | 
| 132 | 
            -
                            .cloned()
         | 
| 133 | 
            -
                            .map(Listener::from)
         | 
| 134 | 
            -
                            .collect::<Vec<_>>();
         | 
| 135 | 
            -
             | 
| 136 | 
            -
                        let mut set = JoinSet::new();
         | 
| 137 | 
            -
             | 
| 138 | 
            -
                        for listener in listeners {
         | 
| 139 | 
            -
                            let app = self.app;
         | 
| 140 | 
            -
                            let server_clone = server.clone();
         | 
| 141 | 
            -
                            let listener_clone = Arc::new(listener);
         | 
| 142 | 
            -
                            let script_name = self.script_name.clone();
         | 
| 143 | 
            -
             | 
| 144 | 
            -
                            set.spawn(async move {
         | 
| 145 | 
            -
                                loop {
         | 
| 146 | 
            -
                                    let server = server_clone.clone();
         | 
| 147 | 
            -
                                    let listener = listener_clone.clone();
         | 
| 148 | 
            -
                                    let script_name = script_name.clone();
         | 
| 149 | 
            -
                                    let (stream, addr) = match listener.accept().await {
         | 
| 150 | 
            -
                                        Ok(stream) => stream,
         | 
| 151 | 
            -
                                        Err(e) => {
         | 
| 152 | 
            -
                                            error!("Failed to accept connection: {:?}", e);
         | 
| 153 | 
            -
                                            continue;
         | 
| 154 | 
            -
                                        }
         | 
| 155 | 
            -
                                    };
         | 
| 156 | 
            -
             | 
| 157 | 
            -
                                    tokio::spawn(async move {
         | 
| 158 | 
            -
                                        if let Err(e) = server
         | 
| 159 | 
            -
                                            .serve_connection_with_upgrades(
         | 
| 160 | 
            -
                                                stream,
         | 
| 161 | 
            -
                                                service_fn(move |hyper_request: Request<Incoming>| {
         | 
| 162 | 
            -
                                                    Server::process_request(
         | 
| 163 | 
            -
                                                        hyper_request,
         | 
| 164 | 
            -
                                                        app,
         | 
| 165 | 
            -
                                                        script_name.clone(),
         | 
| 166 | 
            -
                                                        listener.clone(),
         | 
| 167 | 
            -
                                                        addr.clone(),
         | 
| 168 | 
            -
                                                    )
         | 
| 169 | 
            -
                                                }),
         | 
| 170 | 
            -
                                            )
         | 
| 171 | 
            -
                                            .await
         | 
| 172 | 
            -
                                        {
         | 
| 173 | 
            -
                                            info!("Closed connection due to: {:?}", e);
         | 
| 174 | 
            -
                                        }
         | 
| 175 | 
            -
                                    });
         | 
| 176 | 
            -
                                }
         | 
| 177 | 
            -
                            });
         | 
| 178 | 
            -
                        }
         | 
| 179 | 
            -
                        while let Some(_res) = set.join_next().await {}
         | 
| 180 | 
            -
                    })
         | 
| 181 | 
            -
                }
         | 
| 182 | 
            -
            }
         | 
| @@ -1,23 +0,0 @@ | |
| 1 | 
            -
            use itsi_error::ItsiError;
         | 
| 2 | 
            -
            use std::str::FromStr;
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            #[derive(Debug, Default, Clone)]
         | 
| 5 | 
            -
            pub enum TransferProtocol {
         | 
| 6 | 
            -
                #[default]
         | 
| 7 | 
            -
                Https,
         | 
| 8 | 
            -
                Http,
         | 
| 9 | 
            -
                Unix,
         | 
| 10 | 
            -
            }
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            impl FromStr for TransferProtocol {
         | 
| 13 | 
            -
                type Err = ItsiError;
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                fn from_str(s: &str) -> Result<Self, Self::Err> {
         | 
| 16 | 
            -
                    match s {
         | 
| 17 | 
            -
                        "http" => Ok(TransferProtocol::Http),
         | 
| 18 | 
            -
                        "https" => Ok(TransferProtocol::Https),
         | 
| 19 | 
            -
                        "unix" => Ok(TransferProtocol::Unix),
         | 
| 20 | 
            -
                        _ => Err(ItsiError::UnsupportedProtocol(s.to_string())),
         | 
| 21 | 
            -
                    }
         | 
| 22 | 
            -
                }
         | 
| 23 | 
            -
            }
         |