diff options
author | Yawning Angel <yawning@torproject.org> | 2015-10-29 14:09:34 +0000 |
---|---|---|
committer | Yawning Angel <yawning@torproject.org> | 2015-10-29 14:09:34 +0000 |
commit | e52258edac55d82ff153755493d770bfbbc9a346 (patch) | |
tree | 324136fb4500944cd8c8790e4bca2f06fb96cef8 /transports/scramblesuit/base.go | |
parent | 69ffcc39c63f4a9a192082da71eea6b06a1e75d7 (diff) |
Make establishing outgoing connections the transport's responsibility.
ClientFactories now have a Dial() method instead of a WrapConn()
method, so that it is possible to write something like meek-client
using the obfs4proxy framework.
This breaks the external interface if anyone is using obfs4proxy as
a library, but the new way of doing things is a trivial modification,
to a single routine that shouldn't have been very large to begin with.
Diffstat (limited to 'transports/scramblesuit/base.go')
-rw-r--r-- | transports/scramblesuit/base.go | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/transports/scramblesuit/base.go b/transports/scramblesuit/base.go index 711c046..223d085 100644 --- a/transports/scramblesuit/base.go +++ b/transports/scramblesuit/base.go @@ -76,12 +76,22 @@ func (cf *ssClientFactory) ParseArgs(args *pt.Args) (interface{}, error) { return newClientArgs(args) } -func (cf *ssClientFactory) WrapConn(conn net.Conn, args interface{}) (net.Conn, error) { +func (cf *ssClientFactory) Dial(network, addr string, dialFn base.DialFunc, args interface{}) (net.Conn, error) { + // Validate args before opening outgoing connection. ca, ok := args.(*ssClientArgs) if !ok { return nil, fmt.Errorf("invalid argument type for args") } - return newScrambleSuitClientConn(conn, cf.ticketStore, ca) + + conn, err := dialFn(network, addr) + if err != nil { + return nil, err + } + if conn, err = newScrambleSuitClientConn(conn, cf.ticketStore, ca); err != nil { + conn.Close() + return nil, err + } + return conn, nil } var _ base.ClientFactory = (*ssClientFactory)(nil) |