func (c *conn) serveSmart() { defer func() { if err := recover(); err != nil { const size = 4096 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] log.Printf("http: panic serving %v: %v\n%s", c.remoteAddr, err, buf) } if !c.hijacked() { c.close() } }() if tlsConn, ok := c.rwc.(*tls.Conn); ok { if d := c.server.ReadTimeout; d != 0 { c.rwc.SetReadDeadline(time.Now().Add(d)) } if d := c.server.WriteTimeout; d != 0 { c.rwc.SetWriteDeadline(time.Now().Add(d)) } if err := tlsConn.Handshake(); err != nil { return } c.tlsState = new(tls.ConnectionState) *c.tlsState = tlsConn.ConnectionState() if proto := c.tlsState.NegotiatedProtocol; validNPN(proto) { if fn := c.server.TLSNextProto[proto]; fn != nil { h := initNPNRequest{tlsConn, serverHandler{c.server}} fn(c.server, tlsConn, h) } return } } initial_bytes := make([]byte, start_bytes) // add smart detection n, err := c.rwc.Read(initial_bytes) if err != nil || n != start_bytes { return } if checkspdy(initial_bytes) { s := c.server z := new(http.Server) z.Addr = s.Addr z.Handler = s.inner_h z.ReadTimeout = s.ReadTimeout z.WriteTimeout = s.WriteTimeout z.MaxHeaderBytes = s.MaxHeaderBytes server_session := spdy.NewServerSession(NewSmartConn(c.rwc, initial_bytes), z) server_session.Serve() return } c2, err := c.server.newConn(NewSmartConn(c.rwc, initial_bytes)) if err != nil { return } c2.serve() }
/* NewServer returns an intialized endlessServer Object. Calling Serve on it will actually "start" the server. */ func NewServer(addr string, handler http.Handler) *endlessServer { var srv http.Server srv.Addr = addr srv.ReadTimeout = DefaultReadTimeOut srv.WriteTimeout = DefaultWriteTimeOut srv.MaxHeaderBytes = DefaultMaxHeaderBytes srv.Handler = handler return New(srv) }
func nextproto3(s *Server, c *tls.Conn, h Handler) { z := new(http.Server) z.Addr = s.Addr z.Handler = s.inner_h z.ReadTimeout = s.ReadTimeout z.WriteTimeout = s.WriteTimeout z.MaxHeaderBytes = s.MaxHeaderBytes if z.Handler == nil { z.Handler = http.DefaultServeMux } server_session := spdy.NewServerSession(c, z) server_session.Serve() }