|
|
@@ -1,7 +1,6 @@
|
|
|
package shadowsocks
|
|
|
|
|
|
import (
|
|
|
- "errors"
|
|
|
"sync"
|
|
|
"v2ray.com/core/app"
|
|
|
"v2ray.com/core/common/alloc"
|
|
|
@@ -33,7 +32,7 @@ func NewClient(config *ClientConfig, space app.Space, meta *proxy.OutboundHandle
|
|
|
return client, nil
|
|
|
}
|
|
|
|
|
|
-func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer, ray ray.OutboundRay) error {
|
|
|
+func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer, ray ray.OutboundRay) {
|
|
|
defer payload.Release()
|
|
|
defer ray.OutboundInput().Release()
|
|
|
defer ray.OutboundOutput().Close()
|
|
|
@@ -56,7 +55,8 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer,
|
|
|
return nil
|
|
|
})
|
|
|
if err != nil {
|
|
|
- return errors.New("Shadowsocks|Client: Failed to find an available destination:" + err.Error())
|
|
|
+ log.Warning("Shadowsocks|Client: Failed to find an available destination:", err)
|
|
|
+ return
|
|
|
}
|
|
|
log.Info("Shadowsocks|Client: Tunneling request to ", destination, " via ", server.Destination())
|
|
|
|
|
|
@@ -76,7 +76,8 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer,
|
|
|
user := server.PickUser()
|
|
|
rawAccount, err := user.GetTypedAccount()
|
|
|
if err != nil {
|
|
|
- return errors.New("Shadowsocks|Client: Failed to get a valid user account: " + err.Error())
|
|
|
+ log.Warning("Shadowsocks|Client: Failed to get a valid user account: ", err)
|
|
|
+ return
|
|
|
}
|
|
|
account := rawAccount.(*ShadowsocksAccount)
|
|
|
request.User = user
|
|
|
@@ -93,11 +94,13 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer,
|
|
|
defer bodyWriter.Release()
|
|
|
|
|
|
if err != nil {
|
|
|
- return errors.New("Shadowsock|Client: Failed to write request: " + err.Error())
|
|
|
+ log.Info("Shadowsock|Client: Failed to write request: ", err)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
if err := bodyWriter.Write(payload); err != nil {
|
|
|
- return errors.New("Shadowsocks|Client: Failed to write payload: " + err.Error())
|
|
|
+ log.Info("Shadowsocks|Client: Failed to write payload: ", err)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
var responseMutex sync.Mutex
|
|
|
@@ -149,7 +152,8 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer,
|
|
|
}
|
|
|
if !payload.IsEmpty() {
|
|
|
if err := writer.Write(payload); err != nil {
|
|
|
- return errors.New("Shadowsocks|Client: Failed to write payload: " + err.Error())
|
|
|
+ log.Info("Shadowsocks|Client: Failed to write payload: ", err)
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
if err := v2io.PipeUntilEOF(ray.OutboundInput(), writer); err != nil {
|
|
|
@@ -158,8 +162,6 @@ func (v *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffer,
|
|
|
|
|
|
responseMutex.Lock()
|
|
|
}
|
|
|
-
|
|
|
- return nil
|
|
|
}
|
|
|
|
|
|
type ClientFactory struct{}
|