func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, reader io.Reader, writer io.Writer) error { if len(request.URL.Host) <= 0 { response := generateResponse(400, "Bad Request") return response.Write(writer) } request.Host = request.URL.Host StripHopByHopHeaders(request) ray := s.packetDispatcher.DispatchToOutbound(ctx) input := ray.InboundInput() output := ray.InboundOutput() requestDone := signal.ExecuteAsync(func() error { defer input.Close() requestWriter := bufio.NewWriter(buf.NewBytesWriter(ray.InboundInput())) err := request.Write(requestWriter) if err != nil { return err } if err := requestWriter.Flush(); err != nil { return err } return nil }) responseDone := signal.ExecuteAsync(func() error { responseReader := bufio.OriginalReader(buf.NewBytesReader(ray.InboundOutput())) response, err := http.ReadResponse(responseReader, request) if err != nil { log.Warning("HTTP: Failed to read response: ", err) response = generateResponse(503, "Service Unavailable") } responseWriter := bufio.NewWriter(writer) if err := response.Write(responseWriter); err != nil { return err } if err := responseWriter.Flush(); err != nil { return err } return nil }) if err := signal.ErrorOrFinish2(requestDone, responseDone); err != nil { log.Info("HTTP|Server: Connecton ending with ", err) input.CloseError() output.CloseError() return err } return nil }
func NewProxyConnection(src v2net.Address, dest v2net.Destination, stream ray.Ray) *ProxyConnection { return &ProxyConnection{ stream: stream, localAddr: &net.TCPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, remoteAddr: &net.TCPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, reader: buf.NewBytesReader(stream.InboundOutput()), writer: buf.NewBytesWriter(stream.InboundInput()), } }
func NewConnection(stream ray.Ray) *Connection { return &Connection{ stream: stream, localAddr: &net.TCPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, remoteAddr: &net.TCPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, reader: buf.NewBytesReader(stream.InboundOutput()), writer: buf.NewBytesWriter(stream.InboundInput()), } }
func (v *Server) handlePlainHTTP(request *http.Request, session *proxy.SessionInfo, reader io.Reader, writer io.Writer) { if len(request.URL.Host) <= 0 { response := v.GenerateResponse(400, "Bad Request") response.Write(writer) return } request.Host = request.URL.Host StripHopByHopHeaders(request) ray := v.packetDispatcher.DispatchToOutbound(session) defer ray.InboundInput().Close() defer ray.InboundOutput().Release() var finish sync.WaitGroup finish.Add(1) go func() { defer finish.Done() requestWriter := bufio.NewWriter(buf.NewBytesWriter(ray.InboundInput())) err := request.Write(requestWriter) if err != nil { log.Warning("HTTP: Failed to write request: ", err) return } requestWriter.Flush() }() finish.Add(1) go func() { defer finish.Done() responseReader := bufio.OriginalReader(buf.NewBytesReader(ray.InboundOutput())) response, err := http.ReadResponse(responseReader, request) if err != nil { log.Warning("HTTP: Failed to read response: ", err) response = v.GenerateResponse(503, "Service Unavailable") } responseWriter := bufio.NewWriter(writer) err = response.Write(responseWriter) if err != nil { log.Warning("HTTP: Failed to write response: ", err) return } responseWriter.Flush() }() finish.Wait() }