[tor-commits] [pluggable-transports/meek] 03/09: Factor turbotunnel into a common package.
gitolite role
git at cupani.torproject.org
Fri Oct 28 07:13:02 UTC 2022
This is an automated email from the git hooks/post-receive script.
dcf pushed a commit to branch turbotunnel
in repository pluggable-transports/meek.
commit 80b6d3b101108086375fda872c0f7c19d4c0c158
Author: David Fifield <david at bamsoftware.com>
AuthorDate: Thu Oct 27 17:58:47 2022 -0600
Factor turbotunnel into a common package.
---
{meek-server => common/turbotunnel}/client_map.go | 2 +-
common/turbotunnel/clientid.go | 28 +++++++++++++
common/turbotunnel/consts.go | 14 +++++++
.../turbotunnel/queuepacketconn.go | 47 +++-------------------
meek-client/turbotunnel.go | 27 ++-----------
meek-server/meek-server.go | 7 ++--
6 files changed, 56 insertions(+), 69 deletions(-)
diff --git a/meek-server/client_map.go b/common/turbotunnel/client_map.go
similarity index 99%
rename from meek-server/client_map.go
rename to common/turbotunnel/client_map.go
index 6f2f69a..733480a 100644
--- a/meek-server/client_map.go
+++ b/common/turbotunnel/client_map.go
@@ -1,4 +1,4 @@
-package main
+package turbotunnel
import (
"container/heap"
diff --git a/common/turbotunnel/clientid.go b/common/turbotunnel/clientid.go
new file mode 100644
index 0000000..17257e1
--- /dev/null
+++ b/common/turbotunnel/clientid.go
@@ -0,0 +1,28 @@
+package turbotunnel
+
+import (
+ "crypto/rand"
+ "encoding/hex"
+)
+
+// ClientID is an abstract identifier that binds together all the communications
+// belonging to a single client session, even though those communications may
+// arrive from multiple IP addresses or over multiple lower-level connections.
+// It plays the same role that an (IP address, port number) tuple plays in a
+// net.UDPConn: it's the return address pertaining to a long-lived abstract
+// client session. The client attaches its ClientID to each of its
+// communications, enabling the server to disambiguate requests among its many
+// clients. ClientID implements the net.Addr interface.
+type ClientID [8]byte
+
+func NewClientID() ClientID {
+ var id ClientID
+ _, err := rand.Read(id[:])
+ if err != nil {
+ panic(err)
+ }
+ return id
+}
+
+func (id ClientID) Network() string { return "clientid" }
+func (id ClientID) String() string { return hex.EncodeToString(id[:]) }
diff --git a/common/turbotunnel/consts.go b/common/turbotunnel/consts.go
new file mode 100644
index 0000000..0d280af
--- /dev/null
+++ b/common/turbotunnel/consts.go
@@ -0,0 +1,14 @@
+// The code in this package provides a compatibility layer between an underlying
+// packet-based connection and our polling-based domain-fronted HTTP carrier.
+// The main interface is QueuePacketConn, which stores packets in buffered
+// channels instead of sending/receiving them on some concrete network
+// interface. Callers can inspect these channels.
+package turbotunnel
+
+import "errors"
+
+// The size of receive and send queues.
+const queueSize = 256
+
+var errClosedPacketConn = errors.New("operation on closed connection")
+var errNotImplemented = errors.New("not implemented")
diff --git a/meek-server/turbotunnel.go b/common/turbotunnel/queuepacketconn.go
similarity index 73%
rename from meek-server/turbotunnel.go
rename to common/turbotunnel/queuepacketconn.go
index d10b795..acb04c1 100644
--- a/meek-server/turbotunnel.go
+++ b/common/turbotunnel/queuepacketconn.go
@@ -1,44 +1,12 @@
-// The code in this file provides a compatibility layer between an underlying
-// packet-based connection and our polling-based domain-fronted HTTP carrier.
-// The main interface is QueuePacketConn, which stores packets in buffered
-// channels instead of sending/receiving them on some concrete network
-// interface. Callers can inspect these channels.
-
-package main
+package turbotunnel
import (
- "crypto/rand"
- "encoding/hex"
- "errors"
"net"
"sync"
"sync/atomic"
"time"
)
-// The size of receive and send queues.
-const queueSize = 256
-
-// ClientID plays the role in QueuePacketConn that an (IP address, port) tuple
-// plays in a net.UDPConn. It is a persistent identifier that binds together all
-// the HTTP transactions that occur as part of a session. The ClientID is sent
-// along with all HTTP requests, and the server uses the ClientID to
-// disambiguate requests among its many clients. ClientID implements the
-// net.Addr interface.
-type ClientID [8]byte
-
-func newClientID() ClientID {
- var id ClientID
- _, err := rand.Read(id[:])
- if err != nil {
- panic(err)
- }
- return id
-}
-
-func (id ClientID) Network() string { return "clientid" }
-func (id ClientID) String() string { return hex.EncodeToString(id[:]) }
-
// taggedPacket is a combination of a []byte and a net.Addr, encapsulating the
// return type of PacketConn.ReadFrom.
type taggedPacket struct {
@@ -48,9 +16,9 @@ type taggedPacket struct {
// QueuePacketConn implements net.PacketConn by storing queues of packets. There
// is one incoming queue (where packets are additionally tagged by the source
-// address of the client that sent them). There are many outgoing queues, one
-// for each client address that has been recently seen. The QueueIncoming method
-// inserts a packet into the incoming queue, to eventually be returned by
+// address of the peer that sent them). There are many outgoing queues, one for
+// each remote peer address that has been recently seen. The QueueIncoming
+// method inserts a packet into the incoming queue, to eventually be returned by
// ReadFrom. WriteTo inserts a packet into an address-specific outgoing queue,
// which can later by accessed through the OutgoingQueue method.
type QueuePacketConn struct {
@@ -63,8 +31,8 @@ type QueuePacketConn struct {
err atomic.Value
}
-// NewQueuePacketConn makes a new QueuePacketConn, set to track recent clients
-// for at least a duration of timeout.
+// NewQueuePacketConn makes a new QueuePacketConn, set to track recent peers for
+// at least a duration of timeout.
func NewQueuePacketConn(localAddr net.Addr, timeout time.Duration) *QueuePacketConn {
return &QueuePacketConn{
clients: NewClientMap(timeout),
@@ -100,9 +68,6 @@ func (c *QueuePacketConn) OutgoingQueue(addr net.Addr) <-chan []byte {
return c.clients.SendQueue(addr)
}
-var errClosedPacketConn = errors.New("operation on closed connection")
-var errNotImplemented = errors.New("not implemented")
-
// ReadFrom returns a packet and address previously stored by QueueIncoming.
func (c *QueuePacketConn) ReadFrom(p []byte) (int, net.Addr, error) {
select {
diff --git a/meek-client/turbotunnel.go b/meek-client/turbotunnel.go
index 535c05c..d4274e2 100644
--- a/meek-client/turbotunnel.go
+++ b/meek-client/turbotunnel.go
@@ -10,8 +10,6 @@ package main
import (
"bytes"
- "crypto/rand"
- "encoding/hex"
"errors"
"io"
"net"
@@ -20,6 +18,7 @@ import (
"time"
"git.torproject.org/pluggable-transports/meek.git/common/encapsulation"
+ "git.torproject.org/pluggable-transports/meek.git/common/turbotunnel"
)
const (
@@ -47,26 +46,6 @@ const (
pollDelayMultiplier = 2.0
)
-// ClientID plays the role in PollingPacketConn that an (IP address, port) tuple
-// plays in a net.UDPConn. It is a persistent identifier that binds together all
-// the HTTP transactions that occur as part of a session. The ClientID is sent
-// along with all HTTP requests, and the server uses the ClientID to
-// disambiguate requests among its many clients. ClientID implements the
-// net.Addr interface.
-type ClientID [8]byte
-
-func newClientID() ClientID {
- var id ClientID
- _, err := rand.Read(id[:])
- if err != nil {
- panic(err)
- }
- return id
-}
-
-func (id ClientID) Network() string { return "clientid" }
-func (id ClientID) String() string { return hex.EncodeToString(id[:]) }
-
// Poller is an abstract interface over an operation that writes a stream of
// bytes and reads a stream of bytes in return, like an HTTP request.
type Poller interface {
@@ -84,7 +63,7 @@ type Poller interface {
// HTTP response body). The Poller can apply HTTP request customizations such as
// domain fronting.
type PollingPacketConn struct {
- clientID ClientID
+ clientID turbotunnel.ClientID
remoteAddr net.Addr
poller Poller
recvQueue chan []byte
@@ -105,7 +84,7 @@ type PollingPacketConn struct {
// effective remote address.
func NewPollingPacketConn(remoteAddr net.Addr, poller Poller) *PollingPacketConn {
c := &PollingPacketConn{
- clientID: newClientID(),
+ clientID: turbotunnel.NewClientID(),
remoteAddr: remoteAddr,
poller: poller,
recvQueue: make(chan []byte, queueSize),
diff --git a/meek-server/meek-server.go b/meek-server/meek-server.go
index a8efad2..f971ab8 100644
--- a/meek-server/meek-server.go
+++ b/meek-server/meek-server.go
@@ -40,6 +40,7 @@ import (
"git.torproject.org/pluggable-transports/goptlib.git"
"git.torproject.org/pluggable-transports/meek.git/common/encapsulation"
+ "git.torproject.org/pluggable-transports/meek.git/common/turbotunnel"
"github.com/xtaci/kcp-go/v5"
"github.com/xtaci/smux"
"golang.org/x/crypto/acme/autocert"
@@ -80,11 +81,11 @@ func httpInternalServerError(w http.ResponseWriter) {
// listener, so there is just one global state. State also serves as the http
// Handler.
type State struct {
- conn *QueuePacketConn
+ conn *turbotunnel.QueuePacketConn
}
func NewState(localAddr net.Addr) (*State, error) {
- pconn := NewQueuePacketConn(localAddr, smuxIdleTimeout)
+ pconn := turbotunnel.NewQueuePacketConn(localAddr, smuxIdleTimeout)
ln, err := kcp.ServeConn(nil, 0, 0, pconn)
if err != nil {
@@ -147,7 +148,7 @@ func (state *State) Post(w http.ResponseWriter, req *http.Request) {
defer req.Body.Close()
body := http.MaxBytesReader(w, req.Body, maxPayloadLength+1)
- var clientID ClientID
+ var clientID turbotunnel.ClientID
_, err := io.ReadFull(body, clientID[:])
if err != nil {
// The request body didn't even contain enough bytes for the
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the tor-commits
mailing list