rust-web-server 18.10.0

Single-binary web server and reverse proxy: automatic HTTPS (Let's Encrypt), HTTP/1.1, HTTP/2 and HTTP/3, load balancing, auth and rate limiting, configured in one TOML file. Also a Rust library: routing, middleware, MCP server, ORM, background jobs. No hyper, no Tower; HTTP/2 and HTTP/3 framing via h2 and quinn.
Documentation
# Gateway API conformance (#19, spec/GATEWAY_API.md): rws in a kind cluster
# against the official suite at the pinned Gateway API release, in both
# deployment modes. Every profile and claimed feature must pass.
name: Gateway API conformance

on:
  push:
    branches: [main]
    # A release tag: the reports submitted upstream (their
    # implementation.version must be the release).
    tags: ["[0-9]+.[0-9]+.[0-9]+"]
    paths:
      - "src/gateway_api/**"
      - "src/proxy/**"
      - "src/server/**"
      - "helm/**"
      - "ci/e2e/gateway_api*"
      - ".github/workflows/gateway-api.yml"
      - "Cargo.toml"
      - "Cargo.lock"
  workflow_dispatch:

concurrency:
  group: gateway-api-${{ github.ref }}
  cancel-in-progress: true

env:
  GATEWAY_API_VERSION: v1.6.3
  KIND_VERSION: v0.33.0
  PROFILES: GATEWAY-HTTP,GATEWAY-GRPC,GATEWAY-TLS,GATEWAY-TCP,GATEWAY-UDP
  # Keep in step with gateway_api::translate::SUPPORTED_FEATURES.
  FEATURES: BackendTLSPolicy,BackendTLSPolicySANValidation,GRPCRoute,GRPCRouteNamedRouteRule,Gateway,GatewayAddressEmpty,GatewayBackendClientCertificate,GatewayFrontendClientCertificateValidation,GatewayFrontendClientCertificateValidationInsecureFallback,GatewayHTTPListenerIsolation,GatewayHTTPSListenerDetectMisdirectedRequests,GatewayInfrastructure,GatewayPort8080,GatewayStaticAddresses,HTTPRoute,HTTPRoute303RedirectStatusCode,HTTPRoute307RedirectStatusCode,HTTPRoute308RedirectStatusCode,HTTPRouteBackendProtocolH2C,HTTPRouteBackendProtocolWebSocket,HTTPRouteBackendRequestHeaderModification,HTTPRouteBackendTimeout,HTTPRouteCORS,HTTPRouteHostRewrite,HTTPRouteMethodMatching,HTTPRouteNamedRouteRule,HTTPRouteParentRefPort,HTTPRoutePathRedirect,HTTPRoutePathRewrite,HTTPRoutePortRedirect,HTTPRouteQueryParamMatching,HTTPRouteRequestMirror,HTTPRouteRequestMultipleMirrors,HTTPRouteRequestPercentageMirror,HTTPRouteRequestTimeout,HTTPRouteResponseHeaderModification,HTTPRouteSchemeRedirect,ListenerSet,ReferenceGrant,TCPRoute,TLSRoute,TLSRouteModeTerminate,UDPRoute

jobs:
  conformance:
    name: conformance (${{ matrix.mode }})
    strategy:
      fail-fast: false
      matrix:
        mode: [shared, provisioned]
    runs-on: ubuntu-latest
    timeout-minutes: 180
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: dtolnay/rust-toolchain@1.99
        with:
          targets: x86_64-unknown-linux-musl
      - uses: Swatinem/rust-cache@v2
      - name: Install musl tools
        run: sudo apt-get update && sudo apt-get install -y musl-tools
      # What the Linux release ships (release.yml): static musl, these features.
      - name: Build rws as released for Linux
        run: cargo build --bin rws --features "acme auth mimalloc gateway-api" --target x86_64-unknown-linux-musl
      - uses: actions/setup-go@v5
        with:
          go-version: "1.26"
      - name: kind, and the Gateway API suite at the pinned release
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          gh release download "$KIND_VERSION" --repo kubernetes-sigs/kind --pattern 'kind-linux-amd64' --dir "$RUNNER_TEMP"
          install -m 0755 "$RUNNER_TEMP/kind-linux-amd64" /usr/local/bin/kind
          git clone --depth 1 --branch "$GATEWAY_API_VERSION" https://github.com/kubernetes-sigs/gateway-api "$RUNNER_TEMP/gateway-api"
          gh release download "$GATEWAY_API_VERSION" --repo kubernetes-sigs/gateway-api --pattern standard-install.yaml --dir "$RUNNER_TEMP/gateway-api"
      - name: Conformance suite
        run: ci/e2e/gateway_api.sh target/x86_64-unknown-linux-musl/debug/rws "$RUNNER_TEMP/gateway-api" "$RUNNER_TEMP/report.yaml" "$PROFILES" "$FEATURES" "${{ matrix.mode }}"
      - name: Report
        if: always()
        run: |
          if [ -f "$RUNNER_TEMP/report.yaml" ]; then
            { echo '```yaml'; cat "$RUNNER_TEMP/report.yaml"; echo '```'; } >> "$GITHUB_STEP_SUMMARY"
            # Named as conformance/reports/<version>/<impl>/ in gateway-api wants it:
            # <channel>-<version>-<mode>-report.yaml.
            version=$(git describe --tags --always)
            cp "$RUNNER_TEMP/report.yaml" "$RUNNER_TEMP/standard-$version-${{ matrix.mode }}-report.yaml"
          fi
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: gateway-api-conformance-report-${{ matrix.mode }}
          path: ${{ runner.temp }}/standard-*-report.yaml
          if-no-files-found: ignore