[tor-bugs] #33144 [Circumvention/Snowflake]: Overhaul websocketconn.Conn; implement net.Conn

Tor Bug Tracker & Wiki blackhole at torproject.org
Mon Feb 3 21:25:58 UTC 2020


#33144: Overhaul websocketconn.Conn; implement net.Conn
-------------------------------------+------------------------------
 Reporter:  dcf                      |          Owner:  dcf
     Type:  enhancement              |         Status:  needs_review
 Priority:  Medium                   |      Milestone:
Component:  Circumvention/Snowflake  |        Version:
 Severity:  Normal                   |     Resolution:
 Keywords:                           |  Actual Points:
Parent ID:                           |         Points:
 Reviewer:                           |        Sponsor:
-------------------------------------+------------------------------
Description changed by dcf:

Old description:

> In the turbotunnel branch I found it convenient to have
> `websocketconn.Conn` implement `net.Conn`, not only `io.ReadWriteCloser`.
> While implementing the additional methods, I found some ways that
> `websocketconn.Conn`'s existing methods do not satisfy the requirements
> of `net.Conn`:
>  * there are data races when multiple goroutines call `Read` or `Write`.
>    * this is partly because `Read` assigns to the shared field `conn.r`,
> and partly because [https://godoc.org/github.com/gorilla/websocket#hdr-
> Concurrency the underlying websocket.Conn doesn't permit concurrent
> access].
>  * when a websocketconn.Conn is closed, it starts returning some kind of
> [https://godoc.org/github.com/gorilla/websocket#CloseError
> websocket.CloseError], not `io.EOF`.
>
> This branch
>  1. adds tests that expose the above issues
>  2. rewrites `websocketconn.Conn` to serialize `Read`s and `Write`s using
> my favorite `io.Pipe`-with-goroutine trick
>  3. implements the remaining `net.Conn` methods

New description:

 In the turbotunnel branch I found it convenient to have
 `websocketconn.Conn` implement `net.Conn`, not only `io.ReadWriteCloser`.
 While implementing the additional methods, I found some ways that
 `websocketconn.Conn`'s existing methods do not satisfy the requirements of
 `net.Conn`:
  * there are data races when multiple goroutines call `Read` or `Write`.
    * this is partly because `Read` assigns to the shared field `conn.r`,
 and partly because [https://godoc.org/github.com/gorilla/websocket#hdr-
 Concurrency the underlying websocket.Conn doesn't permit concurrent
 access].
  * when a websocketconn.Conn is closed, it starts returning some kind of
 [https://godoc.org/github.com/gorilla/websocket#CloseError
 websocket.CloseError], not `io.EOF`.

 This branch
  1. adds tests that expose the above issues
  2. rewrites `websocketconn.Conn` to serialize `Read`s and `Write`s using
 my favorite `io.Pipe`-with-goroutine trick
  3. transforms [https://godoc.org/github.com/gorilla/websocket#CloseError
 websocket.CloseError] with code `CloseNormalClosure` or
 `CloseNoStatusReceived` to `io.EOF`
  4. implements the remaining `net.Conn` methods

--

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/33144#comment:2>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list