Skip to content

Commit

Permalink
Initial HTTP/3 and QPACK implementation
Browse files Browse the repository at this point in the history
Cowlib now uses GitHub Actions for CI. As a result
of this change, Cowlib is tested against OTP-24+.

This commit adds initial implementations of
cow_http3, cow_http3_machine and cow_qpack.

Because QPACK is similar to HPACK, some encoding and
decoding functions were moved to a common include file,
particularly the huffman functions.

The cow_http module now contains the types and functions
common to all or most versions of HTTP. The types and
functions specific to HTTP/1 were moved to the new
cow_http1 module.

Because HTTP/3 is similar to HTTP/2, part of the code
processing headers is common and can be found in
cow_http. Other functions common to both versions
were moved out of cow_http2_machine.

This commit updates comments indicating that the HTTP/2
PRIORITY mechanism will no longer be implemented.
  • Loading branch information
essen committed Mar 26, 2024
1 parent 1eb7f42 commit 941d408
Show file tree
Hide file tree
Showing 13 changed files with 4,066 additions and 1,026 deletions.
70 changes: 70 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
## Use workflows from ninenines/ci.erlang.mk to test Cowlib.

name: Check Cowlib

on:
push:
branches:
- master
pull_request:
schedule:
## Every Monday at 2am.
- cron: 0 2 * * 1

env:
CI_ERLANG_MK: 1

jobs:
cleanup-master:
name: Cleanup master build
runs-on: ubuntu-latest
steps:

- name: Cleanup master build if necessary
if: ${{ github.event_name == 'schedule' }}
run: |
gh extension install actions/gh-actions-cache
gh actions-cache delete Linux-X64-Erlang-master -R $REPO --confirm || true
gh actions-cache delete macOS-X64-Erlang-master -R $REPO --confirm || true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}

check:
name: Cowlib
needs: cleanup-master
uses: ninenines/ci.erlang.mk/.github/workflows/ci.yaml@master

# The perfs tests are nice to run but typically not
# important. So we run them after we are done with the other
# test suites. At this point we know that Erlang was built
# so we can just use the latest version.

perfs:
name: Run performance tests
needs: check
runs-on: 'ubuntu-latest'
if: ${{ !cancelled() }}
steps:

- name: Checkout repository
uses: actions/checkout@v4

- name: Output latest Erlang/OTP version
id: latest_version
run: |
{
echo "latest<<EOF"
make ci-list | grep -v rc | grep -v master | tail -n1
echo EOF
} >> "$GITHUB_OUTPUT"
- name: Restore CI cache
uses: actions/cache/restore@v4
with:
path: |
~/erlang/
key: ${{ runner.os }}-${{ runner.arch }}-Erlang-${{ steps.latest_version.outputs.latest }}

- name: Run perfs
run: make perfs LATEST_ERLANG_OTP=1
11 changes: 2 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@ PROJECT_VERSION = 2.13.0
# Options.

#ERLC_OPTS += +bin_opt_info
ifdef HIPE
ERLC_OPTS += -smp +native
TEST_ERLC_OPTS += -smp +native
endif

DIALYZER_OPTS = -Werror_handling -Wunmatched_returns

# Dependencies.
Expand All @@ -34,10 +29,8 @@ dep_uritemplate-tests = git https://github.com/uri-templates/uritemplate-test ma
dep_ci.erlang.mk = git https://github.com/ninenines/ci.erlang.mk master
DEP_EARLY_PLUGINS = ci.erlang.mk

AUTO_CI_OTP ?= OTP-21+
AUTO_CI_HIPE ?= OTP-LATEST
# AUTO_CI_ERLLVM ?= OTP-LATEST
AUTO_CI_WINDOWS ?= OTP-21+
AUTO_CI_OTP ?= OTP-LATEST-24+
AUTO_CI_WINDOWS ?= OTP-LATEST-24+

# Hex configuration.

Expand Down
3 changes: 2 additions & 1 deletion ebin/cowlib.app
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
{application, 'cowlib', [
{description, "Support library for manipulating Web protocols."},
{vsn, "2.13.0"},
{modules, ['cow_base64url','cow_cookie','cow_date','cow_hpack','cow_http','cow_http2','cow_http2_machine','cow_http_hd','cow_http_struct_hd','cow_http_te','cow_iolists','cow_link','cow_mimetypes','cow_multipart','cow_qs','cow_spdy','cow_sse','cow_uri','cow_uri_template','cow_ws']},
{modules, ['cow_base64url','cow_cookie','cow_date','cow_hpack','cow_http','cow_http1','cow_http2','cow_http2_machine','cow_http3','cow_http3_machine','cow_http_hd','cow_http_struct_hd','cow_http_te','cow_iolists','cow_link','cow_mimetypes','cow_multipart','cow_qpack','cow_qs','cow_spdy','cow_sse','cow_uri','cow_uri_template','cow_ws']},
{registered, []},
{applications, [kernel,stdlib,crypto]},
{optional_applications, []},
{env, []}
]}.
4 changes: 2 additions & 2 deletions erlang.mk
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
ERLANG_MK_FILENAME := $(realpath $(lastword $(MAKEFILE_LIST)))
export ERLANG_MK_FILENAME

ERLANG_MK_VERSION = 61f58ff
ERLANG_MK_VERSION = 2022.05.31-67-g61f58ff-dirty
ERLANG_MK_WITHOUT =

# Make 3.81 and 3.82 are deprecated.
Expand Down Expand Up @@ -3565,7 +3565,7 @@ REBAR_DEPS_DIR = $(DEPS_DIR)
export REBAR_DEPS_DIR

REBAR3_GIT ?= https://github.com/erlang/rebar3
REBAR3_COMMIT ?= 3f563feaf1091a1980241adefa83a32dd2eebf7c # 3.20.0
REBAR3_COMMIT ?= 06aaecd51b0ce828b66bb65a74d3c1fd7833a4ba # 3.22.1 + OTP-27 fixes

CACHE_DEPS ?= 0

Expand Down
360 changes: 8 additions & 352 deletions src/cow_hpack.erl

Large diffs are not rendered by default.

376 changes: 376 additions & 0 deletions src/cow_hpack_common.hrl

Large diffs are not rendered by default.

Loading

0 comments on commit 941d408

Please sign in to comment.