|  | @@ -2,36 +2,53 @@ package http
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"net"
 | 
	
		
			
				|  |  | -	// "net/http"
 | 
	
		
			
				|  |  | +	"net/http"
 | 
	
		
			
				|  |  | +	"strings"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"github.com/v2ray/v2ray-core/app"
 | 
	
		
			
				|  |  | -	"github.com/v2ray/v2ray-core/common/log"
 | 
	
		
			
				|  |  | +	_ "github.com/v2ray/v2ray-core/common/log"
 | 
	
		
			
				|  |  |  	v2net "github.com/v2ray/v2ray-core/common/net"
 | 
	
		
			
				|  |  | -	jsonconfig "github.com/v2ray/v2ray-core/proxy/http/config/json"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type HttpProxyServer struct {
 | 
	
		
			
				|  |  |  	accepting  bool
 | 
	
		
			
				|  |  |  	dispatcher app.PacketDispatcher
 | 
	
		
			
				|  |  | -	config     *jsonconfig.HttpProxyConfig
 | 
	
		
			
				|  |  | +	config     Config
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func NewHttpProxyServer(dispatcher app.PacketDispatcher, config *jsonconfig.HttpProxyConfig) *HttpProxyServer {
 | 
	
		
			
				|  |  | +func NewHttpProxyServer(dispatcher app.PacketDispatcher, config Config) *HttpProxyServer {
 | 
	
		
			
				|  |  |  	return &HttpProxyServer{
 | 
	
		
			
				|  |  |  		dispatcher: dispatcher,
 | 
	
		
			
				|  |  |  		config:     config,
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (server *HttpProxyServer) Listen(port v2net.Port) error {
 | 
	
		
			
				|  |  | -	_, err := net.ListenTCP("tcp", &net.TCPAddr{
 | 
	
		
			
				|  |  | -		IP:   []byte{0, 0, 0, 0},
 | 
	
		
			
				|  |  | -		Port: int(port),
 | 
	
		
			
				|  |  | -		Zone: "",
 | 
	
		
			
				|  |  | -	})
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		log.Error("HTTP Proxy failed to listen on port %d: %v", port, err)
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +func (this *HttpProxyServer) Listen(port v2net.Port) error {
 | 
	
		
			
				|  |  | +	server := http.Server{
 | 
	
		
			
				|  |  | +		Addr:    ":" + port.String(),
 | 
	
		
			
				|  |  | +		Handler: this,
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | +	return server.ListenAndServe()
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (this *HttpProxyServer) ServeHTTP(w http.ResponseWriter, request *http.Request) {
 | 
	
		
			
				|  |  | +	if strings.ToUpper(request.Method) == "CONNECT" {
 | 
	
		
			
				|  |  | +		host, port, err := net.SplitHostPort(request.URL.Host)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			if strings.Contains(err.(*net.AddrError).Err, "missing port") {
 | 
	
		
			
				|  |  | +				host = request.URL.Host
 | 
	
		
			
				|  |  | +				port = "80"
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				http.Error(w, "Bad Request", 400)
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		_ = host + port
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (this *HttpProxyServer) handleConnect(response http.ResponseWriter, request *http.Request) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |