Skip to content
A QUIC implementation in pure go
Go Other
  1. Go 99.7%
  2. Other 0.3%
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci update CIs to Go 1.13 Sep 5, 2019
.travis update Fuzzit binary Sep 12, 2019
benchmark make the benchmark suite compatible with Go 1.13 Sep 5, 2019
docs add gopher-logo May 3, 2016
example make example server conform with the GET /xxx format used for interop Aug 2, 2019
fuzzing implement a buffer pool for STREAM frames Sep 4, 2019
http3 Merge pull request #2166 from juliens/alt-svc Oct 13, 2019
integrationtests add the stylecheck linter Sep 17, 2019
internal allow PING frames at every encryption level Oct 15, 2019
quictrace add the stylecheck linter Sep 17, 2019
.editorconfig add editorconfig Apr 15, 2016
.gitignore add .gitignore entries for fuzzing Aug 24, 2019
.golangci.yml add the stylecheck linter Sep 17, 2019
.travis.yml update GolangCI-Lint to v1.18.0 Sep 17, 2019
Changelog.md add a Changelog entry for the TokenStore Aug 13, 2019
LICENSE add Google to license file Dec 14, 2016
README.md Make Go 1.13 requirement more explicit in README Oct 1, 2019
appveyor.yml update CIs to Go 1.13 Sep 5, 2019
buffer_pool.go fix packet buffer usage when handling coalesced packets Mar 5, 2019
buffer_pool_test.go fix packet buffer usage when handling coalesced packets Mar 5, 2019
client.go add the stylecheck linter Sep 17, 2019
client_test.go add the TokenStore to the quic.Config, store received tokens Aug 13, 2019
closed_session.go refactor how sessions are deleted Sep 25, 2019
closed_session_test.go refactor how sessions are deleted Sep 25, 2019
codecov.yml fuzz the header parsing Aug 16, 2019
conn.go add a LocalAddr to the Session Mar 9, 2017
conn_test.go identify connections by their local addr when adding to the multiplexer Sep 3, 2019
crypto_stream.go use the STREAM frame buffer for receiving data Sep 4, 2019
crypto_stream_manager.go process the NewSessionTicket TLS message Apr 1, 2019
crypto_stream_manager_test.go process the NewSessionTicket TLS message Apr 1, 2019
crypto_stream_test.go assemble ackhandler.Frames, not wire.Frames, when packing a packet Aug 31, 2019
frame_sorter.go add the stylecheck linter Sep 17, 2019
frame_sorter_test.go add the stylecheck linter Sep 17, 2019
framer.go return ackhandler.Frames from sendStream.popStreamFrame Aug 31, 2019
framer_test.go return ackhandler.Frames from sendStream.popStreamFrame Aug 31, 2019
go.mod improve error messages on ALPN mismatches Oct 11, 2019
go.sum improve error messages on ALPN mismatches Oct 11, 2019
interface.go add the TokenStore to the quic.Config, store received tokens Aug 13, 2019
mock_ack_frame_source_test.go run go generate ./... Mar 5, 2019
mock_crypto_data_handler_test.go run go generate ./... Mar 5, 2019
mock_crypto_stream_test.go run go generate ./... Mar 5, 2019
mock_frame_source_test.go assemble ackhandler.Frames, not wire.Frames, when packing a packet Aug 31, 2019
mock_multiplexer_test.go implement sending of stateless resets Mar 8, 2019
mock_packer_test.go retransmit frames instead of packets Aug 29, 2019
mock_packet_handler_manager_test.go refactor how sessions are deleted Sep 25, 2019
mock_packet_handler_test.go run go generate ./... Mar 5, 2019
mock_quic_session_test.go implement a listener that returns early sessions Aug 13, 2019
mock_receive_stream_internal_test.go run go generate ./... Mar 5, 2019
mock_sealing_manager_test.go use separate sealer interfaces for long and short header packets Jun 22, 2019
mock_send_stream_internal_test.go return ackhandler.Frames from sendStream.popStreamFrame Aug 31, 2019
mock_session_runner_test.go refactor how sessions are deleted Sep 25, 2019
mock_stream_getter_test.go run go generate ./... Mar 5, 2019
mock_stream_internal_test.go return ackhandler.Frames from sendStream.popStreamFrame Aug 31, 2019
mock_stream_manager_test.go add a context to Session.Open{Uni}StreamSync Jun 22, 2019
mock_stream_sender_test.go run go generate ./... Mar 5, 2019
mock_token_store_test.go add the TokenStore to the quic.Config, store received tokens Aug 13, 2019
mock_unknown_packet_handler_test.go fix race condition when closing the server after a Read failed May 10, 2019
mock_unpacker_test.go pass the time a packet was received to the short header opener Aug 11, 2019
mockgen.go add the TokenStore to the quic.Config, store received tokens Aug 13, 2019
mockgen_private.sh move the mockgen cleanup commands to the mockgen script Aug 11, 2018
multiplexer.go add network to multiplexer index Oct 1, 2019
multiplexer_test.go identify connections by their local addr when adding to the multiplexer Sep 3, 2019
packet_handler_map.go Merge pull request #2147 from lucas-clemente/deleting-sessions Oct 1, 2019
packet_handler_map_test.go destroy sessions when deleting them from the packet handler map Sep 25, 2019
packet_packer.go add the unparam linter Sep 17, 2019
packet_packer_test.go implement a buffer pool for STREAM frames Sep 4, 2019
packet_unpacker.go add the stylecheck linter Sep 17, 2019
packet_unpacker_test.go pass the time a packet was received to the short header opener Aug 11, 2019
quic_suite_test.go refactor how sessions are deleted Sep 25, 2019
receive_stream.go add the stylecheck linter Sep 17, 2019
receive_stream_test.go add the stylecheck linter Sep 17, 2019
retransmission_queue.go queue lost STREAM frames in the stream's retransmission queue Aug 31, 2019
retransmission_queue_test.go queue lost STREAM frames in the stream's retransmission queue Aug 31, 2019
send_queue.go implement a send queue to send packet asynchronously Aug 24, 2019
send_queue_test.go implement a send queue to send packet asynchronously Aug 24, 2019
send_stream.go add the stylecheck linter Sep 17, 2019
send_stream_test.go add the stylecheck linter Sep 17, 2019
server.go refactor how sessions are deleted Sep 25, 2019
server_test.go implement a listener that returns early sessions Aug 13, 2019
session.go refactor how sessions are deleted Sep 25, 2019
session_test.go refactor how sessions are deleted Sep 25, 2019
stream.go return ackhandler.Frames from sendStream.popStreamFrame Aug 31, 2019
stream_test.go drop support for gQUIC Oct 30, 2018
streams_map.go add a context to Session.Open{Uni}StreamSync Jun 22, 2019
streams_map_generic_helper.go add the unparam linter Sep 17, 2019
streams_map_incoming_bidi.go refactor how sessions are deleted Sep 25, 2019
streams_map_incoming_generic.go add the unparam linter Sep 17, 2019
streams_map_incoming_generic_test.go add a context to Session.Accept{Uni}Stream Jun 22, 2019
streams_map_incoming_uni.go refactor how sessions are deleted Sep 25, 2019
streams_map_outgoing_bidi.go refactor how sessions are deleted Sep 25, 2019
streams_map_outgoing_generic.go add the unparam linter Sep 17, 2019
streams_map_outgoing_generic_test.go add a context to Session.Open{Uni}StreamSync Jun 22, 2019
streams_map_outgoing_uni.go refactor how sessions are deleted Sep 25, 2019
streams_map_test.go add a context to Session.Accept{Uni}Stream Jun 22, 2019
token_store.go define a quic.TokenStore interface and provide a LRU implementation Aug 13, 2019
token_store_test.go define a quic.TokenStore interface and provide a LRU implementation Aug 13, 2019
window_update_queue.go never increase the flow control limit for the crypto stream Sep 19, 2018
window_update_queue_test.go never increase the flow control limit for the crypto stream Sep 19, 2018

