func (p *DirectProxy) Serve(session *proxy.ProxySession, ev event.Event) error { if nil == session.Remote || session.Remote.C.Closed() { switch ev.(type) { case *event.TCPOpenEvent: case *event.HTTPRequestEvent: case *event.UDPEvent: default: session.Close() return fmt.Errorf("Can NOT create direct channel by event:%T", ev) } c, err := newDirectChannel(ev, &p.conf) if nil != err { session.Close() return err } session.Remote = &proxy.RemoteChannel{ Addr: c.addr, DirectIO: true, } session.Remote.C = c if c.httpsProxyConn { session.Hijacked = true return nil } } if nil == session.Remote { return fmt.Errorf("No remote connected.") } switch ev.(type) { case *event.UDPEvent: session.Remote.WriteRaw(ev.(*event.UDPEvent).Content) case *event.ConnCloseEvent: session.Remote.Close() case *event.TCPOpenEvent: case *event.ConnTestEvent: //do nothing case *event.TCPChunkEvent: session.Remote.WriteRaw(ev.(*event.TCPChunkEvent).Content) case *event.HTTPRequestEvent: req := ev.(*event.HTTPRequestEvent) content := req.HTTPEncode() _, err := session.Remote.WriteRaw(content) if nil != err { closeEv := &event.ConnCloseEvent{} closeEv.SetId(ev.GetId()) proxy.HandleEvent(closeEv) return err } return nil default: log.Printf("Invalid event type:%T to process", ev) } return nil }
func (p *PaasProxy) Serve(session *proxy.ProxySession, ev event.Event) error { if nil == session.Remote { session.SetRemoteChannel(p.cs.Select()) //session.Remote = p.cs.Select() if session.Remote == nil { session.Close() return fmt.Errorf("No proxy channel in PaasProxy") } } switch ev.(type) { case *event.TCPChunkEvent: session.Remote.Write(ev) case *event.ConnTestEvent: session.Remote.Write(ev) case *event.UDPEvent: session.Remote.Write(ev) case *event.TCPOpenEvent: session.Remote.Write(ev) case *event.ConnCloseEvent: session.Remote.Write(ev) case *event.HTTPRequestEvent: if strings.EqualFold(ev.(*event.HTTPRequestEvent).Method, "Connect") { session.Hijacked = true host := ev.(*event.HTTPRequestEvent).Headers.Get("Host") tcpOpen := &event.TCPOpenEvent{Addr: host} tcpOpen.SetId(ev.GetId()) session.Remote.Write(tcpOpen) } else { session.Remote.Write(ev) } default: session.Close() log.Printf("Invalid event type:%T to process", ev) } return nil }