chore: standardize min SDK to ^3.9.0 and unify lints
Standardize package environments and lint configurations across the monorepo to ensure consistent analysis and modern Dart syntax support.
- Bump minimum Dart SDK constraint to ^3.9.0 across all packages
- Update mono_repo CI matrices to analyze uniformly against Dart 3.9.0
- Unify repository analysis options and lint rules (including global deprecation ignore handling)
- Apply modern code formatting required by the SDK bump
diff --git a/.github/workflows/compliance.yml b/.github/workflows/compliance.yml
index 3bda370..34038cf 100644
--- a/.github/workflows/compliance.yml
+++ b/.github/workflows/compliance.yml
@@ -21,7 +21,7 @@
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/_shelf_compliance;commands:command"
@@ -36,7 +36,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs__shelf_compliance_pub_upgrade
name: pkgs/_shelf_compliance; dart pub upgrade
run: dart pub upgrade
diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml
index 62367e5..5d25010 100644
--- a/.github/workflows/dart.yml
+++ b/.github/workflows/dart.yml
@@ -21,7 +21,7 @@
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:stable"
@@ -34,32 +34,41 @@
sdk: stable
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: mono_repo self validate
run: dart pub global activate mono_repo 6.6.3
- name: mono_repo self validate
run: dart pub global run mono_repo generate --validate
job_002:
- name: "analyze_and_format; linux; Dart 3.3.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_static; `dart analyze --fatal-infos .`"
+ name: "analyze_and_format; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart analyze --fatal-infos .`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static;commands:analyze"
+ key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:analyze"
restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static
- os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0
+ os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket
+ os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
os:ubuntu-latest;pub-cache-hosted
os:ubuntu-latest
- name: Setup Dart SDK
uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
with:
- sdk: "3.3.0"
+ sdk: "3.9.0"
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+ - id: pkgs_shelf_pub_upgrade
+ name: pkgs/shelf; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf
+ - name: "pkgs/shelf; dart analyze --fatal-infos ."
+ run: dart analyze --fatal-infos .
+ if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf
- id: pkgs_shelf_packages_handler_pub_upgrade
name: pkgs/shelf_packages_handler; dart pub upgrade
run: dart pub upgrade
@@ -87,6 +96,15 @@
run: dart analyze --fatal-infos .
if: "always() && steps.pkgs_shelf_router_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_router
+ - id: pkgs_shelf_router_generator_pub_upgrade
+ name: pkgs/shelf_router_generator; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf_router_generator
+ - name: "pkgs/shelf_router_generator; dart analyze --fatal-infos ."
+ run: dart analyze --fatal-infos .
+ if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf_router_generator
- id: pkgs_shelf_static_pub_upgrade
name: pkgs/shelf_static; dart pub upgrade
run: dart pub upgrade
@@ -96,27 +114,6 @@
run: dart analyze --fatal-infos .
if: "always() && steps.pkgs_shelf_static_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_static
- job_003:
- name: "analyze_and_format; linux; Dart 3.5.0; PKGS: pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart analyze --fatal-infos .`"
- runs-on: ubuntu-latest
- steps:
- - name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:analyze"
- restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket
- os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0
- os:ubuntu-latest;pub-cache-hosted
- os:ubuntu-latest
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.5.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- id: pkgs_shelf_test_handler_pub_upgrade
name: pkgs/shelf_test_handler; dart pub upgrade
run: dart pub upgrade
@@ -135,51 +132,12 @@
run: dart analyze --fatal-infos .
if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_web_socket
- job_004:
- name: "analyze_and_format; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_router_generator; `dart analyze --fatal-infos .`"
- runs-on: ubuntu-latest
- steps:
- - name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator;commands:analyze"
- restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator
- os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
- os:ubuntu-latest;pub-cache-hosted
- os:ubuntu-latest
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.9.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- - id: pkgs_shelf_pub_upgrade
- name: pkgs/shelf; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf
- - name: "pkgs/shelf; dart analyze --fatal-infos ."
- run: dart analyze --fatal-infos .
- if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf
- - id: pkgs_shelf_router_generator_pub_upgrade
- name: pkgs/shelf_router_generator; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf_router_generator
- - name: "pkgs/shelf_router_generator; dart analyze --fatal-infos ."
- run: dart analyze --fatal-infos .
- if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf_router_generator
- job_005:
+ job_003:
name: "analyze_and_format; linux; Dart dev; PKGS: pkgs/_shelf_compliance, pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart analyze --fatal-infos .`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/_shelf_compliance-pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:analyze"
@@ -194,7 +152,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs__shelf_compliance_pub_upgrade
name: pkgs/_shelf_compliance; dart pub upgrade
run: dart pub upgrade
@@ -276,12 +234,12 @@
run: dart analyze --fatal-infos .
if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_web_socket
- job_006:
+ job_004:
name: "analyze_and_format; linux; Dart dev; PKGS: pkgs/_shelf_compliance, pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart format --output=none --set-exit-if-changed .`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/_shelf_compliance-pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:format"
@@ -296,7 +254,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs__shelf_compliance_pub_upgrade
name: pkgs/_shelf_compliance; dart pub upgrade
run: dart pub upgrade
@@ -378,27 +336,80 @@
run: "dart format --output=none --set-exit-if-changed ."
if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_web_socket
- job_007:
- name: "unit_test; linux; Dart 3.3.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_static; `dart test --test-randomize-ordering-seed=random`"
+ job_005:
+ name: "unit_test; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static;commands:test_0"
+ key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_test_handler;commands:test_1"
restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static
- os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0
+ os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_test_handler
+ os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
os:ubuntu-latest;pub-cache-hosted
os:ubuntu-latest
- name: Setup Dart SDK
uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
with:
- sdk: "3.3.0"
+ sdk: "3.9.0"
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+ - id: pkgs_shelf_pub_upgrade
+ name: pkgs/shelf; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf
+ - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
+ run: "dart test --test-randomize-ordering-seed=random -p chrome"
+ if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf
+ - id: pkgs_shelf_test_handler_pub_upgrade
+ name: pkgs/shelf_test_handler; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf_test_handler
+ - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
+ run: "dart test --test-randomize-ordering-seed=random -p chrome"
+ if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf_test_handler
+ needs:
+ - job_001
+ - job_002
+ - job_003
+ - job_004
+ job_006:
+ name: "unit_test; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
+ runs-on: ubuntu-latest
+ steps:
+ - name: Cache Pub hosted dependencies
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
+ with:
+ path: "~/.pub-cache/hosted"
+ key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:test_0"
+ restore-keys: |
+ os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket
+ os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
+ os:ubuntu-latest;pub-cache-hosted
+ os:ubuntu-latest
+ - name: Setup Dart SDK
+ uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
+ with:
+ sdk: "3.9.0"
+ - id: checkout
+ name: Checkout repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+ - id: pkgs_shelf_pub_upgrade
+ name: pkgs/shelf; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf
+ - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random"
+ run: "dart test --test-randomize-ordering-seed=random"
+ if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf
- id: pkgs_shelf_packages_handler_pub_upgrade
name: pkgs/shelf_packages_handler; dart pub upgrade
run: dart pub upgrade
@@ -426,6 +437,15 @@
run: "dart test --test-randomize-ordering-seed=random"
if: "always() && steps.pkgs_shelf_router_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_router
+ - id: pkgs_shelf_router_generator_pub_upgrade
+ name: pkgs/shelf_router_generator; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf_router_generator
+ - name: "pkgs/shelf_router_generator; dart test --test-randomize-ordering-seed=random"
+ run: "dart test --test-randomize-ordering-seed=random"
+ if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf_router_generator
- id: pkgs_shelf_static_pub_upgrade
name: pkgs/shelf_static; dart pub upgrade
run: dart pub upgrade
@@ -435,71 +455,6 @@
run: "dart test --test-randomize-ordering-seed=random"
if: "always() && steps.pkgs_shelf_static_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_static
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_008:
- name: "unit_test; linux; Dart 3.5.0; PKG: pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
- runs-on: ubuntu-latest
- steps:
- - name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler;commands:test_1"
- restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler
- os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0
- os:ubuntu-latest;pub-cache-hosted
- os:ubuntu-latest
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.5.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- - id: pkgs_shelf_test_handler_pub_upgrade
- name: pkgs/shelf_test_handler; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf_test_handler
- - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
- run: "dart test --test-randomize-ordering-seed=random -p chrome"
- if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf_test_handler
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_009:
- name: "unit_test; linux; Dart 3.5.0; PKGS: pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
- runs-on: ubuntu-latest
- steps:
- - name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:test_0"
- restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket
- os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0
- os:ubuntu-latest;pub-cache-hosted
- os:ubuntu-latest
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.5.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- id: pkgs_shelf_test_handler_pub_upgrade
name: pkgs/shelf_test_handler; dart pub upgrade
run: dart pub upgrade
@@ -523,97 +478,12 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_010:
- name: "unit_test; linux; Dart 3.9.0; PKG: pkgs/shelf; `dart test --test-randomize-ordering-seed=random -p chrome`"
- runs-on: ubuntu-latest
- steps:
- - name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf;commands:test_1"
- restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf
- os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
- os:ubuntu-latest;pub-cache-hosted
- os:ubuntu-latest
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.9.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- - id: pkgs_shelf_pub_upgrade
- name: pkgs/shelf; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf
- - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
- run: "dart test --test-randomize-ordering-seed=random -p chrome"
- if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_011:
- name: "unit_test; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_router_generator; `dart test --test-randomize-ordering-seed=random`"
- runs-on: ubuntu-latest
- steps:
- - name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
- with:
- path: "~/.pub-cache/hosted"
- key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator;commands:test_0"
- restore-keys: |
- os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator
- os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
- os:ubuntu-latest;pub-cache-hosted
- os:ubuntu-latest
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.9.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- - id: pkgs_shelf_pub_upgrade
- name: pkgs/shelf; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf
- - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random"
- run: "dart test --test-randomize-ordering-seed=random"
- if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf
- - id: pkgs_shelf_router_generator_pub_upgrade
- name: pkgs/shelf_router_generator; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf_router_generator
- - name: "pkgs/shelf_router_generator; dart test --test-randomize-ordering-seed=random"
- run: "dart test --test-randomize-ordering-seed=random"
- if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf_router_generator
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_012:
+ job_007:
name: "unit_test; linux; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome -c dart2wasm`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf-pkgs/shelf_test_handler;commands:test_2"
@@ -628,7 +498,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_pub_upgrade
name: pkgs/shelf; dart pub upgrade
run: dart pub upgrade
@@ -652,14 +522,12 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_013:
+ job_008:
name: "unit_test; linux; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf-pkgs/shelf_test_handler;commands:test_1"
@@ -674,7 +542,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_pub_upgrade
name: pkgs/shelf; dart pub upgrade
run: dart pub upgrade
@@ -698,14 +566,12 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_014:
+ job_009:
name: "unit_test; linux; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:test_0"
@@ -720,7 +586,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_pub_upgrade
name: pkgs/shelf; dart pub upgrade
run: dart pub upgrade
@@ -798,14 +664,12 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_015:
+ job_010:
name: "unit_test; linux; Dart dev; PKG: pkgs/shelf_router_generator; `dart test --run-skipped -t presubmit-only`"
runs-on: ubuntu-latest
steps:
- name: Cache Pub hosted dependencies
- uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+ uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: "~/.pub-cache/hosted"
key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf_router_generator;commands:test_3"
@@ -820,7 +684,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_router_generator_pub_upgrade
name: pkgs/shelf_router_generator; dart pub upgrade
run: dart pub upgrade
@@ -835,19 +699,51 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_016:
- name: "unit_test; windows; Dart 3.3.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_static; `dart test --test-randomize-ordering-seed=random`"
+ job_011:
+ name: "unit_test; windows; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
runs-on: windows-latest
steps:
- name: Setup Dart SDK
uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
with:
- sdk: "3.3.0"
+ sdk: "3.9.0"
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+ - id: pkgs_shelf_pub_upgrade
+ name: pkgs/shelf; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf
+ - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
+ run: "dart test --test-randomize-ordering-seed=random -p chrome"
+ if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf
+ - id: pkgs_shelf_test_handler_pub_upgrade
+ name: pkgs/shelf_test_handler; dart pub upgrade
+ run: dart pub upgrade
+ if: "always() && steps.checkout.conclusion == 'success'"
+ working-directory: pkgs/shelf_test_handler
+ - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
+ run: "dart test --test-randomize-ordering-seed=random -p chrome"
+ if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
+ working-directory: pkgs/shelf_test_handler
+ needs:
+ - job_001
+ - job_002
+ - job_003
+ - job_004
+ job_012:
+ name: "unit_test; windows; Dart 3.9.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
+ runs-on: windows-latest
+ steps:
+ - name: Setup Dart SDK
+ uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
+ with:
+ sdk: "3.9.0"
+ - id: checkout
+ name: Checkout repository
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_packages_handler_pub_upgrade
name: pkgs/shelf_packages_handler; dart pub upgrade
run: dart pub upgrade
@@ -866,51 +762,6 @@
run: "dart test --test-randomize-ordering-seed=random"
if: "always() && steps.pkgs_shelf_static_pub_upgrade.conclusion == 'success'"
working-directory: pkgs/shelf_static
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_017:
- name: "unit_test; windows; Dart 3.5.0; PKG: pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
- runs-on: windows-latest
- steps:
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.5.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- - id: pkgs_shelf_test_handler_pub_upgrade
- name: pkgs/shelf_test_handler; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf_test_handler
- - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
- run: "dart test --test-randomize-ordering-seed=random -p chrome"
- if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf_test_handler
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_018:
- name: "unit_test; windows; Dart 3.5.0; PKGS: pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
- runs-on: windows-latest
- steps:
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.5.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- id: pkgs_shelf_test_handler_pub_upgrade
name: pkgs/shelf_test_handler; dart pub upgrade
run: dart pub upgrade
@@ -934,36 +785,7 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_019:
- name: "unit_test; windows; Dart 3.9.0; PKG: pkgs/shelf; `dart test --test-randomize-ordering-seed=random -p chrome`"
- runs-on: windows-latest
- steps:
- - name: Setup Dart SDK
- uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
- with:
- sdk: "3.9.0"
- - id: checkout
- name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
- - id: pkgs_shelf_pub_upgrade
- name: pkgs/shelf; dart pub upgrade
- run: dart pub upgrade
- if: "always() && steps.checkout.conclusion == 'success'"
- working-directory: pkgs/shelf
- - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
- run: "dart test --test-randomize-ordering-seed=random -p chrome"
- if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
- working-directory: pkgs/shelf
- needs:
- - job_001
- - job_002
- - job_003
- - job_004
- - job_005
- - job_006
- job_020:
+ job_013:
name: "unit_test; windows; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
runs-on: windows-latest
steps:
@@ -973,7 +795,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_pub_upgrade
name: pkgs/shelf; dart pub upgrade
run: dart pub upgrade
@@ -997,9 +819,7 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
- job_021:
+ job_014:
name: "unit_test; windows; Dart dev; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
runs-on: windows-latest
steps:
@@ -1009,7 +829,7 @@
sdk: dev
- id: checkout
name: Checkout repository
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- id: pkgs_shelf_packages_handler_pub_upgrade
name: pkgs/shelf_packages_handler; dart pub upgrade
run: dart pub upgrade
@@ -1051,5 +871,3 @@
- job_002
- job_003
- job_004
- - job_005
- - job_006
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 772ee38..bc03473 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -6,6 +6,7 @@
language:
strict-raw-types: true
errors:
+ deprecated_member_use: ignore
deprecated_member_use_from_same_package: ignore
linter:
diff --git a/pkgs/_shelf_compliance/lib/src/compliance_result.dart b/pkgs/_shelf_compliance/lib/src/compliance_result.dart
index f434dff..32f0ee0 100644
--- a/pkgs/_shelf_compliance/lib/src/compliance_result.dart
+++ b/pkgs/_shelf_compliance/lib/src/compliance_result.dart
@@ -2,6 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+// ignore_for_file: constant_identifier_names
+
class ComplianceResult {
final Map<String, dynamic> _json;
@@ -20,5 +22,4 @@
Map<String, dynamic> toJson() => _json;
}
-// ignore: constant_identifier_names
enum ResultVerdict { Pass, Fail, Warn, Skip, Error }
diff --git a/pkgs/shelf/mono_pkg.yaml b/pkgs/shelf/mono_pkg.yaml
index 9ae1f10..f7da38e 100644
--- a/pkgs/shelf/mono_pkg.yaml
+++ b/pkgs/shelf/mono_pkg.yaml
@@ -1,3 +1,4 @@
+# mono_repo config
sdk:
- pubspec
- dev
diff --git a/pkgs/shelf_packages_handler/CHANGELOG.md b/pkgs/shelf_packages_handler/CHANGELOG.md
index ade7747..d08cb14 100644
--- a/pkgs/shelf_packages_handler/CHANGELOG.md
+++ b/pkgs/shelf_packages_handler/CHANGELOG.md
@@ -1,6 +1,6 @@
## 3.0.3-wip
-* Require Dart `^3.3.0`.
+* Require Dart `^3.9.0`.
## 3.0.2
diff --git a/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart b/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart
index 2ffb091..71dc8d4 100644
--- a/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart
+++ b/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart
@@ -21,7 +21,7 @@
final Map<String, Uri>? _packageMap;
PackageConfigHandler({Map<String, Uri>? packageMap})
- : _packageMap = packageMap;
+ : _packageMap = packageMap;
/// The callback for handling a single request.
Future<Response> handleRequest(Request request) async {
@@ -39,14 +39,17 @@
packageUri = _packageMap[packageName];
} else {
final fakeResolvedUri = await Isolate.resolvePackageUri(
- Uri(scheme: 'package', path: '$packageName/'));
+ Uri(scheme: 'package', path: '$packageName/'),
+ );
packageUri = fakeResolvedUri;
}
final handler = packageUri == null
? (_) => Response.notFound('Package $packageName not found.')
- : createStaticHandler(p.fromUri(packageUri),
- serveFilesOutsidePath: true);
+ : createStaticHandler(
+ p.fromUri(packageUri),
+ serveFilesOutsidePath: true,
+ );
return handler;
});
diff --git a/pkgs/shelf_packages_handler/pubspec.yaml b/pkgs/shelf_packages_handler/pubspec.yaml
index 0d674ff..70041d6 100644
--- a/pkgs/shelf_packages_handler/pubspec.yaml
+++ b/pkgs/shelf_packages_handler/pubspec.yaml
@@ -9,7 +9,7 @@
- shelf
environment:
- sdk: ^3.3.0
+ sdk: ^3.9.0
dependencies:
path: ^1.8.0
diff --git a/pkgs/shelf_packages_handler/test/packages_handler_test.dart b/pkgs/shelf_packages_handler/test/packages_handler_test.dart
index 3b6bcc2..deecfd4 100644
--- a/pkgs/shelf_packages_handler/test/packages_handler_test.dart
+++ b/pkgs/shelf_packages_handler/test/packages_handler_test.dart
@@ -11,12 +11,14 @@
void main() {
late String dir;
setUp(() {
- dir =
- Directory.systemTemp.createTempSync('shelf_packages_handler_test').path;
+ dir = Directory.systemTemp
+ .createTempSync('shelf_packages_handler_test')
+ .path;
Directory(dir).createSync();
Directory('$dir/foo').createSync();
- File('$dir/foo/foo.dart')
- .writeAsStringSync("void main() => print('in foo');");
+ File(
+ '$dir/foo/foo.dart',
+ ).writeAsStringSync("void main() => print('in foo');");
});
tearDown(() {
@@ -27,44 +29,55 @@
test('defaults to the current method of package resolution', () async {
final handler = packagesHandler();
final request = Request(
- 'GET',
- Uri.parse('http://example.com/shelf_packages_handler/'
- 'shelf_packages_handler.dart'));
+ 'GET',
+ Uri.parse(
+ 'http://example.com/shelf_packages_handler/'
+ 'shelf_packages_handler.dart',
+ ),
+ );
final response = await handler(request);
expect(response.statusCode, equals(200));
expect(
- await response.readAsString(), contains('Handler packagesHandler'));
+ await response.readAsString(),
+ contains('Handler packagesHandler'),
+ );
});
group('with a package map', () {
late Handler handler;
setUp(() {
- handler = packagesHandler(packageMap: {
- 'foo': Uri.file('$dir/foo/'),
- });
+ handler = packagesHandler(packageMap: {'foo': Uri.file('$dir/foo/')});
});
test('looks up a real file', () async {
- final request =
- Request('GET', Uri.parse('http://example.com/foo/foo.dart'));
+ final request = Request(
+ 'GET',
+ Uri.parse('http://example.com/foo/foo.dart'),
+ );
final response = await handler(request);
expect(response.statusCode, equals(200));
expect(await response.readAsString(), contains('in foo'));
});
test('404s for a nonexistent package', () async {
- final request =
- Request('GET', Uri.parse('http://example.com/bar/foo.dart'));
+ final request = Request(
+ 'GET',
+ Uri.parse('http://example.com/bar/foo.dart'),
+ );
final response = await handler(request);
expect(response.statusCode, equals(404));
expect(
- await response.readAsString(), contains('Package bar not found'));
+ await response.readAsString(),
+ contains('Package bar not found'),
+ );
});
test('404s for a nonexistent file', () async {
- final request =
- Request('GET', Uri.parse('http://example.com/foo/bar.dart'));
+ final request = Request(
+ 'GET',
+ Uri.parse('http://example.com/foo/bar.dart'),
+ );
final response = await handler(request);
expect(response.statusCode, equals(404));
});
@@ -75,33 +88,46 @@
test('supports a directory at the root of the URL', () async {
final handler = packagesDirHandler();
final request = Request(
- 'GET',
- Uri.parse('http://example.com/packages/shelf_packages_handler/'
- 'shelf_packages_handler.dart'));
+ 'GET',
+ Uri.parse(
+ 'http://example.com/packages/shelf_packages_handler/'
+ 'shelf_packages_handler.dart',
+ ),
+ );
final response = await handler(request);
expect(response.statusCode, equals(200));
expect(
- await response.readAsString(), contains('Handler packagesHandler'));
+ await response.readAsString(),
+ contains('Handler packagesHandler'),
+ );
});
test('supports a directory deep in the URL', () async {
final handler = packagesDirHandler();
final request = Request(
- 'GET',
- Uri.parse('http://example.com/foo/bar/very/deep/packages/'
- 'shelf_packages_handler/shelf_packages_handler.dart'));
+ 'GET',
+ Uri.parse(
+ 'http://example.com/foo/bar/very/deep/packages/'
+ 'shelf_packages_handler/shelf_packages_handler.dart',
+ ),
+ );
final response = await handler(request);
expect(response.statusCode, equals(200));
expect(
- await response.readAsString(), contains('Handler packagesHandler'));
+ await response.readAsString(),
+ contains('Handler packagesHandler'),
+ );
});
test('404s for a URL without a packages directory', () async {
final handler = packagesDirHandler();
final request = Request(
- 'GET',
- Uri.parse('http://example.com/shelf_packages_handler/'
- 'shelf_packages_handler.dart'));
+ 'GET',
+ Uri.parse(
+ 'http://example.com/shelf_packages_handler/'
+ 'shelf_packages_handler.dart',
+ ),
+ );
final response = await handler(request);
expect(response.statusCode, equals(404));
});
@@ -109,9 +135,12 @@
test('404s for a non-existent file within a packages directory', () async {
final handler = packagesDirHandler();
final request = Request(
- 'GET',
- Uri.parse('http://example.com/packages/shelf_packages_handler/'
- 'non_existent.dart'));
+ 'GET',
+ Uri.parse(
+ 'http://example.com/packages/shelf_packages_handler/'
+ 'non_existent.dart',
+ ),
+ );
final response = await handler(request);
expect(response.statusCode, equals(404));
});
diff --git a/pkgs/shelf_proxy/CHANGELOG.md b/pkgs/shelf_proxy/CHANGELOG.md
index 37e518f..3e22882 100644
--- a/pkgs/shelf_proxy/CHANGELOG.md
+++ b/pkgs/shelf_proxy/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.6-wip
+
+* Require Dart `^3.9.0`.
+
## 1.0.5
* Correctly handle multiple `Cookie` headers in requests and `Set-Cookie`
diff --git a/pkgs/shelf_proxy/lib/shelf_proxy.dart b/pkgs/shelf_proxy/lib/shelf_proxy.dart
index 12f97f6..59a8ae3 100644
--- a/pkgs/shelf_proxy/lib/shelf_proxy.dart
+++ b/pkgs/shelf_proxy/lib/shelf_proxy.dart
@@ -47,15 +47,19 @@
// The Cookie header is special: multiple cookies are joined with a
// semicolon and a space, while other headers use a comma.
// See https://datatracker.ietf.org/doc/html/rfc6265#section-5.4
- clientRequest.headers[name] =
- values.join(name.toLowerCase() == 'cookie' ? '; ' : ', ');
+ clientRequest.headers[name] = values.join(
+ name.toLowerCase() == 'cookie' ? '; ' : ', ',
+ );
});
clientRequest.headers['Host'] = uri.authority;
// Add a Via header. See
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.45
- _addHeader(clientRequest.headers, 'via',
- '${serverRequest.protocolVersion} $proxyName');
+ _addHeader(
+ clientRequest.headers,
+ 'via',
+ '${serverRequest.protocolVersion} $proxyName',
+ );
serverRequest
.read()
@@ -65,13 +69,17 @@
.ignore();
final clientResponse = await nonNullClient.send(clientRequest);
final headers = clientResponse.headers;
- final headersAll =
- Map<String, List<String>>.from(clientResponse.headersSplitValues);
+ final headersAll = Map<String, List<String>>.from(
+ clientResponse.headersSplitValues,
+ );
// Add a Via header. See
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.45
- headersAll.update('via', (values) => [...values, '1.1 $proxyName'],
- ifAbsent: () => ['1.1 $proxyName']);
+ headersAll.update(
+ 'via',
+ (values) => [...values, '1.1 $proxyName'],
+ ifAbsent: () => ['1.1 $proxyName'],
+ );
// Remove the transfer-encoding since the body has already been decoded by
// [client].
@@ -86,8 +94,10 @@
// Add a Warning header. See
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.2
headersAll.update(
- 'warning', (values) => [...values, '214 $proxyName "GZIP decoded"'],
- ifAbsent: () => ['214 $proxyName "GZIP decoded"']);
+ 'warning',
+ (values) => [...values, '214 $proxyName "GZIP decoded"'],
+ ifAbsent: () => ['214 $proxyName "GZIP decoded"'],
+ );
}
// Make sure the Location header is pointing to the proxy server rather
@@ -96,15 +106,18 @@
final location = requestUrl.resolve(headers['location']!).toString();
if (p.url.isWithin(uri.toString(), location)) {
headersAll['location'] = [
- '/${p.url.relative(location, from: uri.toString())}'
+ '/${p.url.relative(location, from: uri.toString())}',
];
} else {
headersAll['location'] = [location];
}
}
- return Response(clientResponse.statusCode,
- body: clientResponse.stream, headers: headersAll);
+ return Response(
+ clientResponse.statusCode,
+ body: clientResponse.stream,
+ headers: headersAll,
+ );
};
}
diff --git a/pkgs/shelf_proxy/pubspec.yaml b/pkgs/shelf_proxy/pubspec.yaml
index 3fa2457..06d10aa 100644
--- a/pkgs/shelf_proxy/pubspec.yaml
+++ b/pkgs/shelf_proxy/pubspec.yaml
@@ -1,5 +1,5 @@
name: shelf_proxy
-version: 1.0.5
+version: 1.0.6-wip
description: A shelf handler for proxying HTTP requests to another server.
repository: https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_proxy
issue_tracker: https://github.com/dart-lang/shelf/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Ashelf_proxy
@@ -9,7 +9,7 @@
- shelf
environment:
- sdk: ^3.3.0
+ sdk: ^3.9.0
dependencies:
http: ^1.2.0
diff --git a/pkgs/shelf_proxy/test/shelf_proxy_test.dart b/pkgs/shelf_proxy/test/shelf_proxy_test.dart
index 5f3ceaa..c792988 100644
--- a/pkgs/shelf_proxy/test/shelf_proxy_test.dart
+++ b/pkgs/shelf_proxy/test/shelf_proxy_test.dart
@@ -41,16 +41,21 @@
test('joins multiple request cookies with a semicolon', () async {
final client = MockClient((request) {
- expect(request.headers,
- containsPair('cookie', 'cookie1=value1; cookie2=value2'));
+ expect(
+ request.headers,
+ containsPair('cookie', 'cookie1=value1; cookie2=value2'),
+ );
return Future.value(http.Response(':)', 200));
});
final handler = proxyHandler('http://dartlang.org', client: client);
- final request =
- shelf.Request('GET', Uri.parse('http://localhost/'), headers: {
- 'cookie': ['cookie1=value1', 'cookie2=value2']
- });
+ final request = shelf.Request(
+ 'GET',
+ Uri.parse('http://localhost/'),
+ headers: {
+ 'cookie': ['cookie1=value1', 'cookie2=value2'],
+ },
+ );
await handler(request);
});
@@ -71,8 +76,10 @@
});
test('forwards response headers', () async {
- await createProxy((request) =>
- shelf.Response.ok(':)', headers: {'foo': 'bar', 'accept': '*/*'}));
+ await createProxy(
+ (request) =>
+ shelf.Response.ok(':)', headers: {'foo': 'bar', 'accept': '*/*'}),
+ );
final response = await get();
@@ -80,27 +87,32 @@
expect(response.headers, containsPair('accept', '*/*'));
});
- test('preserves multiple Set-Cookie headers in response, including dates',
- () async {
- await createProxy((request) {
- return shelf.Response.ok(':)', headers: {
- 'set-cookie': [
- 'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
- 'cookie2=value2'
- ],
+ test(
+ 'preserves multiple Set-Cookie headers in response, including dates',
+ () async {
+ await createProxy((request) {
+ return shelf.Response.ok(
+ ':)',
+ headers: {
+ 'set-cookie': [
+ 'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
+ 'cookie2=value2',
+ ],
+ },
+ );
});
- });
- final client = HttpClient();
- final request = await client.getUrl(proxyUri);
- final response = await request.close();
+ final client = HttpClient();
+ final request = await client.getUrl(proxyUri);
+ final response = await request.close();
- final setCookies = response.headers['set-cookie'];
- expect(setCookies, [
- 'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
- 'cookie2=value2'
- ]);
- });
+ final setCookies = response.headers['set-cookie'];
+ expect(setCookies, [
+ 'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
+ 'cookie2=value2',
+ ]);
+ },
+ );
test('forwards response body', () async {
await createProxy((request) => shelf.Response.ok('hello, client'));
@@ -130,8 +142,10 @@
test("adds to a request's existing Via header", () async {
await createProxy((request) {
- expect(request.headers,
- containsPair('via', '1.0 something, 1.1 shelf_proxy'));
+ expect(
+ request.headers,
+ containsPair('via', '1.0 something, 1.1 shelf_proxy'),
+ );
return shelf.Response.ok(':)');
});
@@ -146,65 +160,88 @@
});
test("adds to a response's existing Via header", () async {
- await createProxy((request) =>
- shelf.Response.ok(':)', headers: {'via': '1.0 something'}));
+ await createProxy(
+ (request) => shelf.Response.ok(':)', headers: {'via': '1.0 something'}),
+ );
final response = await get();
- expect(response.headers,
- containsPair('via', '1.0 something, 1.1 shelf_proxy'));
+ expect(
+ response.headers,
+ containsPair('via', '1.0 something, 1.1 shelf_proxy'),
+ );
});
});
group('redirects', () {
test("doesn't modify a Location for a foreign server", () async {
await createProxy(
- (request) => shelf.Response.found('http://dartlang.org'));
+ (request) => shelf.Response.found('http://dartlang.org'),
+ );
final response = await get();
expect(response.headers, containsPair('location', 'http://dartlang.org'));
});
test('relativizes a reachable root-relative Location', () async {
- await createProxy((request) => shelf.Response.found('/foo/bar'),
- targetPath: '/foo');
+ await createProxy(
+ (request) => shelf.Response.found('/foo/bar'),
+ targetPath: '/foo',
+ );
final response = await get();
expect(response.headers, containsPair('location', '/bar'));
});
test('absolutizes an unreachable root-relative Location', () async {
- await createProxy((request) => shelf.Response.found('/baz'),
- targetPath: '/foo');
+ await createProxy(
+ (request) => shelf.Response.found('/baz'),
+ targetPath: '/foo',
+ );
final response = await get();
- expect(response.headers,
- containsPair('location', targetUri.resolve('/baz').toString()));
+ expect(
+ response.headers,
+ containsPair('location', targetUri.resolve('/baz').toString()),
+ );
});
});
test('removes a transfer-encoding header', () async {
- final handler = mockHandler((request) =>
- http.Response('', 200, headers: {'transfer-encoding': 'chunked'}));
+ final handler = mockHandler(
+ (request) =>
+ http.Response('', 200, headers: {'transfer-encoding': 'chunked'}),
+ );
- final response =
- await handler(shelf.Request('GET', Uri.parse('http://localhost/')));
+ final response = await handler(
+ shelf.Request('GET', Uri.parse('http://localhost/')),
+ );
expect(response.headers, isNot(contains('transfer-encoding')));
});
- test('removes content-length and content-encoding for a gzipped response',
- () async {
- final handler = mockHandler((request) => http.Response('', 200,
- headers: {'content-encoding': 'gzip', 'content-length': '1234'}));
+ test(
+ 'removes content-length and content-encoding for a gzipped response',
+ () async {
+ final handler = mockHandler(
+ (request) => http.Response(
+ '',
+ 200,
+ headers: {'content-encoding': 'gzip', 'content-length': '1234'},
+ ),
+ );
- final response =
- await handler(shelf.Request('GET', Uri.parse('http://localhost/')));
+ final response = await handler(
+ shelf.Request('GET', Uri.parse('http://localhost/')),
+ );
- expect(response.headers, isNot(contains('content-encoding')));
- expect(response.headers, isNot(contains('content-length')));
- expect(response.headers,
- containsPair('warning', '214 shelf_proxy "GZIP decoded"'));
- });
+ expect(response.headers, isNot(contains('content-encoding')));
+ expect(response.headers, isNot(contains('content-length')));
+ expect(
+ response.headers,
+ containsPair('warning', '214 shelf_proxy "GZIP decoded"'),
+ );
+ },
+ );
}
/// Creates a proxy server proxying to a server running [handler].
@@ -216,8 +253,10 @@
final targetServer = await shelf_io.serve(handler, 'localhost', 0);
targetUri = Uri.parse('http://localhost:${targetServer.port}');
if (targetPath != null) targetUri = targetUri.resolve(targetPath);
- final proxyServerHandler =
- expectAsync1(proxyHandler(targetUri), reason: 'proxy server handler');
+ final proxyServerHandler = expectAsync1(
+ proxyHandler(targetUri),
+ reason: 'proxy server handler',
+ );
final proxyServer = await shelf_io.serve(proxyServerHandler, 'localhost', 0);
proxyUri = Uri.parse('http://localhost:${proxyServer.port}');
@@ -231,7 +270,8 @@
/// Creates a [shelf.Handler] that's backed by a [MockClient] running
/// [callback].
shelf.Handler mockHandler(
- FutureOr<http.Response> Function(http.Request) callback) {
+ FutureOr<http.Response> Function(http.Request) callback,
+) {
final client = MockClient((request) async => await callback(request));
return proxyHandler('http://dartlang.org', client: client);
}
diff --git a/pkgs/shelf_router/CHANGELOG.md b/pkgs/shelf_router/CHANGELOG.md
index e43718f..eaec2e6 100644
--- a/pkgs/shelf_router/CHANGELOG.md
+++ b/pkgs/shelf_router/CHANGELOG.md
@@ -1,7 +1,7 @@
## 1.1.5-wip
* Fixed automatic `HEAD` request handling to not modify content-length.
-* Require Dart `^3.3.0`.
+* Require Dart `^3.9.0`.
## 1.1.4
diff --git a/pkgs/shelf_router/benchmark/router_benchmark.dart b/pkgs/shelf_router/benchmark/router_benchmark.dart
index 54e0d83..63944ea 100644
--- a/pkgs/shelf_router/benchmark/router_benchmark.dart
+++ b/pkgs/shelf_router/benchmark/router_benchmark.dart
@@ -17,9 +17,11 @@
// Creating request for the LAST route in the VERY LAST controller to
// trigger worst-case matching
request = Request(
- 'GET',
- Uri.parse(
- 'http://localhost/api/controller_${_controllers - 1}/resource/${_routesPerController - 1}/details'));
+ 'GET',
+ Uri.parse(
+ 'http://localhost/api/controller_${_controllers - 1}/resource/${_routesPerController - 1}/details',
+ ),
+ );
}
@override
@@ -41,9 +43,9 @@
// Creating request that does not match ANY of the routes
request = Request(
- 'GET',
- Uri.parse(
- 'http://localhost/api/controller_${_controllers - 1}/foo/bar'));
+ 'GET',
+ Uri.parse('http://localhost/api/controller_${_controllers - 1}/foo/bar'),
+ );
}
@override
diff --git a/pkgs/shelf_router/lib/src/route.dart b/pkgs/shelf_router/lib/src/route.dart
index 419a741..30b5d2a 100644
--- a/pkgs/shelf_router/lib/src/route.dart
+++ b/pkgs/shelf_router/lib/src/route.dart
@@ -86,7 +86,5 @@
const Route.trace(this.route) : verb = 'TRACE';
/// Route `MOUNT` requests matching [route] to annotated method.
- const Route.mount(String prefix)
- : verb = r'$mount',
- route = prefix;
+ const Route.mount(String prefix) : verb = r'$mount', route = prefix;
}
diff --git a/pkgs/shelf_router/lib/src/router.dart b/pkgs/shelf_router/lib/src/router.dart
index 8ba3c12..3c1d03e 100644
--- a/pkgs/shelf_router/lib/src/router.dart
+++ b/pkgs/shelf_router/lib/src/router.dart
@@ -60,14 +60,14 @@
/// Middleware to remove body from response for HEAD requests.
Handler _removeBody(Handler handler) => (request) {
- Response processResponse(Response r) => r.change(body: const <int>[]);
+ Response processResponse(Response r) => r.change(body: const <int>[]);
- final response = handler(request);
- if (response is Future<Response>) {
- return response.then(processResponse);
- }
- return processResponse(response);
- };
+ final response = handler(request);
+ if (response is Future<Response>) {
+ return response.then(processResponse);
+ }
+ return processResponse(response);
+};
/// A shelf [Router] routes requests to handlers based on HTTP verb and route
/// pattern.
@@ -121,7 +121,7 @@
/// The [notFoundHandler] will be invoked for requests where no matching route
/// was found. By default, a simple [Response.notFound] will be used instead.
Router({Handler notFoundHandler = _defaultNotFound})
- : _notFoundHandler = notFoundHandler;
+ : _notFoundHandler = notFoundHandler;
/// Add [handler] for [verb] requests to [route].
///
diff --git a/pkgs/shelf_router/lib/src/router_entry.dart b/pkgs/shelf_router/lib/src/router_entry.dart
index d92f4d7..98907fa 100644
--- a/pkgs/shelf_router/lib/src/router_entry.dart
+++ b/pkgs/shelf_router/lib/src/router_entry.dart
@@ -50,8 +50,15 @@
/// List of parameter names in the route pattern.
List<String> get params => _params.toList(); // exposed for using generator.
- RouterEntry._(this.verb, this.route, this._handler, this._middleware,
- this._routePattern, this._params, this.trieIndex);
+ RouterEntry._(
+ this.verb,
+ this.route,
+ this._handler,
+ this._middleware,
+ this._routePattern,
+ this._params,
+ this.trieIndex,
+ );
factory RouterEntry(
String verb,
@@ -64,7 +71,10 @@
if (!route.startsWith('/')) {
throw ArgumentError.value(
- route, 'route', 'expected route to start with a slash');
+ route,
+ 'route',
+ 'expected route to start with a slash',
+ );
}
final params = <String>[];
@@ -75,7 +85,10 @@
params.add(m[2]!);
if (m[3] != null && !_isNoCapture(m[3]!)) {
throw ArgumentError.value(
- route, 'route', 'expression for "${m[2]}" is capturing');
+ route,
+ 'route',
+ 'expression for "${m[2]}" is capturing',
+ );
}
pattern += '(${m[3] ?? r'[^/]+'})';
}
@@ -83,7 +96,14 @@
final routePattern = RegExp('^$pattern\$');
return RouterEntry._(
- verb, route, handler, middleware, routePattern, params, trieIndex);
+ verb,
+ route,
+ handler,
+ middleware,
+ routePattern,
+ params,
+ trieIndex,
+ );
}
/// Returns a map from parameter name to value, if the path matches the
@@ -113,9 +133,10 @@
return await _handler(request) as Response;
}
return await Function.apply(_handler, [
- request,
- ..._params.map((n) => params[n]),
- ]) as Response;
+ request,
+ ..._params.map((n) => params[n]),
+ ])
+ as Response;
})(request);
}
}
diff --git a/pkgs/shelf_router/lib/src/trie.dart b/pkgs/shelf_router/lib/src/trie.dart
index 9e292fe..bc7b33b 100644
--- a/pkgs/shelf_router/lib/src/trie.dart
+++ b/pkgs/shelf_router/lib/src/trie.dart
@@ -75,12 +75,15 @@
// segment. This works correctly for both partial segments (e.g. `image_`
// from `/files/image_<id>.png`) and for full segments that are just before
// a parameter (e.g. the empty segment from `/users/<id>`).
- final segmentsToTraverse =
- (paramIndex != -1) ? segments.take(segments.length - 1) : segments;
+ final segmentsToTraverse = (paramIndex != -1)
+ ? segments.take(segments.length - 1)
+ : segments;
for (final segment in segmentsToTraverse) {
- currentNode =
- currentNode.staticChildren.putIfAbsent(segment, _TrieNode.new);
+ currentNode = currentNode.staticChildren.putIfAbsent(
+ segment,
+ _TrieNode.new,
+ );
}
// Add the entry to the deepest FULLY static node we reached.
diff --git a/pkgs/shelf_router/pubspec.yaml b/pkgs/shelf_router/pubspec.yaml
index 4a72727..4141b21 100644
--- a/pkgs/shelf_router/pubspec.yaml
+++ b/pkgs/shelf_router/pubspec.yaml
@@ -11,7 +11,7 @@
- shelf
environment:
- sdk: ^3.3.0
+ sdk: ^3.9.0
dependencies:
http_methods: ^1.1.0
diff --git a/pkgs/shelf_router/test/route_entry_test.dart b/pkgs/shelf_router/test/route_entry_test.dart
index 1012f9a..9274a82 100644
--- a/pkgs/shelf_router/test/route_entry_test.dart
+++ b/pkgs/shelf_router/test/route_entry_test.dart
@@ -36,40 +36,36 @@
});
}
- testPattern('/hello', match: {
- '/hello': {},
- }, notMatch: [
- '/not-hello',
- '/',
- ]);
+ testPattern('/hello', match: {'/hello': {}}, notMatch: ['/not-hello', '/']);
- testPattern(r'/user/<user>/groups/<group|\d+>', match: {
- '/user/jonasfj/groups/42': {
- 'user': 'jonasfj',
- 'group': '42',
+ testPattern(
+ r'/user/<user>/groups/<group|\d+>',
+ match: {
+ '/user/jonasfj/groups/42': {'user': 'jonasfj', 'group': '42'},
+ '/user/jonasfj/groups/0': {'user': 'jonasfj', 'group': '0'},
+ '/user/123/groups/101': {'user': '123', 'group': '101'},
},
- '/user/jonasfj/groups/0': {
- 'user': 'jonasfj',
- 'group': '0',
- },
- '/user/123/groups/101': {
- 'user': '123',
- 'group': '101',
- },
- }, notMatch: [
- '/user/',
- '/user/jonasfj/groups/5-3',
- '/user/jonasfj/test/groups/5',
- '/user/jonasfjtest/groups/4/',
- '/user/jonasfj/groups/',
- '/not-hello',
- '/',
- ]);
+ notMatch: [
+ '/user/',
+ '/user/jonasfj/groups/5-3',
+ '/user/jonasfj/test/groups/5',
+ '/user/jonasfjtest/groups/4/',
+ '/user/jonasfj/groups/',
+ '/not-hello',
+ '/',
+ ],
+ );
test('non-capture regex only', () {
expect(
- () => RouterEntry('GET', '/users/<user|([^]*)>/info', () {}),
- throwsA(isArgumentError.having((e) => e.message, 'message',
- 'expression for "user" is capturing')));
+ () => RouterEntry('GET', '/users/<user|([^]*)>/info', () {}),
+ throwsA(
+ isArgumentError.having(
+ (e) => e.message,
+ 'message',
+ 'expression for "user" is capturing',
+ ),
+ ),
+ );
});
}
diff --git a/pkgs/shelf_router/test/router_test.dart b/pkgs/shelf_router/test/router_test.dart
index 50e8e71..fd8ca8e 100644
--- a/pkgs/shelf_router/test/router_test.dart
+++ b/pkgs/shelf_router/test/router_test.dart
@@ -99,8 +99,11 @@
test('params by arguments', () async {
var app = Router();
- app.get(r'/user/<user>/groups/<group|\d+>',
- (Request request, String user, String group) {
+ app.get(r'/user/<user>/groups/<group|\d+>', (
+ Request request,
+ String user,
+ String group,
+ ) {
return Response.ok('$user / $group');
});
@@ -149,10 +152,7 @@
);
var app = Router();
- app.mount(
- '/api/',
- middleware.addHandler(api.call),
- );
+ app.mount('/api/', middleware.addHandler(api.call));
server.mount(app.call);
@@ -195,9 +195,15 @@
server.mount(api.call);
expect(
- get('/hi'),
- throwsA(isA<http.ClientException>()
- .having((e) => e.message, 'message', contains('404: Not Found.'))));
+ get('/hi'),
+ throwsA(
+ isA<http.ClientException>().having(
+ (e) => e.message,
+ 'message',
+ contains('404: Not Found.'),
+ ),
+ ),
+ );
});
test('can invoke custom handler if no route matches', () {
diff --git a/pkgs/shelf_router/test/trie_test.dart b/pkgs/shelf_router/test/trie_test.dart
index bf79d74..c7b224f 100644
--- a/pkgs/shelf_router/test/trie_test.dart
+++ b/pkgs/shelf_router/test/trie_test.dart
@@ -32,8 +32,10 @@
test('stops parsing static prefix at first parameter', () async {
final router = Router();
- router.get('/<user>/details',
- (Request request, String user) => Response.ok('immediateParam-$user'));
+ router.get(
+ '/<user>/details',
+ (Request request, String user) => Response.ok('immediateParam-$user'),
+ );
var response = await get(router, '/alice/details');
expect(await response.readAsString(), 'immediateParam-alice');
@@ -41,24 +43,33 @@
test('handles mid-segment parameters properly', () async {
final router = Router();
- router.get('/files/image_<id>.png',
- (Request request, String id) => Response.ok('midSegmentParam-$id'));
+ router.get(
+ '/files/image_<id>.png',
+ (Request request, String id) => Response.ok('midSegmentParam-$id'),
+ );
var response = await get(router, '/files/image_123.png');
expect(await response.readAsString(), 'midSegmentParam-123');
});
- test('maintains registration priority regardless of route specificity',
- () async {
- final router = Router();
- router.get('/<any|.*>', (Request request) => Response.ok('catchAll'));
- router.get('/users/details', (Request request) => Response.ok('specific'));
- router.get(
- '/users/<id>', (Request request, String id) => Response.ok('wildcard'));
+ test(
+ 'maintains registration priority regardless of route specificity',
+ () async {
+ final router = Router();
+ router.get('/<any|.*>', (Request request) => Response.ok('catchAll'));
+ router.get(
+ '/users/details',
+ (Request request) => Response.ok('specific'),
+ );
+ router.get(
+ '/users/<id>',
+ (Request request, String id) => Response.ok('wildcard'),
+ );
- var response = await get(router, '/users/details');
- expect(await response.readAsString(), 'catchAll');
- });
+ var response = await get(router, '/users/details');
+ expect(await response.readAsString(), 'catchAll');
+ },
+ );
test('isolates unrelated branches', () async {
final router = Router();
diff --git a/pkgs/shelf_router_generator/CHANGELOG.md b/pkgs/shelf_router_generator/CHANGELOG.md
index 79f67bd..1677451 100644
--- a/pkgs/shelf_router_generator/CHANGELOG.md
+++ b/pkgs/shelf_router_generator/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 1.1.6-wip
+
## 1.1.5
* Support `analyzer` versions up to `14.x`.
diff --git a/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart b/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
index 87848c7..081a614 100644
--- a/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
+++ b/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
@@ -22,8 +22,8 @@
import 'package:http_methods/http_methods.dart' show isHttpMethod;
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf_router/shelf_router.dart' as shelf_router;
-import 'package:shelf_router/src/router_entry.dart' // ignore: implementation_imports
- show RouterEntry;
+// ignore: implementation_imports
+import 'package:shelf_router/src/router_entry.dart' show RouterEntry;
import 'package:source_gen/source_gen.dart' as g;
// Type checkers that we need later
diff --git a/pkgs/shelf_router_generator/pubspec.yaml b/pkgs/shelf_router_generator/pubspec.yaml
index cefc418..c88bbe7 100644
--- a/pkgs/shelf_router_generator/pubspec.yaml
+++ b/pkgs/shelf_router_generator/pubspec.yaml
@@ -1,5 +1,5 @@
name: shelf_router_generator
-version: 1.1.5
+version: 1.1.6-wip
description: >
A package:build-compatible builder for generating request routers for the
shelf web-framework based on source annotations.
diff --git a/pkgs/shelf_static/CHANGELOG.md b/pkgs/shelf_static/CHANGELOG.md
index e6f77bb..37b3ebc 100644
--- a/pkgs/shelf_static/CHANGELOG.md
+++ b/pkgs/shelf_static/CHANGELOG.md
@@ -7,6 +7,7 @@
* Add `generateETag` and `maxAge` parameters to `createStaticHandler` and
`createFileHandler` to support `ETag` and `Cache-Control` headers.
Default ETags are generated based on file size and modified time.
+* Require Dart `^3.9.0`.
## 1.1.3
diff --git a/pkgs/shelf_static/benchmark/static_benchmark.dart b/pkgs/shelf_static/benchmark/static_benchmark.dart
index 77ceb96..97a18d6 100644
--- a/pkgs/shelf_static/benchmark/static_benchmark.dart
+++ b/pkgs/shelf_static/benchmark/static_benchmark.dart
@@ -36,7 +36,8 @@
smallFileStopwatch.stop();
print('Total time: ${smallFileStopwatch.elapsedMilliseconds} ms');
print(
- 'Req/sec (small.txt): ${(iterationsSmall / smallFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}');
+ 'Req/sec (small.txt): ${(iterationsSmall / smallFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}',
+ );
print('Warming up large.txt...');
for (var i = 0; i < 10; i++) {
@@ -56,7 +57,8 @@
largeFileStopwatch.stop();
print('Total time: ${largeFileStopwatch.elapsedMilliseconds} ms');
print(
- 'Req/sec (large.txt): ${(iterationsLarge / largeFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}');
+ 'Req/sec (large.txt): ${(iterationsLarge / largeFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}',
+ );
} finally {
tempDir.deleteSync(recursive: true);
}
diff --git a/pkgs/shelf_static/example/example.dart b/pkgs/shelf_static/example/example.dart
index 1e37235..5b0ca0a 100644
--- a/pkgs/shelf_static/example/example.dart
+++ b/pkgs/shelf_static/example/example.dart
@@ -31,8 +31,10 @@
}
if (!FileSystemEntity.isFileSync('example/example.dart')) {
- throw StateError('Server expects to be started the '
- 'root of the project.');
+ throw StateError(
+ 'Server expects to be started the '
+ 'root of the project.',
+ );
}
var pipeline = const shelf.Pipeline();
@@ -45,8 +47,13 @@
defaultDoc = null;
}
- final handler = pipeline.addHandler(createStaticHandler('example/files',
- defaultDocument: defaultDoc, listDirectories: listDirectories));
+ final handler = pipeline.addHandler(
+ createStaticHandler(
+ 'example/files',
+ defaultDocument: defaultDoc,
+ listDirectories: listDirectories,
+ ),
+ );
io.serve(handler, 'localhost', port).then((server) {
print('Serving at http://${server.address.host}:${server.port}');
@@ -56,10 +63,13 @@
ArgParser _getParser() => ArgParser()
..addFlag('logging', abbr: 'l', defaultsTo: true)
..addOption('port', abbr: 'p', defaultsTo: '8080')
- ..addFlag('list-directories',
- abbr: 'f',
- negatable: false,
- help: 'List the files in the source directory instead of serving the '
- 'default document - "$_defaultDoc".');
+ ..addFlag(
+ 'list-directories',
+ abbr: 'f',
+ negatable: false,
+ help:
+ 'List the files in the source directory instead of serving the '
+ 'default document - "$_defaultDoc".',
+ );
const _defaultDoc = 'index.html';
diff --git a/pkgs/shelf_static/lib/src/directory_listing.dart b/pkgs/shelf_static/lib/src/directory_listing.dart
index 4698f9c..45bf98f 100644
--- a/pkgs/shelf_static/lib/src/directory_listing.dart
+++ b/pkgs/shelf_static/lib/src/directory_listing.dart
@@ -9,7 +9,8 @@
import 'package:path/path.dart' as path;
import 'package:shelf/shelf.dart';
-String _getHeader(String sanitizedHeading) => '''<!DOCTYPE html>
+String _getHeader(String sanitizedHeading) =>
+ '''<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
@@ -163,8 +164,11 @@
return '$y-$m-$d $h:$min';
}
-Future<Response> listDirectory(String fileSystemPath, String dirPath,
- {bool serveFilesOutsidePath = false}) async {
+Future<Response> listDirectory(
+ String fileSystemPath,
+ String dirPath, {
+ bool serveFilesOutsidePath = false,
+}) async {
if (!serveFilesOutsidePath) {
if (!path.isWithin(fileSystemPath, dirPath) &&
!path.equals(fileSystemPath, dirPath)) {
@@ -213,29 +217,29 @@
return e1.path.compareTo(e2.path);
});
- final entitiesWithStats = (await Future.wait(entities.map((e) async {
- if (!serveFilesOutsidePath) {
- try {
- final resolvedPath = await e.resolveSymbolicLinks();
- if (!path.isWithin(fileSystemPath, resolvedPath) &&
- !path.equals(fileSystemPath, resolvedPath)) {
+ final entitiesWithStats = (await Future.wait(
+ entities.map((e) async {
+ if (!serveFilesOutsidePath) {
+ try {
+ final resolvedPath = await e.resolveSymbolicLinks();
+ if (!path.isWithin(fileSystemPath, resolvedPath) &&
+ !path.equals(fileSystemPath, resolvedPath)) {
+ return null;
+ }
+ } catch (_) {
+ // On error resolving symlink, we can't determine if it's safe.
+ // So we don't list it.
return null;
}
- } catch (_) {
- // On error resolving symlink, we can't determine if it's safe.
- // So we don't list it.
- return null;
}
- }
- try {
- return (e, await e.stat());
- } catch (_) {
- // On error stating file, we can still list it, just without details.
- return (e, null);
- }
- })))
- .whereType<(FileSystemEntity, FileStat?)>()
- .toList();
+ try {
+ return (e, await e.stat());
+ } catch (_) {
+ // On error stating file, we can still list it, just without details.
+ return (e, null);
+ }
+ }),
+ )).whereType<(FileSystemEntity, FileStat?)>().toList();
for (final (entity, stat) in entitiesWithStats) {
final isDir = entity is Directory;
diff --git a/pkgs/shelf_static/lib/src/static_handler.dart b/pkgs/shelf_static/lib/src/static_handler.dart
index dcd7704..ca4d5bf 100644
--- a/pkgs/shelf_static/lib/src/static_handler.dart
+++ b/pkgs/shelf_static/lib/src/static_handler.dart
@@ -50,18 +50,22 @@
///
/// If [maxAge] is provided, it is used to set the `Cache-Control` header
/// with a `max-age` value in seconds.
-Handler createStaticHandler(String fileSystemPath,
- {bool serveFilesOutsidePath = false,
- String? defaultDocument,
- bool listDirectories = false,
- bool useHeaderBytesForContentType = false,
- MimeTypeResolver? contentTypeResolver,
- FutureOr<String?> Function(File, FileStat)? generateETag,
- Duration? maxAge}) {
+Handler createStaticHandler(
+ String fileSystemPath, {
+ bool serveFilesOutsidePath = false,
+ String? defaultDocument,
+ bool listDirectories = false,
+ bool useHeaderBytesForContentType = false,
+ MimeTypeResolver? contentTypeResolver,
+ FutureOr<String?> Function(File, FileStat)? generateETag,
+ Duration? maxAge,
+}) {
final rootDir = Directory(fileSystemPath);
if (!rootDir.existsSync()) {
- throw ArgumentError('A directory corresponding to fileSystemPath '
- '"$fileSystemPath" could not be found');
+ throw ArgumentError(
+ 'A directory corresponding to fileSystemPath '
+ '"$fileSystemPath" could not be found',
+ );
}
fileSystemPath = rootDir.resolveSymbolicLinksSync();
@@ -100,8 +104,11 @@
if (fileFound == null && listDirectories) {
final uri = request.requestedUri;
if (!uri.path.endsWith('/')) return _redirectToAddTrailingSlash(uri);
- return listDirectory(fileSystemPath, fsPath,
- serveFilesOutsidePath: serveFilesOutsidePath);
+ return listDirectory(
+ fileSystemPath,
+ fsPath,
+ serveFilesOutsidePath: serveFilesOutsidePath,
+ );
}
}
@@ -127,31 +134,41 @@
return _redirectToAddTrailingSlash(uri);
}
- return _handleFile(request, file, () async {
- if (useHeaderBytesForContentType) {
- final length =
- math.min(mimeResolver.magicNumbersMaxLength, await file.length());
+ return _handleFile(
+ request,
+ file,
+ () async {
+ if (useHeaderBytesForContentType) {
+ final length = math.min(
+ mimeResolver.magicNumbersMaxLength,
+ await file.length(),
+ );
- final byteSink = ByteAccumulatorSink();
+ final byteSink = ByteAccumulatorSink();
- await file.openRead(0, length).listen(byteSink.add).asFuture<void>();
+ await file.openRead(0, length).listen(byteSink.add).asFuture<void>();
- return mimeResolver.lookup(file.path, headerBytes: byteSink.bytes);
- } else {
- return mimeResolver.lookup(file.path);
- }
- }, generateETag: generateETag, maxAge: maxAge, fileStat: fileStat);
+ return mimeResolver.lookup(file.path, headerBytes: byteSink.bytes);
+ } else {
+ return mimeResolver.lookup(file.path);
+ }
+ },
+ generateETag: generateETag,
+ maxAge: maxAge,
+ fileStat: fileStat,
+ );
};
}
Response _redirectToAddTrailingSlash(Uri uri) {
final location = Uri(
- scheme: uri.scheme,
- userInfo: uri.userInfo,
- host: uri.host,
- port: uri.port,
- path: '${uri.path}/',
- query: uri.query);
+ scheme: uri.scheme,
+ userInfo: uri.userInfo,
+ host: uri.host,
+ port: uri.port,
+ path: '${uri.path}/',
+ query: uri.query,
+ );
return Response.movedPermanently(location.toString());
}
@@ -175,11 +192,13 @@
///
/// If [maxAge] is provided, it is used to set the `Cache-Control` header
/// with a `max-age` value in seconds.
-Handler createFileHandler(String path,
- {String? url,
- String? contentType,
- FutureOr<String?> Function(File, FileStat)? generateETag,
- Duration? maxAge}) {
+Handler createFileHandler(
+ String path, {
+ String? url,
+ String? contentType,
+ FutureOr<String?> Function(File, FileStat)? generateETag,
+ Duration? maxAge,
+}) {
final file = File(path);
if (!file.existsSync()) {
throw ArgumentError.value(path, 'path', 'does not exist.');
@@ -192,8 +211,13 @@
return (request) async {
if (request.url.path != url) return Response.notFound('Not Found');
- return _handleFile(request, file, () => mimeType,
- generateETag: generateETag, maxAge: maxAge);
+ return _handleFile(
+ request,
+ file,
+ () => mimeType,
+ generateETag: generateETag,
+ maxAge: maxAge,
+ );
};
}
@@ -203,10 +227,13 @@
/// indicates that it has the latest version of a file. Otherwise, it calls
/// [getContentType] and uses it to populate the Content-Type header.
Future<Response> _handleFile(
- Request request, File file, FutureOr<String?> Function() getContentType,
- {FutureOr<String?> Function(File, FileStat)? generateETag,
- Duration? maxAge,
- FileStat? fileStat}) async {
+ Request request,
+ File file,
+ FutureOr<String?> Function() getContentType, {
+ FutureOr<String?> Function(File, FileStat)? generateETag,
+ Duration? maxAge,
+ FileStat? fileStat,
+}) async {
final stat = fileStat ?? await file.stat();
final ifModifiedSince = request.ifModifiedSince;
final ifNoneMatch = request.headers[HttpHeaders.ifNoneMatchHeader];
@@ -216,7 +243,7 @@
final cacheHeaders = {
HttpHeaders.lastModifiedHeader: formatHttpDate(stat.modified),
- if (etag != null) HttpHeaders.etagHeader: etag,
+ HttpHeaders.etagHeader: ?etag,
if (maxAge != null)
HttpHeaders.cacheControlHeader: 'public, max-age=${maxAge.inSeconds}',
};
@@ -242,7 +269,7 @@
final headers = {
...cacheHeaders,
HttpHeaders.acceptRangesHeader: 'bytes',
- if (contentType != null) HttpHeaders.contentTypeHeader: contentType,
+ HttpHeaders.contentTypeHeader: ?contentType,
};
return _fileRangeResponse(request, file, stat.size, headers) ??
@@ -267,7 +294,11 @@
///
/// Ranges that end past the end of the file are truncated.
Response? _fileRangeResponse(
- Request request, File file, int actualLength, Map<String, Object> headers) {
+ Request request,
+ File file,
+ int actualLength,
+ Map<String, Object> headers,
+) {
final range = request.headers[HttpHeaders.rangeHeader];
if (range == null) return null;
final matches = _bytesMatcher.firstMatch(range);
@@ -297,10 +328,7 @@
end = actualLength - 1;
}
if (start >= actualLength) {
- return Response(
- HttpStatus.requestedRangeNotSatisfiable,
- headers: headers,
- );
+ return Response(HttpStatus.requestedRangeNotSatisfiable, headers: headers);
}
return Response(
HttpStatus.partialContent,
diff --git a/pkgs/shelf_static/lib/src/util.dart b/pkgs/shelf_static/lib/src/util.dart
index ba62177..3d83c6c 100644
--- a/pkgs/shelf_static/lib/src/util.dart
+++ b/pkgs/shelf_static/lib/src/util.dart
@@ -4,8 +4,7 @@
DateTime toSecondResolution(DateTime dt) {
if (dt.millisecond == 0 && dt.microsecond == 0) return dt;
- return dt.subtract(Duration(
- milliseconds: dt.millisecond,
- microseconds: dt.microsecond,
- ));
+ return dt.subtract(
+ Duration(milliseconds: dt.millisecond, microseconds: dt.microsecond),
+ );
}
diff --git a/pkgs/shelf_static/pubspec.yaml b/pkgs/shelf_static/pubspec.yaml
index 2ef67e6..7c0caa1 100644
--- a/pkgs/shelf_static/pubspec.yaml
+++ b/pkgs/shelf_static/pubspec.yaml
@@ -9,7 +9,7 @@
- shelf
environment:
- sdk: ^3.3.0
+ sdk: ^3.9.0
dependencies:
convert: ^3.0.0
diff --git a/pkgs/shelf_static/test/alternative_root_test.dart b/pkgs/shelf_static/test/alternative_root_test.dart
index 3a18e96..202eca3 100644
--- a/pkgs/shelf_static/test/alternative_root_test.dart
+++ b/pkgs/shelf_static/test/alternative_root_test.dart
@@ -15,15 +15,18 @@
await d.file('root.txt', 'root txt').create();
await d.dir('files', [
d.file('test.txt', 'test txt content'),
- d.file('with space.txt', 'with space content')
+ d.file('with space.txt', 'with space content'),
]).create();
});
test('access root file', () async {
final handler = createStaticHandler(d.sandbox);
- final response =
- await makeRequest(handler, '/static/root.txt', handlerPath: 'static');
+ final response = await makeRequest(
+ handler,
+ '/static/root.txt',
+ handlerPath: 'static',
+ );
expect(response.statusCode, HttpStatus.ok);
expect(response.contentLength, 8);
expect(response.readAsString(), completion('root txt'));
@@ -33,8 +36,10 @@
final handler = createStaticHandler(d.sandbox);
final response = await makeRequest(
- handler, '/static/files/with%20space.txt',
- handlerPath: 'static');
+ handler,
+ '/static/files/with%20space.txt',
+ handlerPath: 'static',
+ );
expect(response.statusCode, HttpStatus.ok);
expect(response.contentLength, 18);
expect(response.readAsString(), completion('with space content'));
@@ -44,8 +49,10 @@
final handler = createStaticHandler(d.sandbox);
final response = await makeRequest(
- handler, '/static/files/with%20space.txt',
- handlerPath: 'static');
+ handler,
+ '/static/files/with%20space.txt',
+ handlerPath: 'static',
+ );
expect(response.statusCode, HttpStatus.ok);
expect(response.contentLength, 18);
expect(response.readAsString(), completion('with space content'));
@@ -54,8 +61,11 @@
test('access file under directory', () async {
final handler = createStaticHandler(d.sandbox);
- final response = await makeRequest(handler, '/static/files/test.txt',
- handlerPath: 'static');
+ final response = await makeRequest(
+ handler,
+ '/static/files/test.txt',
+ handlerPath: 'static',
+ );
expect(response.statusCode, HttpStatus.ok);
expect(response.contentLength, 16);
expect(response.readAsString(), completion('test txt content'));
@@ -64,8 +74,11 @@
test('file not found', () async {
final handler = createStaticHandler(d.sandbox);
- final response = await makeRequest(handler, '/static/not_here.txt',
- handlerPath: 'static');
+ final response = await makeRequest(
+ handler,
+ '/static/not_here.txt',
+ handlerPath: 'static',
+ );
expect(response.statusCode, HttpStatus.notFound);
});
}
diff --git a/pkgs/shelf_static/test/basic_file_test.dart b/pkgs/shelf_static/test/basic_file_test.dart
index bc86f98..d76ffd9 100644
--- a/pkgs/shelf_static/test/basic_file_test.dart
+++ b/pkgs/shelf_static/test/basic_file_test.dart
@@ -35,7 +35,7 @@
d.file('test.txt', 'test txt content'),
d.file('with space.txt', 'with space content'),
d.file('header_bytes_test_image', base64Decode(pngBytesContent)),
- d.file('header_bytes_test_webp', base64Decode(webpBytesContent))
+ d.file('header_bytes_test_webp', base64Decode(webpBytesContent)),
]).create();
});
@@ -109,11 +109,14 @@
final modified = File(rootPath).statSync().modified.toUtc();
final headers = {
- HttpHeaders.ifModifiedSinceHeader: formatHttpDate(modified)
+ HttpHeaders.ifModifiedSinceHeader: formatHttpDate(modified),
};
- final response =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response.statusCode, HttpStatus.notModified);
expect(response.contentLength, 0);
});
@@ -125,12 +128,16 @@
final modified = File(rootPath).statSync().modified.toUtc();
final headers = {
- HttpHeaders.ifModifiedSinceHeader:
- formatHttpDate(modified.subtract(const Duration(seconds: 1)))
+ HttpHeaders.ifModifiedSinceHeader: formatHttpDate(
+ modified.subtract(const Duration(seconds: 1)),
+ ),
};
- final response =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response.statusCode, HttpStatus.ok);
expect(response.lastModified, atSameTimeToSecond(modified));
});
@@ -142,12 +149,16 @@
final modified = File(rootPath).statSync().modified.toUtc();
final headers = {
- HttpHeaders.ifModifiedSinceHeader:
- formatHttpDate(modified.add(const Duration(seconds: 1)))
+ HttpHeaders.ifModifiedSinceHeader: formatHttpDate(
+ modified.add(const Duration(seconds: 1)),
+ ),
};
- final response =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response.statusCode, HttpStatus.notModified);
expect(response.contentLength, 0);
});
@@ -169,15 +180,21 @@
File(rootPath).writeAsStringSync('updated root txt');
final headers = {
- HttpHeaders.ifModifiedSinceHeader:
- formatHttpDate(originalModificationDate)
+ HttpHeaders.ifModifiedSinceHeader: formatHttpDate(
+ originalModificationDate,
+ ),
};
- final response2 =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response2 = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response2.statusCode, HttpStatus.ok);
- expect(response2.lastModified!.millisecondsSinceEpoch,
- greaterThan(originalModificationDate.millisecondsSinceEpoch));
+ expect(
+ response2.lastModified!.millisecondsSinceEpoch,
+ greaterThan(originalModificationDate.millisecondsSinceEpoch),
+ );
});
});
@@ -191,8 +208,11 @@
final headers = {HttpHeaders.ifNoneMatchHeader: etag!};
- final response2 =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response2 = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response2.statusCode, HttpStatus.notModified);
expect(response2.contentLength, 0);
});
@@ -202,8 +222,11 @@
final headers = {HttpHeaders.ifNoneMatchHeader: '"not-the-right-etag"'};
- final response =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response.statusCode, HttpStatus.ok);
expect(response.contentLength, 8);
});
@@ -216,8 +239,11 @@
final headers = {HttpHeaders.ifNoneMatchHeader: '"other-etag", $etag'};
- final response2 =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response2 = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response2.statusCode, HttpStatus.notModified);
});
@@ -226,26 +252,36 @@
final headers = {HttpHeaders.ifNoneMatchHeader: '*'};
- final response =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response.statusCode, HttpStatus.notModified);
});
test('custom etag generator', () async {
- final handler = createStaticHandler(d.sandbox,
- generateETag: (file, stat) => 'custom');
+ final handler = createStaticHandler(
+ d.sandbox,
+ generateETag: (file, stat) => 'custom',
+ );
final headers = {HttpHeaders.ifNoneMatchHeader: 'custom'};
- final response =
- await makeRequest(handler, '/root.txt', headers: headers);
+ final response = await makeRequest(
+ handler,
+ '/root.txt',
+ headers: headers,
+ );
expect(response.statusCode, HttpStatus.notModified);
expect(response.headers[HttpHeaders.etagHeader], 'custom');
});
test('disable etag', () async {
- final handler =
- createStaticHandler(d.sandbox, generateETag: (file, stat) => null);
+ final handler = createStaticHandler(
+ d.sandbox,
+ generateETag: (file, stat) => null,
+ );
final response = await makeRequest(handler, '/root.txt');
expect(response.headers.keys, isNot(contains(HttpHeaders.etagHeader)));
@@ -254,20 +290,26 @@
group('cache control', () {
test('maxAge adds header', () async {
- final handler =
- createStaticHandler(d.sandbox, maxAge: const Duration(seconds: 3600));
+ final handler = createStaticHandler(
+ d.sandbox,
+ maxAge: const Duration(seconds: 3600),
+ );
final response = await makeRequest(handler, '/root.txt');
- expect(response.headers[HttpHeaders.cacheControlHeader],
- 'public, max-age=3600');
+ expect(
+ response.headers[HttpHeaders.cacheControlHeader],
+ 'public, max-age=3600',
+ );
});
test('no maxAge means no header', () async {
final handler = createStaticHandler(d.sandbox);
final response = await makeRequest(handler, '/root.txt');
- expect(response.headers.keys,
- isNot(contains(HttpHeaders.cacheControlHeader)));
+ expect(
+ response.headers.keys,
+ isNot(contains(HttpHeaders.cacheControlHeader)),
+ );
});
});
@@ -294,11 +336,15 @@
});
test('header_bytes_test_image should be image/png', () async {
- final handler =
- createStaticHandler(d.sandbox, useHeaderBytesForContentType: true);
+ final handler = createStaticHandler(
+ d.sandbox,
+ useHeaderBytesForContentType: true,
+ );
- final response =
- await makeRequest(handler, '/files/header_bytes_test_image');
+ final response = await makeRequest(
+ handler,
+ '/files/header_bytes_test_image',
+ );
expect(response.mimeType, 'image/png');
});
@@ -307,19 +353,24 @@
..addMagicNumber(
<int>[
0x52, 0x49, 0x46, 0x46, 0x00, 0x00, //
- 0x00, 0x00, 0x57, 0x45, 0x42, 0x50
+ 0x00, 0x00, 0x57, 0x45, 0x42, 0x50,
],
'image/webp',
mask: <int>[
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, //
- 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF
+ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
],
);
- final handler = createStaticHandler(d.sandbox,
- useHeaderBytesForContentType: true, contentTypeResolver: resolver);
+ final handler = createStaticHandler(
+ d.sandbox,
+ useHeaderBytesForContentType: true,
+ contentTypeResolver: resolver,
+ );
- final response =
- await makeRequest(handler, '/files/header_bytes_test_webp');
+ final response = await makeRequest(
+ handler,
+ '/files/header_bytes_test_webp',
+ );
expect(response.mimeType, 'image/webp');
});
});
diff --git a/pkgs/shelf_static/test/create_file_handler_test.dart b/pkgs/shelf_static/test/create_file_handler_test.dart
index 91c4c86..31f0899 100644
--- a/pkgs/shelf_static/test/create_file_handler_test.dart
+++ b/pkgs/shelf_static/test/create_file_handler_test.dart
@@ -32,8 +32,10 @@
});
test('serves the file contents under a custom URL', () async {
- final handler =
- createFileHandler(p.join(d.sandbox, 'file.txt'), url: 'foo/bar');
+ final handler = createFileHandler(
+ p.join(d.sandbox, 'file.txt'),
+ url: 'foo/bar',
+ );
final response = await makeRequest(handler, '/foo/bar');
expect(response.statusCode, equals(HttpStatus.ok));
expect(response.contentLength, equals(8));
@@ -41,8 +43,10 @@
});
test("serves a 404 if the custom URL isn't matched", () async {
- final handler =
- createFileHandler(p.join(d.sandbox, 'file.txt'), url: 'foo/bar');
+ final handler = createFileHandler(
+ p.join(d.sandbox, 'file.txt'),
+ url: 'foo/bar',
+ );
final response = await makeRequest(handler, '/file.txt');
expect(response.statusCode, equals(HttpStatus.notFound));
});
@@ -63,8 +67,10 @@
});
test('comes from the contentType parameter', () async {
- final handler = createFileHandler(p.join(d.sandbox, 'file.txt'),
- contentType: 'something/weird');
+ final handler = createFileHandler(
+ p.join(d.sandbox, 'file.txt'),
+ contentType: 'something/weird',
+ );
final response = await makeRequest(handler, '/file.txt');
expect(response.statusCode, equals(HttpStatus.ok));
expect(response.mimeType, equals('something/weird'));
@@ -98,10 +104,7 @@
'/file.txt',
headers: {'range': 'bytes=0-9'},
);
- expect(
- response.statusCode,
- equals(HttpStatus.partialContent),
- );
+ expect(response.statusCode, equals(HttpStatus.partialContent));
expect(
response.headers,
containsPair(HttpHeaders.acceptRangesHeader, 'bytes'),
@@ -125,10 +128,7 @@
response.headers,
containsPair(HttpHeaders.acceptRangesHeader, 'bytes'),
);
- expect(
- response.statusCode,
- HttpStatus.requestedRangeNotSatisfiable,
- );
+ expect(response.statusCode, HttpStatus.requestedRangeNotSatisfiable);
});
test('ignores invalid request with start > end', () async {
@@ -182,15 +182,20 @@
group('throws an ArgumentError for', () {
test("a file that doesn't exist", () {
- expect(() => createFileHandler(p.join(d.sandbox, 'nothing.txt')),
- throwsArgumentError);
+ expect(
+ () => createFileHandler(p.join(d.sandbox, 'nothing.txt')),
+ throwsArgumentError,
+ );
});
test('an absolute URL', () {
expect(
- () => createFileHandler(p.join(d.sandbox, 'nothing.txt'),
- url: '/foo/bar'),
- throwsArgumentError);
+ () => createFileHandler(
+ p.join(d.sandbox, 'nothing.txt'),
+ url: '/foo/bar',
+ ),
+ throwsArgumentError,
+ );
});
});
}
diff --git a/pkgs/shelf_static/test/default_document_test.dart b/pkgs/shelf_static/test/default_document_test.dart
index c6b5fb1..f83cf1b 100644
--- a/pkgs/shelf_static/test/default_document_test.dart
+++ b/pkgs/shelf_static/test/default_document_test.dart
@@ -16,7 +16,7 @@
await d.file('root.txt', 'root txt').create();
await d.dir('files', [
d.file('index.html', '<html><body>files</body></html>'),
- d.file('with space.txt', 'with space content')
+ d.file('with space.txt', 'with space content'),
]).create();
});
@@ -27,12 +27,14 @@
'/bar.txt',
'//bar.txt',
'//news/bar.txt',
- 'foo/../bar.txt'
+ 'foo/../bar.txt',
];
for (var val in invalidValues) {
- expect(() => createStaticHandler(d.sandbox, defaultDocument: val),
- throwsArgumentError);
+ expect(
+ () => createStaticHandler(d.sandbox, defaultDocument: val),
+ throwsArgumentError,
+ );
}
});
});
@@ -71,8 +73,10 @@
group('default document specified', () {
test('access "/index.html"', () async {
- final handler =
- createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+ final handler = createStaticHandler(
+ d.sandbox,
+ defaultDocument: 'index.html',
+ );
final response = await makeRequest(handler, '/index.html');
expect(response.statusCode, HttpStatus.ok);
@@ -82,8 +86,10 @@
});
test('access "/"', () async {
- final handler =
- createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+ final handler = createStaticHandler(
+ d.sandbox,
+ defaultDocument: 'index.html',
+ );
final response = await makeRequest(handler, '/');
expect(response.statusCode, HttpStatus.ok);
@@ -93,24 +99,32 @@
});
test('access "/files"', () async {
- final handler =
- createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+ final handler = createStaticHandler(
+ d.sandbox,
+ defaultDocument: 'index.html',
+ );
final response = await makeRequest(handler, '/files');
expect(response.statusCode, HttpStatus.movedPermanently);
- expect(response.headers,
- containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'));
+ expect(
+ response.headers,
+ containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'),
+ );
});
test('access "/files/" dir', () async {
- final handler =
- createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+ final handler = createStaticHandler(
+ d.sandbox,
+ defaultDocument: 'index.html',
+ );
final response = await makeRequest(handler, '/files/');
expect(response.statusCode, HttpStatus.ok);
expect(response.contentLength, 31);
- expect(response.readAsString(),
- completion('<html><body>files</body></html>'));
+ expect(
+ response.readAsString(),
+ completion('<html><body>files</body></html>'),
+ );
expect(response.mimeType, 'text/html');
});
});
diff --git a/pkgs/shelf_static/test/directory_listing_test.dart b/pkgs/shelf_static/test/directory_listing_test.dart
index 4846428..488b62f 100644
--- a/pkgs/shelf_static/test/directory_listing_test.dart
+++ b/pkgs/shelf_static/test/directory_listing_test.dart
@@ -41,8 +41,10 @@
final response = await makeRequest(handler, '/files');
expect(response.statusCode, HttpStatus.movedPermanently);
- expect(response.headers,
- containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'));
+ expect(
+ response.headers,
+ containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'),
+ );
});
test('access "/files/"', () async {
@@ -59,9 +61,12 @@
final response = await makeRequest(handler, '/files/empty subfolder');
expect(response.statusCode, HttpStatus.movedPermanently);
expect(
- response.headers,
- containsPair(HttpHeaders.locationHeader,
- 'http://localhost/files/empty%20subfolder/'));
+ response.headers,
+ containsPair(
+ HttpHeaders.locationHeader,
+ 'http://localhost/files/empty%20subfolder/',
+ ),
+ );
});
test('access "/files/empty subfolder/"', () async {
@@ -117,49 +122,59 @@
});
test('allows directory traversal if serveFilesOutsidePath is true', () async {
- final response = await listDirectory(d.sandbox, p.join(d.sandbox, '..'),
- serveFilesOutsidePath: true);
+ final response = await listDirectory(
+ d.sandbox,
+ p.join(d.sandbox, '..'),
+ serveFilesOutsidePath: true,
+ );
expect(response.statusCode, HttpStatus.ok);
});
- test('blocks directory traversal via symlinks in directory listings',
- () async {
- // Create a symlink pointing outside the `files` directory but within
- // sandbox.
- // The handler root is `files`, so `outside.txt` is outside root.
- await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
+ test(
+ 'blocks directory traversal via symlinks in directory listings',
+ () async {
+ // Create a symlink pointing outside the `files` directory but within
+ // sandbox.
+ // The handler root is `files`, so `outside.txt` is outside root.
+ await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
- // We serve from d.sandbox/files
- final filesDir = p.join(d.sandbox, 'files');
+ // We serve from d.sandbox/files
+ final filesDir = p.join(d.sandbox, 'files');
- // Create symlink inside `files` pointing to `outside`
- final linkPath = p.join(filesDir, 'symlink');
- Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
+ // Create symlink inside `files` pointing to `outside`
+ final linkPath = p.join(filesDir, 'symlink');
+ Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
- final response = await listDirectory(filesDir, filesDir);
- expect(response.statusCode, HttpStatus.ok);
+ final response = await listDirectory(filesDir, filesDir);
+ expect(response.statusCode, HttpStatus.ok);
- final html = await response.readAsString();
- // Symlink pointing outside should not be listed if
- // serveFilesOutsidePath is false
- expect(html, isNot(contains('symlink')));
- });
+ final html = await response.readAsString();
+ // Symlink pointing outside should not be listed if
+ // serveFilesOutsidePath is false
+ expect(html, isNot(contains('symlink')));
+ },
+ );
- test('allows symlinks out of root if serveFilesOutsidePath is true',
- () async {
- await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
- final filesDir = p.join(d.sandbox, 'files');
+ test(
+ 'allows symlinks out of root if serveFilesOutsidePath is true',
+ () async {
+ await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
+ final filesDir = p.join(d.sandbox, 'files');
- final linkPath = p.join(filesDir, 'symlink_out');
- Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
+ final linkPath = p.join(filesDir, 'symlink_out');
+ Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
- final response =
- await listDirectory(filesDir, filesDir, serveFilesOutsidePath: true);
- expect(response.statusCode, HttpStatus.ok);
+ final response = await listDirectory(
+ filesDir,
+ filesDir,
+ serveFilesOutsidePath: true,
+ );
+ expect(response.statusCode, HttpStatus.ok);
- final html = await response.readAsString();
- expect(html, contains('symlink_out'));
- });
+ final html = await response.readAsString();
+ expect(html, contains('symlink_out'));
+ },
+ );
test('gracefully ignores broken symlinks in directory listings', () async {
final filesDir = p.join(d.sandbox, 'files');
diff --git a/pkgs/shelf_static/test/get_handler_test.dart b/pkgs/shelf_static/test/get_handler_test.dart
index 5ca5c80..029f083 100644
--- a/pkgs/shelf_static/test/get_handler_test.dart
+++ b/pkgs/shelf_static/test/get_handler_test.dart
@@ -12,7 +12,7 @@
await d.file('root.txt', 'root txt').create();
await d.dir('files', [
d.file('test.txt', 'test txt content'),
- d.file('with space.txt', 'with space content')
+ d.file('with space.txt', 'with space content'),
]).create();
});
diff --git a/pkgs/shelf_static/test/sample_test.dart b/pkgs/shelf_static/test/sample_test.dart
index 0a0249a..6b2259e 100644
--- a/pkgs/shelf_static/test/sample_test.dart
+++ b/pkgs/shelf_static/test/sample_test.dart
@@ -65,7 +65,9 @@
}
Future<void> _expectCompletesWithBytes(
- Response response, List<int> expectedBytes) async {
+ Response response,
+ List<int> expectedBytes,
+) async {
final bytes = await response.read().toList();
final flatBytes = bytes.expand((e) => e);
expect(flatBytes, orderedEquals(expectedBytes));
diff --git a/pkgs/shelf_static/test/symbolic_link_test.dart b/pkgs/shelf_static/test/symbolic_link_test.dart
index 80ba32c..f82b1b0 100644
--- a/pkgs/shelf_static/test/symbolic_link_test.dart
+++ b/pkgs/shelf_static/test/symbolic_link_test.dart
@@ -17,9 +17,7 @@
void main() {
setUp(() async {
- await d.dir('originals', [
- d.file('index.html', '<html></html>'),
- ]).create();
+ await d.dir('originals', [d.file('index.html', '<html></html>')]).create();
await d.dir('alt_root').create();
@@ -30,8 +28,9 @@
Link(p.join(d.sandbox, 'link_dir')).createSync(originalsDir);
- Link(p.join(d.sandbox, 'alt_root', 'link_index.html'))
- .createSync(originalsIndex);
+ Link(
+ p.join(d.sandbox, 'alt_root', 'link_index.html'),
+ ).createSync(originalsIndex);
Link(p.join(d.sandbox, 'alt_root', 'link_dir')).createSync(originalsDir);
});
@@ -47,18 +46,14 @@
});
group('links under root dir', () {
- test(
- 'access sym linked file in real dir',
- () async {
- final handler = createStaticHandler(d.sandbox);
+ test('access sym linked file in real dir', () async {
+ final handler = createStaticHandler(d.sandbox);
- final response = await makeRequest(handler, '/link_index.html');
- expect(response.statusCode, HttpStatus.ok);
- expect(response.contentLength, 13);
- expect(response.readAsString(), completion('<html></html>'));
- },
- onPlatform: _skipSymlinksOnWindows,
- );
+ final response = await makeRequest(handler, '/link_index.html');
+ expect(response.statusCode, HttpStatus.ok);
+ expect(response.contentLength, 13);
+ expect(response.readAsString(), completion('<html></html>'));
+ }, onPlatform: _skipSymlinksOnWindows);
test('access file in sym linked dir', () async {
final handler = createStaticHandler(d.sandbox);
@@ -89,8 +84,10 @@
group('access outside of root enabled', () {
test('access real file', () async {
- final handler =
- createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+ final handler = createStaticHandler(
+ d.sandbox,
+ serveFilesOutsidePath: true,
+ );
final response = await makeRequest(handler, '/originals/index.html');
expect(response.statusCode, HttpStatus.ok);
@@ -99,23 +96,23 @@
});
group('links under root dir', () {
- test(
- 'access sym linked file in real dir',
- () async {
- final handler =
- createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+ test('access sym linked file in real dir', () async {
+ final handler = createStaticHandler(
+ d.sandbox,
+ serveFilesOutsidePath: true,
+ );
- final response = await makeRequest(handler, '/link_index.html');
- expect(response.statusCode, HttpStatus.ok);
- expect(response.contentLength, 13);
- expect(response.readAsString(), completion('<html></html>'));
- },
- onPlatform: _skipSymlinksOnWindows,
- );
+ final response = await makeRequest(handler, '/link_index.html');
+ expect(response.statusCode, HttpStatus.ok);
+ expect(response.contentLength, 13);
+ expect(response.readAsString(), completion('<html></html>'));
+ }, onPlatform: _skipSymlinksOnWindows);
test('access file in sym linked dir', () async {
- final handler =
- createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+ final handler = createStaticHandler(
+ d.sandbox,
+ serveFilesOutsidePath: true,
+ );
final response = await makeRequest(handler, '/link_dir/index.html');
expect(response.statusCode, HttpStatus.ok);
@@ -125,23 +122,23 @@
});
group('links not under root dir', () {
- test(
- 'access sym linked file in real dir',
- () async {
- final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),
- serveFilesOutsidePath: true);
+ test('access sym linked file in real dir', () async {
+ final handler = createStaticHandler(
+ p.join(d.sandbox, 'alt_root'),
+ serveFilesOutsidePath: true,
+ );
- final response = await makeRequest(handler, '/link_index.html');
- expect(response.statusCode, HttpStatus.ok);
- expect(response.contentLength, 13);
- expect(response.readAsString(), completion('<html></html>'));
- },
- onPlatform: _skipSymlinksOnWindows,
- );
+ final response = await makeRequest(handler, '/link_index.html');
+ expect(response.statusCode, HttpStatus.ok);
+ expect(response.contentLength, 13);
+ expect(response.readAsString(), completion('<html></html>'));
+ }, onPlatform: _skipSymlinksOnWindows);
test('access file in sym linked dir', () async {
- final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),
- serveFilesOutsidePath: true);
+ final handler = createStaticHandler(
+ p.join(d.sandbox, 'alt_root'),
+ serveFilesOutsidePath: true,
+ );
final response = await makeRequest(handler, '/link_dir/index.html');
expect(response.statusCode, HttpStatus.ok);
diff --git a/pkgs/shelf_static/test/test_util.dart b/pkgs/shelf_static/test/test_util.dart
index 81d5ead..3b65e54 100644
--- a/pkgs/shelf_static/test/test_util.dart
+++ b/pkgs/shelf_static/test/test_util.dart
@@ -25,8 +25,7 @@
String path,
Map<String, String>? headers, {
required String method,
-}) =>
- Request(method, Uri.parse('http://localhost$path'), headers: headers);
+}) => Request(method, Uri.parse('http://localhost$path'), headers: headers);
Handler _rootHandler(String? path, Handler handler) {
if (path == null || path.isEmpty) {
@@ -52,7 +51,7 @@
final DateTime _target;
_SecondResolutionDateTimeMatcher(DateTime target)
- : _target = toSecondResolution(target);
+ : _target = toSecondResolution(target);
@override
bool matches(dynamic item, Map<dynamic, dynamic> matchState) {
@@ -62,9 +61,10 @@
}
@override
- Description describe(Description description) =>
- description.add('Must be at the same moment as $_target with resolution '
- 'to the second.');
+ Description describe(Description description) => description.add(
+ 'Must be at the same moment as $_target with resolution '
+ 'to the second.',
+ );
}
bool _datesEqualToSecond(DateTime d1, DateTime d2) =>
diff --git a/pkgs/shelf_test_handler/CHANGELOG.md b/pkgs/shelf_test_handler/CHANGELOG.md
index cb89546..253514b 100644
--- a/pkgs/shelf_test_handler/CHANGELOG.md
+++ b/pkgs/shelf_test_handler/CHANGELOG.md
@@ -2,7 +2,7 @@
* Require `shelf: ^1.1.0`
* Require `test: ^1.25.15`
-* Require `sdk: ^3.5.0`.
+* Require Dart `^3.9.0`.
## 2.0.2
diff --git a/pkgs/shelf_test_handler/lib/src/expectation.dart b/pkgs/shelf_test_handler/lib/src/expectation.dart
index c08808b..6b02323 100644
--- a/pkgs/shelf_test_handler/lib/src/expectation.dart
+++ b/pkgs/shelf_test_handler/lib/src/expectation.dart
@@ -20,7 +20,5 @@
Expectation(this.method, this.path, this.handler);
/// Creates an expectation that allows any method and path.
- Expectation.anything(this.handler)
- : method = null,
- path = null;
+ Expectation.anything(this.handler) : method = null, path = null;
}
diff --git a/pkgs/shelf_test_handler/lib/src/handler.dart b/pkgs/shelf_test_handler/lib/src/handler.dart
index f2b77da..d446da3 100644
--- a/pkgs/shelf_test_handler/lib/src/handler.dart
+++ b/pkgs/shelf_test_handler/lib/src/handler.dart
@@ -34,9 +34,9 @@
/// The [description] is used in debugging output for this handler. It
/// defaults to "ShelfTestHandler".
ShelfTestHandler({bool log = true, String? description})
- : _log = log,
- description = description ?? 'ShelfTestHandler',
- _zone = Zone.current;
+ : _log = log,
+ description = description ?? 'ShelfTestHandler',
+ _zone = Zone.current;
/// Expects that a single HTTP request with the given [method] and [path] will
/// be made to `this`.
@@ -69,7 +69,8 @@
try {
if (_expectations.isEmpty) {
throw TestFailure(
- '$description received unexpected request $requestInfo.');
+ '$description received unexpected request $requestInfo.',
+ );
}
var expectation = _expectations.removeFirst();
diff --git a/pkgs/shelf_test_handler/lib/src/server.dart b/pkgs/shelf_test_handler/lib/src/server.dart
index d784ae4..ab1cad9 100644
--- a/pkgs/shelf_test_handler/lib/src/server.dart
+++ b/pkgs/shelf_test_handler/lib/src/server.dart
@@ -32,8 +32,10 @@
///
/// The [description] is used in debugging output for this handler. It
/// defaults to "ShelfTestHandler".
- static Future<ShelfTestServer> create(
- {bool log = true, String? description}) async {
+ static Future<ShelfTestServer> create({
+ bool log = true,
+ String? description,
+ }) async {
var server = await HttpMultiServer.loopback(0);
var handler = ShelfTestHandler(log: log, description: description);
serveRequests(server, handler.call);
diff --git a/pkgs/shelf_test_handler/pubspec.yaml b/pkgs/shelf_test_handler/pubspec.yaml
index c842049..eb43bbc 100644
--- a/pkgs/shelf_test_handler/pubspec.yaml
+++ b/pkgs/shelf_test_handler/pubspec.yaml
@@ -9,7 +9,7 @@
- shelf
environment:
- sdk: ^3.5.0
+ sdk: ^3.9.0
dependencies:
http_multi_server: ^3.0.0
diff --git a/pkgs/shelf_test_handler/test/handler_test.dart b/pkgs/shelf_test_handler/test/handler_test.dart
index 5b91119..7994c7a 100644
--- a/pkgs/shelf_test_handler/test/handler_test.dart
+++ b/pkgs/shelf_test_handler/test/handler_test.dart
@@ -43,11 +43,13 @@
});
test('for expectAnything()', () async {
- handler.expectAnything(expectAsync1((request) {
- expect(request.method, equals('GET'));
- expect(request.url.path, equals('foo/bar'));
- return Response.ok('');
- }));
+ handler.expectAnything(
+ expectAsync1((request) {
+ expect(request.method, equals('GET'));
+ expect(request.url.path, equals('foo/bar'));
+ return Response.ok('');
+ }),
+ );
var response = await handler(_get('/foo/bar'));
expect(response.statusCode, equals(200));
@@ -75,14 +77,12 @@
_expectZoneFailure(() async {
var handler = ShelfTestHandler();
handler.expect(
- 'POST',
- '/',
- expectAsync1(
- (_) {
- fail('should never get here');
- },
- count: 0,
- ));
+ 'POST',
+ '/',
+ expectAsync1((_) {
+ fail('should never get here');
+ }, count: 0),
+ );
await handler(_get('/'));
});
});
@@ -91,32 +91,41 @@
_expectZoneFailure(() async {
var handler = ShelfTestHandler();
handler.expect(
- 'GET',
- '/foo',
- expectAsync1((_) {
- fail('should never get here');
- }, count: 0));
+ 'GET',
+ '/foo',
+ expectAsync1((_) {
+ fail('should never get here');
+ }, count: 0),
+ );
await handler(_get('/'));
});
});
});
test("doesn't swallow handler errors", () {
- runZonedGuarded(() async {
- var handler = ShelfTestHandler();
- handler.expect('GET', '/', (_) => throw StateError('oh heck'));
- await handler(_get('/'));
- }, expectAsync2((error, stack) {
- expect(error,
- isA<StateError>().having((p0) => p0.message, 'message', 'oh heck'));
- }));
+ runZonedGuarded(
+ () async {
+ var handler = ShelfTestHandler();
+ handler.expect('GET', '/', (_) => throw StateError('oh heck'));
+ await handler(_get('/'));
+ },
+ expectAsync2((error, stack) {
+ expect(
+ error,
+ isA<StateError>().having((p0) => p0.message, 'message', 'oh heck'),
+ );
+ }),
+ );
});
}
void _expectZoneFailure(Future<void> Function() callback) {
- runZonedGuarded(callback, expectAsync2((error, stack) {
- expect(error, isA<TestFailure>());
- }));
+ runZonedGuarded(
+ callback,
+ expectAsync2((error, stack) {
+ expect(error, isA<TestFailure>());
+ }),
+ );
}
Request _get(String path) =>
diff --git a/pkgs/shelf_test_handler/test/server_test.dart b/pkgs/shelf_test_handler/test/server_test.dart
index d92e85e..314398a 100644
--- a/pkgs/shelf_test_handler/test/server_test.dart
+++ b/pkgs/shelf_test_handler/test/server_test.dart
@@ -28,14 +28,18 @@
var server = await ShelfTestServer.create();
addTearDown(server.close);
- server.handler.expect('GET', '/',
- webSocketHandler((WebSocketChannel webSocket, _) {
- webSocket.sink.add('hello!');
- webSocket.sink.close();
- }));
+ server.handler.expect(
+ 'GET',
+ '/',
+ webSocketHandler((WebSocketChannel webSocket, _) {
+ webSocket.sink.add('hello!');
+ webSocket.sink.close();
+ }),
+ );
- var webSocket =
- await WebSocket.connect('ws://localhost:${server.url.port}');
+ var webSocket = await WebSocket.connect(
+ 'ws://localhost:${server.url.port}',
+ );
expect(webSocket, emits('hello!'));
});
}
diff --git a/pkgs/shelf_web_socket/CHANGELOG.md b/pkgs/shelf_web_socket/CHANGELOG.md
index 980b77f..e5d0c67 100644
--- a/pkgs/shelf_web_socket/CHANGELOG.md
+++ b/pkgs/shelf_web_socket/CHANGELOG.md
@@ -1,5 +1,7 @@
## 3.0.1-wip
+* Require Dart `^3.9.0`.
+
## 3.0.0
* **BREAKING:**: Change the signature of the `webSocketHandler` method's
diff --git a/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart b/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart
index e86010f..d2c36c2 100644
--- a/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart
+++ b/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart
@@ -13,8 +13,8 @@
///
/// This takes a [WebSocketChannel] as its first argument and an optional
/// [subprotocol] as its second argument.
-typedef ConnectionCallback = void Function(
- WebSocketChannel webSocket, String? subprotocol);
+typedef ConnectionCallback =
+ void Function(WebSocketChannel webSocket, String? subprotocol);
/// A class that exposes a handler for upgrading WebSocket requests.
class WebSocketHandler {
@@ -30,8 +30,12 @@
/// The ping interval used for verifying connection, or `null`.
final Duration? _pingInterval;
- WebSocketHandler(this._onConnection, this._protocols, this._allowedOrigins,
- this._pingInterval);
+ WebSocketHandler(
+ this._onConnection,
+ this._protocols,
+ this._allowedOrigins,
+ this._pingInterval,
+ );
/// The [Handler].
Response handle(Request request) {
@@ -39,8 +43,10 @@
final connection = request.headers['Connection'];
if (connection == null) return _notFound();
- final tokens =
- connection.toLowerCase().split(',').map((token) => token.trim());
+ final tokens = connection
+ .toLowerCase()
+ .split(',')
+ .map((token) => token.trim());
if (!tokens.contains('upgrade')) return _notFound();
final upgrade = request.headers['Upgrade'];
@@ -55,16 +61,20 @@
}
if (request.protocolVersion != '1.1') {
- return _badRequest('unexpected HTTP version '
- '"${request.protocolVersion}".');
+ return _badRequest(
+ 'unexpected HTTP version '
+ '"${request.protocolVersion}".',
+ );
}
final key = request.headers['Sec-WebSocket-Key'];
if (key == null) return _badRequest('missing Sec-WebSocket-Key header.');
if (!request.canHijack) {
- throw ArgumentError('webSocketHandler may only be used with a server '
- 'that supports request hijacking.');
+ throw ArgumentError(
+ 'webSocketHandler may only be used with a server '
+ 'that supports request hijacking.',
+ );
}
// The Origin header is always set by browser connections. By filtering out
@@ -80,10 +90,12 @@
final protocol = _chooseProtocol(request);
request.hijack((channel) {
final sink = utf8.encoder.startChunkedConversion(channel.sink)
- ..add('HTTP/1.1 101 Switching Protocols\r\n'
- 'Upgrade: websocket\r\n'
- 'Connection: Upgrade\r\n'
- 'Sec-WebSocket-Accept: ${WebSocketChannel.signKey(key)}\r\n');
+ ..add(
+ 'HTTP/1.1 101 Switching Protocols\r\n'
+ 'Upgrade: websocket\r\n'
+ 'Connection: Upgrade\r\n'
+ 'Sec-WebSocket-Accept: ${WebSocketChannel.signKey(key)}\r\n',
+ );
if (protocol != null) sink.add('Sec-WebSocket-Protocol: $protocol\r\n');
sink.add('\r\n');
@@ -91,9 +103,11 @@
throw ArgumentError('channel.sink must be a dart:io `Socket`.');
}
- final webSocket = WebSocket.fromUpgradedSocket(channel.sink as Socket,
- protocol: protocol, serverSide: true)
- ..pingInterval = _pingInterval;
+ final webSocket = WebSocket.fromUpgradedSocket(
+ channel.sink as Socket,
+ protocol: protocol,
+ serverSide: true,
+ )..pingInterval = _pingInterval;
_onConnection(IOWebSocketChannel(webSocket), protocol);
});
@@ -115,19 +129,28 @@
/// Returns a 404 Not Found response.
Response _notFound() => _htmlResponse(
- 404, '404 Not Found', 'Only WebSocket connections are supported.');
+ 404,
+ '404 Not Found',
+ 'Only WebSocket connections are supported.',
+ );
/// Returns a 400 Bad Request response.
///
/// [message] will be HTML-escaped before being included in the response body.
Response _badRequest(String message) => _htmlResponse(
- 400, '400 Bad Request', 'Invalid WebSocket upgrade request: $message');
+ 400,
+ '400 Bad Request',
+ 'Invalid WebSocket upgrade request: $message',
+ );
/// Returns a 403 Forbidden response.
///
/// [message] will be HTML-escaped before being included in the response body.
Response _forbidden(String message) => _htmlResponse(
- 403, '403 Forbidden', 'WebSocket upgrade refused: $message');
+ 403,
+ '403 Forbidden',
+ 'WebSocket upgrade refused: $message',
+ );
/// Creates an HTTP response with the given [statusCode] and an HTML body with
/// [title] and [message].
@@ -136,7 +159,10 @@
Response _htmlResponse(int statusCode, String title, String message) {
title = htmlEscape.convert(title);
message = htmlEscape.convert(message);
- return Response(statusCode, body: '''
+ return Response(
+ statusCode,
+ body:
+ '''
<!doctype html>
<html>
<head><title>$title</title></head>
@@ -145,6 +171,8 @@
<p>$message</p>
</body>
</html>
- ''', headers: {'content-type': 'text/html'});
+ ''',
+ headers: {'content-type': 'text/html'},
+ );
}
}
diff --git a/pkgs/shelf_web_socket/pubspec.yaml b/pkgs/shelf_web_socket/pubspec.yaml
index 9d142dd..3166f81 100644
--- a/pkgs/shelf_web_socket/pubspec.yaml
+++ b/pkgs/shelf_web_socket/pubspec.yaml
@@ -9,7 +9,7 @@
- shelf
environment:
- sdk: ^3.5.0
+ sdk: ^3.9.0
dependencies:
shelf: ^1.1.0
diff --git a/pkgs/shelf_web_socket/test/web_socket_test.dart b/pkgs/shelf_web_socket/test/web_socket_test.dart
index 5199c47..f50fe95 100644
--- a/pkgs/shelf_web_socket/test/web_socket_test.dart
+++ b/pkgs/shelf_web_socket/test/web_socket_test.dart
@@ -13,26 +13,31 @@
import 'package:web_socket_channel/web_socket_channel.dart';
Map<String, String> get _handshakeHeaders => {
- 'Upgrade': 'websocket',
- 'Connection': 'Upgrade',
- 'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
- 'Sec-WebSocket-Version': '13'
- };
+ 'Upgrade': 'websocket',
+ 'Connection': 'Upgrade',
+ 'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
+ 'Sec-WebSocket-Version': '13',
+};
void main() {
test('can communicate with a dart:io WebSocket client', () async {
- final server = await shelf_io.serve(webSocketHandler((webSocket, _) {
- webSocket.sink.add('hello!');
- webSocket.stream.first.then((request) {
- expect(request, equals('ping'));
- webSocket.sink.add('pong');
- webSocket.sink.close();
- });
- }), 'localhost', 0);
+ final server = await shelf_io.serve(
+ webSocketHandler((webSocket, _) {
+ webSocket.sink.add('hello!');
+ webSocket.stream.first.then((request) {
+ expect(request, equals('ping'));
+ webSocket.sink.add('pong');
+ webSocket.sink.close();
+ });
+ }),
+ 'localhost',
+ 0,
+ );
try {
- final webSocket =
- await WebSocket.connect('ws://localhost:${server.port}');
+ final webSocket = await WebSocket.connect(
+ 'ws://localhost:${server.port}',
+ );
var n = 0;
await webSocket.listen((message) {
if (n == 0) {
@@ -54,16 +59,19 @@
test('negotiates the sub-protocol', () async {
final server = await shelf_io.serve(
- webSocketHandler((WebSocketChannel webSocket, String? protocol) {
- expect(protocol, equals('two'));
- webSocket.sink.close();
- }, protocols: ['three', 'two', 'x']),
- 'localhost',
- 0);
+ webSocketHandler((WebSocketChannel webSocket, String? protocol) {
+ expect(protocol, equals('two'));
+ webSocket.sink.close();
+ }, protocols: ['three', 'two', 'x']),
+ 'localhost',
+ 0,
+ );
try {
- final webSocket = await WebSocket.connect('ws://localhost:${server.port}',
- protocols: ['one', 'two', 'three']);
+ final webSocket = await WebSocket.connect(
+ 'ws://localhost:${server.port}',
+ protocols: ['one', 'two', 'three'],
+ );
expect(webSocket.protocol, equals('two'));
return await webSocket.close();
} finally {
@@ -72,13 +80,19 @@
});
test('handles protocol header without allowed protocols', () async {
- final server = await shelf_io.serve(webSocketHandler((webSocket, _) {
- webSocket.sink.close();
- }), 'localhost', 0);
+ final server = await shelf_io.serve(
+ webSocketHandler((webSocket, _) {
+ webSocket.sink.close();
+ }),
+ 'localhost',
+ 0,
+ );
try {
- final webSocket = await WebSocket.connect('ws://localhost:${server.port}',
- protocols: ['one', 'two', 'three']);
+ final webSocket = await WebSocket.connect(
+ 'ws://localhost:${server.port}',
+ protocols: ['one', 'two', 'three'],
+ );
expect(webSocket.protocol, isNull);
return await webSocket.close();
} finally {
@@ -88,14 +102,19 @@
test('allows two argument callbacks without protocols', () async {
final server = await shelf_io.serve(
- webSocketHandler((WebSocketChannel webSocket, String? protocol) {
- expect(protocol, isNull);
- webSocket.sink.close();
- }), 'localhost', 0);
+ webSocketHandler((WebSocketChannel webSocket, String? protocol) {
+ expect(protocol, isNull);
+ webSocket.sink.close();
+ }),
+ 'localhost',
+ 0,
+ );
try {
- final webSocket = await WebSocket.connect('ws://localhost:${server.port}',
- protocols: ['one', 'two', 'three']);
+ final webSocket = await WebSocket.connect(
+ 'ws://localhost:${server.port}',
+ protocols: ['one', 'two', 'three'],
+ );
expect(webSocket.protocol, isNull);
return await webSocket.close();
} finally {
@@ -104,29 +123,40 @@
});
test('cannot hijack non-Socket StreamChannel', () async {
- final handler =
- webSocketHandler((WebSocketChannel webSocket, String? protocol) {
+ final handler = webSocketHandler((
+ WebSocketChannel webSocket,
+ String? protocol,
+ ) {
expect(protocol, isNull);
webSocket.sink.close();
});
expect(
- () => handler(Request('GET', Uri.parse('ws://example.com/'),
- protocolVersion: '1.1',
- headers: {
- 'Host': 'example.com',
- 'Upgrade': 'websocket',
- 'Connection': 'Upgrade',
- 'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
- 'Sec-WebSocket-Version': '13',
- 'Origin': 'http://example.com',
- }, onHijack: (fn) {
- // `.foreign` is not a Socket so hijacking the request should
- // fail.
- expect(() => fn(StreamChannelController<List<int>>().foreign),
- throwsArgumentError);
- })),
- throwsA(isA<HijackException>()));
+ () => handler(
+ Request(
+ 'GET',
+ Uri.parse('ws://example.com/'),
+ protocolVersion: '1.1',
+ headers: {
+ 'Host': 'example.com',
+ 'Upgrade': 'websocket',
+ 'Connection': 'Upgrade',
+ 'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
+ 'Sec-WebSocket-Version': '13',
+ 'Origin': 'http://example.com',
+ },
+ onHijack: (fn) {
+ // `.foreign` is not a Socket so hijacking the request should
+ // fail.
+ expect(
+ () => fn(StreamChannelController<List<int>>().foreign),
+ throwsArgumentError,
+ );
+ },
+ ),
+ ),
+ throwsA(isA<HijackException>()),
+ );
});
group('with a set of allowed origins', () {
@@ -134,11 +164,12 @@
late Uri url;
setUp(() async {
server = await shelf_io.serve(
- webSocketHandler((webSocket, _) {
- webSocket.sink.close();
- }, allowedOrigins: ['pub.dartlang.org', 'GoOgLe.CoM']),
- 'localhost',
- 0);
+ webSocketHandler((webSocket, _) {
+ webSocket.sink.close();
+ }, allowedOrigins: ['pub.dartlang.org', 'GoOgLe.CoM']),
+ 'localhost',
+ 0,
+ );
url = Uri.http('localhost:${server.port}', '');
});
@@ -175,24 +206,34 @@
// Regression test for issue 21894.
test('allows a Connection header with multiple values', () async {
- final server = await shelf_io.serve(webSocketHandler((webSocket, _) {
- webSocket.sink.close();
- }), 'localhost', 0);
+ final server = await shelf_io.serve(
+ webSocketHandler((webSocket, _) {
+ webSocket.sink.close();
+ }),
+ 'localhost',
+ 0,
+ );
final url = Uri.http('localhost:${server.port}', '');
final headers = _handshakeHeaders;
headers['Connection'] = 'Other-Token, Upgrade';
- expect(http.get(url, headers: headers).whenComplete(server.close),
- hasStatus(101));
+ expect(
+ http.get(url, headers: headers).whenComplete(server.close),
+ hasStatus(101),
+ );
});
group('HTTP errors', () {
late HttpServer server;
late Uri url;
setUp(() async {
- server = await shelf_io.serve(webSocketHandler((_, __) {
- fail('should not create a WebSocket');
- }), 'localhost', 0);
+ server = await shelf_io.serve(
+ webSocketHandler((_, _) {
+ fail('should not create a WebSocket');
+ }),
+ 'localhost',
+ 0,
+ );
url = Uri.http('localhost:${server.port}', '');
});
@@ -231,8 +272,10 @@
});
}
-Matcher hasStatus(int status) => completion(predicate((http.Response response) {
- expect(response, isA<http.Response>());
- expect(response.statusCode, equals(status));
- return true;
- }));
+Matcher hasStatus(int status) => completion(
+ predicate((http.Response response) {
+ expect(response, isA<http.Response>());
+ expect(response.statusCode, equals(status));
+ return true;
+ }),
+);