parse-net 0.9.3

Grammar for Internet message fields: RFC 9110 field syntax, media types, RFC 9651 Structured Fields, HTTP and RFC 5322 dates, negotiation, entity tags, ranges, Content-Disposition, Cache-Control, Forwarded, auth challenges, and the email lexical layer. no_std, no allocation, sans-IO, zero dependencies.
Documentation
name: Fuzz

# The differential targets compare parse-net with httpdate, mime, sfv, and base64
# every week, so a change in either side's behaviour is seen (dev/PLAN.md
# section 11.5). The full 24-hour runs happen before releases, off CI.
on:
  schedule:
    - cron: "17 4 * * 1"
  workflow_dispatch:

env:
  CARGO_TERM_COLOR: always
  FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
  differential:
    name: Differential (${{ matrix.target }})
    runs-on: ubuntu-latest
    timeout-minutes: 45
    strategy:
      fail-fast: false
      matrix:
        target: [diff_http_date, diff_media_type, diff_sfv, diff_b64]
    steps:
      - uses: actions/checkout@v5
      - uses: dtolnay/rust-toolchain@nightly
      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: fuzz
      - name: Install cargo-fuzz
        uses: taiki-e/install-action@v2
        with:
          tool: cargo-fuzz
      - name: Fuzz for 30 minutes
        working-directory: fuzz
        run: |
          mkdir -p corpus/${{ matrix.target }}
          # The installed cargo-fuzz is a musl build and would default to
          # its own target, where the address sanitizer cannot link.
          cargo fuzz run --target x86_64-unknown-linux-gnu ${{ matrix.target }} \
            corpus/${{ matrix.target }} seeds/${{ matrix.target }} -- \
            -max_total_time=1800 -max_len=4096
      - name: Keep the failing input
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: artifacts-${{ matrix.target }}
          path: fuzz/artifacts/${{ matrix.target }}
          if-no-files-found: ignore