README.md

A QUIC implementation in pure Go

Godoc Reference Travis Build Status CircleCI Build Status Windows Build Status Code Coverage fuzzit

quic-go is an implementation of the QUIC protocol in Go. It roughly implements the IETF QUIC draft, although we don't fully support any of the draft versions at the moment.

Version compatibility

Since quic-go is under active development, there's no guarantee that two builds of different commits are interoperable. The QUIC version used in the master branch is just a placeholder, and should not be considered stable.

If you want to use quic-go as a library in other projects, please consider using a tagged release. These releases expose experimental QUIC versions, which are guaranteed to be stable.

Google QUIC

quic-go used to support both the QUIC versions supported by Google Chrome and QUIC as deployed on Google's servers, as well as IETF QUIC. Due to the divergence of the two protocols, we decided to not support both versions any more.

The master branch only supports IETF QUIC. For Google QUIC support, please refer to the gquic branch.

Guides

We currently support Go 1.13+, with Go modules support enabled.

Installing and updating dependencies:

go get -u ./...

Running tests:

go test ./...

QUIC without HTTP/3

Take a look at this echo example.

Usage

As a server

See the example server. Starting a QUIC server is very similar to the standard lib http in go:

http.Handle("/", http.FileServer(http.Dir(wwwDir)))
http3.ListenAndServeQUIC("localhost:4242", "/path/to/cert/chain.pem", "/path/to/privkey.pem", nil)

As a client

See the example client. Use a http3.RoundTripper as a Transport in a http.Client.

http.Client{
  Transport: &http3.RoundTripper{},
}

Contributing

We are always happy to welcome new contributors! We have a number of self-contained issues that are suitable for first-time contributors, they are tagged with help wanted. If you have any questions, please feel free to reach out by opening an issue or leaving a comment.

You can’t perform that action at this time.