Darien Raymond 6 years ago
parent
commit
d20f87da4b
3 changed files with 19 additions and 8 deletions
  1. 17 6
      common/interfaces.go
  2. 1 1
      transport/internet/http/dialer.go
  3. 1 1
      transport/internet/http/hub.go

+ 17 - 6
common/interfaces.go

@@ -1,17 +1,25 @@
 package common
 package common
 
 
+import "v2ray.com/core/common/errors"
+
 // Closable is the interface for objects that can release its resources.
 // Closable is the interface for objects that can release its resources.
+//
+// v2ray:api:beta
 type Closable interface {
 type Closable interface {
 	// Close release all resources used by this object, including goroutines.
 	// Close release all resources used by this object, including goroutines.
 	Close() error
 	Close() error
 }
 }
 
 
 // Interruptible is an interface for objects that can be stopped before its completion.
 // Interruptible is an interface for objects that can be stopped before its completion.
+//
+// v2ray:api:beta
 type Interruptible interface {
 type Interruptible interface {
 	Interrupt()
 	Interrupt()
 }
 }
 
 
 // Close closes the obj if it is a Closable.
 // Close closes the obj if it is a Closable.
+//
+// v2ray:api:beta
 func Close(obj interface{}) error {
 func Close(obj interface{}) error {
 	if c, ok := obj.(Closable); ok {
 	if c, ok := obj.(Closable); ok {
 		return c.Close()
 		return c.Close()
@@ -20,6 +28,8 @@ func Close(obj interface{}) error {
 }
 }
 
 
 // Interrupt calls Interrupt() if object implements Interruptible interface, or Close() if the object implements Closable interface.
 // Interrupt calls Interrupt() if object implements Interruptible interface, or Close() if the object implements Closable interface.
+//
+// v2ray:api:beta
 func Interrupt(obj interface{}) error {
 func Interrupt(obj interface{}) error {
 	if c, ok := obj.(Interruptible); ok {
 	if c, ok := obj.(Interruptible); ok {
 		c.Interrupt()
 		c.Interrupt()
@@ -43,15 +53,16 @@ type HasType interface {
 	Type() interface{}
 	Type() interface{}
 }
 }
 
 
+// ChainedClosable is a Closable that consists of multiple Closable objects.
 type ChainedClosable []Closable
 type ChainedClosable []Closable
 
 
-func NewChainedClosable(c ...Closable) ChainedClosable {
-	return ChainedClosable(c)
-}
-
+// Close implements Closable.
 func (cc ChainedClosable) Close() error {
 func (cc ChainedClosable) Close() error {
+	var errs []error
 	for _, c := range cc {
 	for _, c := range cc {
-		c.Close()
+		if err := c.Close(); err != nil {
+			errs = append(errs, err)
+		}
 	}
 	}
-	return nil
+	return errors.Combine(errs...)
 }
 }

+ 1 - 1
transport/internet/http/dialer.go

@@ -110,7 +110,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
 	return net.NewConnection(
 	return net.NewConnection(
 		net.ConnectionOutput(response.Body),
 		net.ConnectionOutput(response.Body),
 		net.ConnectionInput(bwriter),
 		net.ConnectionInput(bwriter),
-		net.ConnectionOnClose(common.NewChainedClosable(breader, bwriter, response.Body)),
+		net.ConnectionOnClose(common.ChainedClosable{breader, bwriter, response.Body}),
 	), nil
 	), nil
 }
 }
 
 

+ 1 - 1
transport/internet/http/hub.go

@@ -80,7 +80,7 @@ func (l *Listener) ServeHTTP(writer http.ResponseWriter, request *http.Request)
 	conn := net.NewConnection(
 	conn := net.NewConnection(
 		net.ConnectionOutput(request.Body),
 		net.ConnectionOutput(request.Body),
 		net.ConnectionInput(flushWriter{w: writer, d: done}),
 		net.ConnectionInput(flushWriter{w: writer, d: done}),
-		net.ConnectionOnClose(common.NewChainedClosable(done, request.Body)),
+		net.ConnectionOnClose(common.ChainedClosable{done, request.Body}),
 		net.ConnectionLocalAddr(l.Addr()),
 		net.ConnectionLocalAddr(l.Addr()),
 		net.ConnectionRemoteAddr(remoteAddr),
 		net.ConnectionRemoteAddr(remoteAddr),
 	)
 	)