Documentation
¶
Index ¶
- Constants
- Variables
- func CheckSupportMultiplex(proto string) bool
- func Redirect(w bfe_http.ResponseWriter, r *bfe_http.Request, urlStr string, code int, ...)
- func StartUp(cfg bfe_conf.BfeConfig, version string, confRoot string, dryRun bool) error
- type BfeListener
- type BfeMonitor
- type BfeServer
- func (srv *BfeServer) BalTableStatusGet(query url.Values) ([]byte, error)
- func (srv *BfeServer) BalTableVersionGet(query url.Values) ([]byte, error)
- func (srv *BfeServer) Balance(e interface{}) (*backend.BfeBackend, error)
- func (srv *BfeServer) CheckGracefulShutdown() bool
- func (srv *BfeServer) ClusterTableVersionGet(query url.Values) ([]byte, error)
- func (srv *BfeServer) FindLocation(request *bfe_basic.Request) (string, error)
- func (srv *BfeServer) FindProduct(conn net.Conn) string
- func (s *BfeServer) GetCheckConf(clusterName string) (*cluster_conf.BackendCheck, *cluster_conf.BackendHTTPS)
- func (srv *BfeServer) GetServerConf() *bfe_route.ServerDataConf
- func (srv *BfeServer) GslbDataConfReload(query url.Values) error
- func (srv *BfeServer) HostTableStatusGet(query url.Values) ([]byte, error)
- func (srv *BfeServer) HostTableVersionGet(query url.Values) ([]byte, error)
- func (srv *BfeServer) InitConfig()
- func (srv *BfeServer) InitDataLoad() error
- func (srv *BfeServer) InitHttp() (err error)
- func (srv *BfeServer) InitHttps() (err error)
- func (srv *BfeServer) InitListeners(config bfe_conf.BfeConfig) error
- func (srv *BfeServer) InitModules() error
- func (srv *BfeServer) InitSignalTable()
- func (srv *BfeServer) InitWebMonitor(port int) error
- func (srv *BfeServer) ModuleHandlersGetJSON() ([]byte, error)
- func (srv *BfeServer) ModuleStatusGetJSON() ([]byte, error)
- func (srv *BfeServer) NameConfReload(query url.Values) error
- func (srv *BfeServer) RegisterModules(modules []string) error
- func (srv *BfeServer) Serve(l net.Listener, raw net.Listener, proto string) error
- func (srv *BfeServer) ServeHttp(ln net.Listener) error
- func (srv *BfeServer) ServeHttps(ln *HttpsListener) error
- func (srv *BfeServer) ServerDataConfReload(query url.Values) error
- func (srv *BfeServer) SessionTicketKeyReload() error
- func (srv *BfeServer) ShutdownHandler(sig os.Signal)
- func (srv *BfeServer) TLSConfReload(query url.Values) error
- type BufferFiller
- type BufioCache
- type CloseNotifier
- type HttpsListener
- type MultiCertMap
- type NameCertMap
- type NextProtosConf
- type ProtocolHandler
- type ProxyState
- func (s *ProxyState) ClientConnActiveDec(proto string, value uint)
- func (s *ProxyState) ClientConnActiveInc(proto string, value uint)
- func (s *ProxyState) ClientConnServedInc(proto string, value uint)
- func (s *ProxyState) ClientReqActiveDec(proto string, value uint)
- func (s *ProxyState) ClientReqActiveInc(proto string, value uint)
- func (s *ProxyState) ClientReqServedInc(proto string, value uint)
- type ReverseProxy
- type RoundTripperMap
- type ServerRule
- type ServerSessionCache
- type ServerStatus
- type TLSServerRuleMap
- func (m *TLSServerRuleMap) EnableNextProto(proto string, state bool)
- func (m *TLSServerRuleMap) Get(c *bfe_tls.Conn) *bfe_tls.Rule
- func (m *TLSServerRuleMap) GetHTTP2Rule(c *bfe_tls.Conn) *bfe_http2.Rule
- func (m *TLSServerRuleMap) GetStreamRule(c *bfe_tls.Conn) *bfe_stream.Rule
- func (m *TLSServerRuleMap) StatusNextProto() (enableHttp2 bool, enableSpdy bool)
- func (m *TLSServerRuleMap) Update(conf tls_rule_conf.BfeTlsRuleConf, clientCAMap map[string]*x509.CertPool, ...)
- type Version
Constants ¶
const ( DC_INTERVAL = 60 // interval for moving current to past (in s) DC_BUCKET_SIZE_PROXY = 1 // size of delay counter bucket for forwarding (in ms) DC_BUCKET_SIZE_HS = 100 // size of delay counter bucket for handshake (in ms) DC_BUCKET_NUM = 10 // number of delay counter bucket )
setting for delay
const ( KP_PROXY_DELAY = "proxy_delay" KP_PROXY_POST_DEALY = "proxy_post_delay" KP_PROXY_HANDSHAKE_DELAY = "proxy_handshake_delay" KP_PROXY_HANDSHAKE_FULL_DELAY = "proxy_handshake_full_delay" KP_PROXY_HANDSHAKE_RESUME_DELAY = "proxy_handshake_resume_delay" KP_PROXY_STATE = "proxy_state" )
key prefix
const TrailerPrefix = "Trailer:"
TrailerPrefix is a magic prefix for ResponseWriter.Header map keys that, if present, signals that the map entry is actually for the response trailers, and not the response headers. The prefix is stripped after the ServeHTTP call finishes and the values are sent in the trailers.
This mechanism is intended only for trailers that are not known prior to the headers being written. If the set of trailers is fixed or known before the header is written, the normal Go trailers mechanism is preferred:
https://golang.org/pkg/net/http/#ResponseWriter https://golang.org/pkg/net/http/#example_ResponseWriter_trailers
Variables ¶
var ( ErrBodyNotAllowed = errors.New("http: request method or response status code does not allow body") ErrContentLength = errors.New("Conn.Write wrote more than the declared Content-Length") ErrHijacked = errors.New("http: connection has been hijacked") )
Errors introduced by the HTTP server.
var (
DefaultNextProtos = []string{tls_rule_conf.HTTP11}
)
var ErrExpectContinueReaderPeek = errors.New("http: expect continue reader peek failed")
Functions ¶
func CheckSupportMultiplex ¶
CheckSupportMultiplex checks whether protocol support request multiplexing on a conn.
Types ¶
type BfeListener ¶
type BfeListener struct {
// Listener is the underlying tcp listener
Listener net.Listener
// BalancerType is the type of Layer4 load balancer
BalancerType string
// ProxyHeaderTimeout Optionally specifies the timeout value to
// receive the Proxy Protocol Header. Zero means no timeout.
ProxyHeaderTimeout time.Duration
// ProxyHeaderLimit Optionally specifies the maximum bytes to
// receive the Proxy Protocol Header. Zero means default value.
ProxyHeaderLimit int64
}
BfeListener is used to wrap an underlying TCP listener, which accept connections behind a layer4 load balancer (PROXY)
func NewBfeListener ¶
func NewBfeListener(listener net.Listener, config bfe_conf.BfeConfig) *BfeListener
NewBfeListener return bfe listener according to config
func (*BfeListener) Accept ¶
func (l *BfeListener) Accept() (net.Conn, error)
Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic net.Conn.
func (*BfeListener) Addr ¶
func (l *BfeListener) Addr() net.Addr
Addr returns the underlying listener's network address.
func (*BfeListener) Close ¶
func (l *BfeListener) Close() error
Close closes the underlying listener.
type BfeMonitor ¶
type BfeMonitor struct {
WebServer *web_monitor.MonitorServer
WebHandlers *web_monitor.WebHandlers
// contains filtered or unexported fields
}
func (*BfeMonitor) Start ¶
func (m *BfeMonitor) Start()
func (*BfeMonitor) WebHandlersInit ¶
func (m *BfeMonitor) WebHandlersInit(srv *BfeServer) error
type BfeServer ¶
type BfeServer struct {
bfe_http.Server
HttpListener net.Listener // listener for http
HttpsListener *HttpsListener // listener for https
// for http server
ReverseProxy *ReverseProxy // reverse proxy
// TLS session cache
SessionCache *ServerSessionCache
// TLS certificates
MultiCert *MultiCertMap
// TLS server rule
TLSServerRule *TLSServerRuleMap
// server config
Config bfe_conf.BfeConfig
ConfRoot string
// module and callback
CallBacks *bfe_module.BfeCallbacks // call back functions
Modules *bfe_module.BfeModules // bfe modules
// web server for bfe monitor and reload
Monitor *BfeMonitor
// bufio cache
BufioCache *BufioCache
// signal table
SignalTable *signal_table.SignalTable
ServerConf *bfe_route.ServerDataConf // cluster_conf and host table conf
Version string // version of bfe server
// contains filtered or unexported fields
}
func NewBfeServer ¶
NewBfeServer create a new instance of BfeServer.
func (*BfeServer) BalTableStatusGet ¶
BalTableStatusGet returns state of balTable.
func (*BfeServer) BalTableVersionGet ¶
BalTableVersionGet returns versions of balTable.
func (*BfeServer) Balance ¶
func (srv *BfeServer) Balance(e interface{}) (*backend.BfeBackend, error)
Balance finds backend for proxied conn (under tls proxy mode).
func (*BfeServer) CheckGracefulShutdown ¶
CheckGracefulShutdown check whether the server is in graceful shutdown state.
func (*BfeServer) ClusterTableVersionGet ¶
ClusterTableVersionGet returns versions of clusterTable.
func (*BfeServer) FindLocation ¶
FindLocation finds product and cluster for given request
func (*BfeServer) FindProduct ¶
FindProduct finds product for proxied conn (under tls proxy mode).
func (*BfeServer) GetCheckConf ¶
func (s *BfeServer) GetCheckConf(clusterName string) (*cluster_conf.BackendCheck, *cluster_conf.BackendHTTPS)
GetCheckConf implements CheckConfFetcher and return current health check configuration.
func (*BfeServer) GetServerConf ¶
func (srv *BfeServer) GetServerConf() *bfe_route.ServerDataConf
func (*BfeServer) GslbDataConfReload ¶
GslbDataConfReload reloads gslb and cluster conf.
func (*BfeServer) HostTableStatusGet ¶
HostTableStatusGet returns status of HostTable in json.
func (*BfeServer) HostTableVersionGet ¶
HostTableVersionGet returns version of HostTable in json.
func (*BfeServer) InitConfig ¶
func (srv *BfeServer) InitConfig()
InitConfig set some parameter based on config.
func (*BfeServer) InitDataLoad ¶
InitDataLoad load data when bfe start.
func (*BfeServer) InitListeners ¶
func (*BfeServer) InitModules ¶
func (*BfeServer) InitSignalTable ¶
func (srv *BfeServer) InitSignalTable()
func (*BfeServer) InitWebMonitor ¶
func (*BfeServer) ModuleHandlersGetJSON ¶
func (*BfeServer) ModuleStatusGetJSON ¶
func (*BfeServer) NameConfReload ¶
NameConfReload reloads name conf data.
func (*BfeServer) RegisterModules ¶
RegisterModules registers bfe work module.
func (*BfeServer) Serve ¶
Serve accepts incoming connections on the Listener l, creating a new service goroutine for each. The service goroutines read requests and then call srv.Handler to reply to them.
Params
- l : net listener
- raw: underlying tcp listener (different from `l` in HTTPS)
Return
- err: error
func (*BfeServer) ServeHttps ¶
func (srv *BfeServer) ServeHttps(ln *HttpsListener) error
ServeHttps accept incoming https connections
func (*BfeServer) ServerDataConfReload ¶
ServerDataConfReload reloads host/route/cluster conf
func (*BfeServer) SessionTicketKeyReload ¶
SessionTicketKeyReload reloads for session ticket key.
func (*BfeServer) ShutdownHandler ¶
ShutdownHandler is signal handler for QUIT
type BufferFiller ¶ added in v1.8.0
type BufferFiller interface {
FillBuffer() error
}
type CloseNotifier ¶
type CloseNotifier interface {
// CloseNotify returns a channel that receives a single value
// when the client connection has gone away.
CloseNotify() <-chan bool
}
The CloseNotifier interface is implemented by ResponseWriters which allow detecting when the underlying connection has gone away.
This mechanism can be used to cancel long operations on the server if the client has disconnected before the response is ready.
type HttpsListener ¶
type HttpsListener struct {
// contains filtered or unexported fields
}
func NewHttpsListener ¶
func NewHttpsListener(listener net.Listener, config *bfe_tls.Config) *HttpsListener
func (*HttpsListener) UpdateSessionTicketKey ¶
func (l *HttpsListener) UpdateSessionTicketKey(key []byte)
UpdateSessionTicketKey updates session ticket key.
type MultiCertMap ¶
type MultiCertMap struct {
// contains filtered or unexported fields
}
func NewMultiCertMap ¶
func NewMultiCertMap(state *ProxyState) *MultiCertMap
func (*MultiCertMap) Get ¶
func (m *MultiCertMap) Get(c *bfe_tls.Conn) *bfe_tls.Certificate
Get gets certificate for given connection.
func (*MultiCertMap) GetDefault ¶
func (m *MultiCertMap) GetDefault() *bfe_tls.Certificate
func (*MultiCertMap) Update ¶
func (m *MultiCertMap) Update(certConf map[string]*bfe_tls.Certificate, ruleMap tls_rule_conf.TlsRuleMap) error
Update updates all certificates.
type NameCertMap ¶
type NameCertMap struct {
// contains filtered or unexported fields
}
func NewNameCertMap ¶
func NewNameCertMap() *NameCertMap
func (*NameCertMap) Get ¶
func (m *NameCertMap) Get(serverName string) *bfe_tls.Certificate
func (*NameCertMap) Update ¶
func (m *NameCertMap) Update(certConf map[string]*bfe_tls.Certificate)
type NextProtosConf ¶
type NextProtosConf struct {
// contains filtered or unexported fields
}
func NewNextProtosConf ¶
func NewNextProtosConf(rule *TLSServerRuleMap, protoConf []string) *NextProtosConf
type ProtocolHandler ¶
type ProtocolHandler struct {
// contains filtered or unexported fields
}
func NewProtocolHandler ¶
func NewProtocolHandler(conn *conn, proto string) *ProtocolHandler
func (*ProtocolHandler) ServeHTTP ¶
func (p *ProtocolHandler) ServeHTTP(rw bfe_http.ResponseWriter, request *bfe_http.Request)
ServeHTTP processes http request and send http response.
Params:
- w : a response writer
- r : a http request
type ProxyState ¶
type ProxyState struct {
// panic
PanicClientConnServe *metrics.Counter // panic when accept from client
PanicBackendWrite *metrics.Counter // panic when write to backend
PanicBackendRead *metrics.Counter // panic when read from backend
// client side errors
ErrClientLongUrl *metrics.Counter
ErrClientLongHeader *metrics.Counter
ErrClientClose *metrics.Counter
ErrClientTimeout *metrics.Counter
ErrClientBadRequest *metrics.Counter
ErrClientZeroContentlen *metrics.Counter
ErrClientExpectFail *metrics.Counter
ErrClientConnAccept *metrics.Counter
ErrClientWrite *metrics.Counter
ErrClientReset *metrics.Counter
// route config errors
ErrBkFindProduct *metrics.Counter
ErrBkFindLocation *metrics.Counter
ErrBkNoBalance *metrics.Counter
ErrBkNoCluster *metrics.Counter
ErrBkBodyProcess *metrics.Counter
// backend side errors
ErrBkConnectBackend *metrics.Counter
ErrBkRequestBackend *metrics.Counter
ErrBkWriteRequest *metrics.Counter
ErrBkReadRespHeader *metrics.Counter
ErrBkRespHeaderTimeout *metrics.Counter
ErrBkTransportBroken *metrics.Counter
// tls handshake
TlsHandshakeAll *metrics.Counter
TlsHandshakeSucc *metrics.Counter
// tls session cache
SessionCacheConn *metrics.Counter
SessionCacheConnFail *metrics.Counter
SessionCacheSet *metrics.Counter
SessionCacheSetFail *metrics.Counter
SessionCacheGet *metrics.Counter
SessionCacheGetFail *metrics.Counter
SessionCacheTypeNotBytes *metrics.Counter
SessionCacheMiss *metrics.Counter
SessionCacheHit *metrics.Counter
SessionCacheNoInstance *metrics.Counter
// tls multiply certificates
TlsMultiCertGet *metrics.Counter
TlsMultiCertConnWithoutVip *metrics.Counter
TlsMultiCertConnVipUnknown *metrics.Counter
TlsMultiCertConnWithoutSni *metrics.Counter
TlsMultiCertUseDefault *metrics.Counter
TlsMultiCertUpdate *metrics.Counter
TlsMultiCertUpdateErr *metrics.Counter
// client side
ClientReqWithRetry *metrics.Counter // req served with retry
ClientReqWithCrossRetry *metrics.Counter // req served with cross cluster retry
ClientReqFail *metrics.Counter // req with ErrCode != nil
ClientReqFailWithNoRetry *metrics.Counter // req fail with no retry
ClientConnUse100Continue *metrics.Counter // connection used Expect 100 Continue
ClientConnUnfinishedReq *metrics.Counter // connection closed with unfinished request
// request successful received
ClientReqServed *metrics.Counter
HttpClientReqServed *metrics.Counter
HttpsClientReqServed *metrics.Counter
Http2ClientReqServed *metrics.Counter
SpdyClientReqServed *metrics.Counter
// active request
ClientReqActive *metrics.Gauge
HttpClientReqActive *metrics.Gauge
HttpsClientReqActive *metrics.Gauge
Http2ClientReqActive *metrics.Gauge
SpdyClientReqActive *metrics.Gauge
// connection successful accepted
ClientConnServed *metrics.Counter
HttpClientConnServed *metrics.Counter
HttpsClientConnServed *metrics.Counter
Http2ClientConnServed *metrics.Counter
SpdyClientConnServed *metrics.Counter
StreamClientConnServed *metrics.Counter
WsClientConnServed *metrics.Counter
WssClientConnServed *metrics.Counter
// active connection
ClientConnActive *metrics.Gauge
HttpClientConnActive *metrics.Gauge
HttpsClientConnActive *metrics.Gauge
Http2ClientConnActive *metrics.Gauge
SpdyClientConnActive *metrics.Gauge
StreamClientConnActive *metrics.Gauge
WsClientConnActive *metrics.Gauge
WssClientConnActive *metrics.Gauge
}
func (*ProxyState) ClientConnActiveDec ¶
func (s *ProxyState) ClientConnActiveDec(proto string, value uint)
func (*ProxyState) ClientConnActiveInc ¶
func (s *ProxyState) ClientConnActiveInc(proto string, value uint)
func (*ProxyState) ClientConnServedInc ¶
func (s *ProxyState) ClientConnServedInc(proto string, value uint)
func (*ProxyState) ClientReqActiveDec ¶
func (s *ProxyState) ClientReqActiveDec(proto string, value uint)
func (*ProxyState) ClientReqActiveInc ¶
func (s *ProxyState) ClientReqActiveInc(proto string, value uint)
func (*ProxyState) ClientReqServedInc ¶
func (s *ProxyState) ClientReqServedInc(proto string, value uint)
type ReverseProxy ¶
type ReverseProxy struct {
// contains filtered or unexported fields
}
ReverseProxy takes an incoming request and sends it to another server, proxying the response back to the client.
func NewReverseProxy ¶
func NewReverseProxy(server *BfeServer, state *ProxyState) *ReverseProxy
NewReverseProxy returns a new ReverseProxy.
func (*ReverseProxy) FinishReq ¶
func (p *ReverseProxy) FinishReq(rw bfe_http.ResponseWriter, request *bfe_basic.Request) (action int)
FinishReq should be invoked after quit ServHTTP().
func (*ReverseProxy) ServeHTTP ¶
func (p *ReverseProxy) ServeHTTP(rw bfe_http.ResponseWriter, basicReq *bfe_basic.Request) (action int)
ServeHTTP processes http request and send http response.
Params:
- rw : context for sending response
- request: context for request
Return:
- action: action to do after ServeHTTP
type RoundTripperMap ¶
type RoundTripperMap map[string]bfe_http.RoundTripper
RoundTripperMap holds mappings from cluster-name to RoundTripper.
type ServerRule ¶
type ServerSessionCache ¶
type ServerSessionCache struct {
Servers []string // tcp address for redis servers
ConnectTimeout time.Duration // connect timeout (ms)
ReadTimeout time.Duration // read timeout (ms)
WriteTimeout time.Duration // write timeout (ms)
KeyPrefix string // prefix for cache key
SessionExpire int // expire time for tls session state (s)
MaxIdle int // max idle connections in pool
// contains filtered or unexported fields
}
func NewServerSessionCache ¶
func NewServerSessionCache(conf bfe_conf.ConfigSessionCache, state *ProxyState) ( c *ServerSessionCache)
func (*ServerSessionCache) Get ¶
func (c *ServerSessionCache) Get(sessionKey string) ([]byte, bool)
Get gets sessionState from session cache.
func (*ServerSessionCache) Put ¶
func (c *ServerSessionCache) Put(sessionKey string, sessionState []byte) (err error)
Put saves sessionState to session cache.
func (*ServerSessionCache) UpdatePool ¶
func (c *ServerSessionCache) UpdatePool(pool *redis.Pool) *redis.Pool
func (*ServerSessionCache) UpdateServers ¶
func (c *ServerSessionCache) UpdateServers(servers []string)
type ServerStatus ¶
type ServerStatus struct {
// for proxy protocol
ProxyProtocolState *bfe_proxy.ProxyState
ProxyProtocolMetrics metrics.Metrics
// for tls protocol
TlsState *bfe_tls.TlsState
TlsMetrics metrics.Metrics
// for spdy protocol
SpdyState *bfe_spdy.SpdyState
SpdyMetrics metrics.Metrics
// for http2 protocol
Http2State *bfe_http2.Http2State
Http2Metrics metrics.Metrics
// for http protocol
HttpState *bfe_http.HttpState
HttpMetrics metrics.Metrics
// for stream protocol (tls proxy)
StreamState *bfe_stream.StreamState
StreamMetrics metrics.Metrics
// for websocket protocol (websocket proxy)
WebSocketState *bfe_websocket.WebSocketState
WebSocketMetrics metrics.Metrics
// for balance
BalState *bal.BalErrState
BalMetrics metrics.Metrics
// for proxy
ProxyState *ProxyState
ProxyMetrics metrics.Metrics
// for monitor "internal delay"
ProxyDelay *delay_counter.DelayRecent
// for monitor "internal delay" of post/put request
ProxyPostDelay *delay_counter.DelayRecent
// for monitor "internal delay" of tls handshake
ProxyHandshakeDelay *delay_counter.DelayRecent
ProxyHandshakeFullDelay *delay_counter.DelayRecent
ProxyHandshakeResumeDelay *delay_counter.DelayRecent
}
func NewServerStatus ¶
func NewServerStatus() *ServerStatus
type TLSServerRuleMap ¶
type TLSServerRuleMap struct {
// contains filtered or unexported fields
}
func NewTLSServerRuleMap ¶
func NewTLSServerRuleMap(state *ProxyState) *TLSServerRuleMap
func (*TLSServerRuleMap) EnableNextProto ¶
func (m *TLSServerRuleMap) EnableNextProto(proto string, state bool)
func (*TLSServerRuleMap) Get ¶
func (m *TLSServerRuleMap) Get(c *bfe_tls.Conn) *bfe_tls.Rule
Get returns tls rule for given connection.
func (*TLSServerRuleMap) GetHTTP2Rule ¶
func (m *TLSServerRuleMap) GetHTTP2Rule(c *bfe_tls.Conn) *bfe_http2.Rule
GetHTTP2Rule returns h2 rule for given connection.
func (*TLSServerRuleMap) GetStreamRule ¶
func (m *TLSServerRuleMap) GetStreamRule(c *bfe_tls.Conn) *bfe_stream.Rule
GetStreamRule returns stream rule for given connection.
func (*TLSServerRuleMap) StatusNextProto ¶
func (m *TLSServerRuleMap) StatusNextProto() (enableHttp2 bool, enableSpdy bool)
func (*TLSServerRuleMap) Update ¶
func (m *TLSServerRuleMap) Update(conf tls_rule_conf.BfeTlsRuleConf, clientCAMap map[string]*x509.CertPool, clientCRLPoolMap map[string]*bfe_tls.CRLPool)
Source Files
¶
- bfe_confdata_load.go
- bfe_listener.go
- bfe_server.go
- bfe_server_init.go
- bufio_cache.go
- chunk_writer.go
- expect_continue_reader.go
- find_location.go
- http_conn.go
- http_server.go
- https_listener.go
- monitor_stat.go
- protocol_handler.go
- proxy_state.go
- redirect.go
- register_modules.go
- response.go
- reverseproxy.go
- server_status.go
- set_client_addr.go
- tls_multi_cert.go
- tls_server_rule.go
- tls_session_cache.go
- web_server.go