|  | @@ -1,8 +1,11 @@
 | 
	
		
			
				|  |  |  package http_test
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  | +	"net"
 | 
	
		
			
				|  |  |  	"testing"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	"time"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/buf"
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/serial"
 | 
	
		
			
				|  |  |  	"v2ray.com/core/testing/assert"
 | 
	
	
		
			
				|  | @@ -16,8 +19,11 @@ func TestReaderWriter(t *testing.T) {
 | 
	
		
			
				|  |  |  	b := buf.NewLocal(256)
 | 
	
		
			
				|  |  |  	b.AppendSupplier(serial.WriteString("abcd" + ENDING))
 | 
	
		
			
				|  |  |  	writer := NewHeaderWriter(b)
 | 
	
		
			
				|  |  | -	writer.Write(cache)
 | 
	
		
			
				|  |  | -	cache.Write([]byte{'e', 'f', 'g'})
 | 
	
		
			
				|  |  | +	err := writer.Write(cache)
 | 
	
		
			
				|  |  | +	assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +	assert.Int(cache.Len()).Equals(8)
 | 
	
		
			
				|  |  | +	_, err = cache.Write([]byte{'e', 'f', 'g'})
 | 
	
		
			
				|  |  | +	assert.Error(err).IsNil()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	reader := &HeaderReader{}
 | 
	
		
			
				|  |  |  	buffer, err := reader.Read(cache)
 | 
	
	
		
			
				|  | @@ -47,3 +53,48 @@ func TestRequestHeader(t *testing.T) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	assert.String(cache.String()).Equals("GET / HTTP/1.1\r\nTest: Value\r\n\r\n")
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func TestConnection(t *testing.T) {
 | 
	
		
			
				|  |  | +	assert := assert.On(t)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	factory := HttpAuthenticatorFactory{}
 | 
	
		
			
				|  |  | +	auth := factory.Create(new(Config))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	listener, err := net.Listen("tcp", "127.0.0.1:0")
 | 
	
		
			
				|  |  | +	assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	go func() {
 | 
	
		
			
				|  |  | +		conn, err := listener.Accept()
 | 
	
		
			
				|  |  | +		assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +		authConn := auth.Server(conn)
 | 
	
		
			
				|  |  | +		b := make([]byte, 256)
 | 
	
		
			
				|  |  | +		for {
 | 
	
		
			
				|  |  | +			n, err := authConn.Read(b)
 | 
	
		
			
				|  |  | +			assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +			_, err = authConn.Write(b[:n])
 | 
	
		
			
				|  |  | +			assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr))
 | 
	
		
			
				|  |  | +	assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	authConn := auth.Client(conn)
 | 
	
		
			
				|  |  | +	authConn.Write([]byte("Test payload"))
 | 
	
		
			
				|  |  | +	authConn.Write([]byte("Test payload 2"))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	expectedResponse := "Test payloadTest payload 2"
 | 
	
		
			
				|  |  | +	actualResponse := make([]byte, 256)
 | 
	
		
			
				|  |  | +	deadline := time.Now().Add(time.Second * 5)
 | 
	
		
			
				|  |  | +	totalBytes := 0
 | 
	
		
			
				|  |  | +	for {
 | 
	
		
			
				|  |  | +		n, err := authConn.Read(actualResponse[totalBytes:])
 | 
	
		
			
				|  |  | +		assert.Error(err).IsNil()
 | 
	
		
			
				|  |  | +		totalBytes += n
 | 
	
		
			
				|  |  | +		if totalBytes >= len(expectedResponse) || time.Now().After(deadline) {
 | 
	
		
			
				|  |  | +			break
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	assert.String(string(actualResponse[:totalBytes])).Equals(expectedResponse)
 | 
	
		
			
				|  |  | +}
 |