func (server *Server) Listen() (net.Listener, error) { listener, err := server.listen() if err != nil { return nil, err } // We use an idle timing listener to time out idle HTTP connections, since // the CDNs seem to like keeping lots of connections open indefinitely. return idletiming.Listener(listener, httpIdleTimeout, func(conn net.Conn) { err := conn.Close() if err != nil { log.Debugf("Unable to close connection: %v", err) } }), nil }
func (server *Server) ListenAndServe() error { err := server.CertContext.InitServerCert(strings.Split(server.Addr, ":")[0]) if err != nil { return fmt.Errorf("Unable to init server cert: %s", err) } // Set up an enproxy Proxy proxy := &enproxy.Proxy{ Dial: server.dialDestination, Host: server.Host, } if server.Host != "" { log.Debugf("Running as host %s", server.Host) } // Hook into stats reporting if necessary servingStats := server.startServingStatsIfNecessary() // Add callbacks to track bytes given proxy.OnBytesReceived = func(ip string, bytes int64) { statreporter.OnBytesGiven(ip, bytes) if servingStats { server.StatServer.OnBytesReceived(ip, bytes) } } proxy.OnBytesSent = func(ip string, bytes int64) { statreporter.OnBytesGiven(ip, bytes) if servingStats { server.StatServer.OnBytesSent(ip, bytes) } } proxy.Start() httpServer := &http.Server{ Handler: proxy, ReadTimeout: server.ReadTimeout, WriteTimeout: server.WriteTimeout, } log.Debugf("About to start server (https) proxy at %s", server.Addr) tlsConfig := server.TLSConfig if server.TLSConfig == nil { tlsConfig = DEFAULT_TLS_SERVER_CONFIG } cert, err := tls.LoadX509KeyPair(server.CertContext.ServerCertFile, server.CertContext.PKFile) if err != nil { return fmt.Errorf("Unable to load certificate and key from %s and %s: %s", server.CertContext.ServerCertFile, server.CertContext.PKFile, err) } tlsConfig.Certificates = []tls.Certificate{cert} listener, err := tls.Listen("tcp", server.Addr, tlsConfig) if err != nil { return fmt.Errorf("Unable to listen for tls connections at %s: %s", server.Addr, err) } // We use an idle timing listener to time out idle HTTP connections, since // the CDNs seem to like keeping lots of connections open indefinitely. idleTimingListener := idletiming.Listener(listener, httpIdleTimeout, nil) return httpServer.Serve(idleTimingListener) }