api/internal/endpoint/handler/http/proxy/handler.go

89 lines
1.9 KiB
Go
Raw Normal View History

2021-01-13 17:07:04 +00:00
package proxy
2020-04-08 22:59:22 +00:00
import (
"context"
"errors"
"net"
"net/http"
"github.com/soheilhy/cmux"
"gitlab.com/inetmock/inetmock/internal/endpoint"
2021-01-20 18:03:05 +00:00
imHttp "gitlab.com/inetmock/inetmock/internal/endpoint/handler/http"
"gitlab.com/inetmock/inetmock/pkg/logging"
2020-04-08 22:59:22 +00:00
"go.uber.org/zap"
"gopkg.in/elazarl/goproxy.v1"
2020-04-08 22:59:22 +00:00
)
const (
name = "http_proxy"
)
type httpProxy struct {
logger logging.Logger
proxy *goproxy.ProxyHttpServer
server *http.Server
2020-04-08 22:59:22 +00:00
}
func (h *httpProxy) Matchers() []cmux.Matcher {
return []cmux.Matcher{cmux.HTTP1()}
}
func (h *httpProxy) Start(lifecycle endpoint.Lifecycle) (err error) {
var opts httpProxyOptions
if err = lifecycle.UnmarshalOptions(&opts); err != nil {
return
}
2021-01-20 18:03:05 +00:00
h.server = &http.Server{
Handler: h.proxy,
ConnContext: imHttp.StoreConnPropertiesInContext,
}
h.logger = h.logger.With(
zap.String("handler_name", lifecycle.Name()),
zap.String("address", lifecycle.Uplink().Addr().String()),
)
tlsConfig := lifecycle.CertStore().TLSConfig()
proxyHandler := &proxyHttpHandler{
handlerName: lifecycle.Name(),
options: opts,
logger: h.logger,
emitter: lifecycle.Audit(),
}
2021-01-20 18:03:05 +00:00
proxyHTTPSHandler := &proxyHttpsHandler{
options: opts,
tlsConfig: tlsConfig,
emitter: lifecycle.Audit(),
}
h.proxy.OnRequest().Do(proxyHandler)
2021-01-20 18:03:05 +00:00
h.proxy.OnRequest().HandleConnect(proxyHTTPSHandler)
go h.startProxy(lifecycle.Uplink().Listener)
go h.shutdownOnContextDone(lifecycle.Context())
return
}
func (h *httpProxy) startProxy(listener net.Listener) {
if err := h.server.Serve(listener); err != nil && !errors.Is(err, http.ErrServerClosed) {
h.logger.Error(
"failed to start proxy server",
zap.Error(err),
)
}
2020-04-08 22:59:22 +00:00
}
func (h *httpProxy) shutdownOnContextDone(ctx context.Context) {
<-ctx.Done()
var err error
h.logger.Info("Shutting down HTTP proxy")
if err = h.server.Close(); err != nil {
h.logger.Error(
"failed to shutdown proxy endpoint",
zap.Error(err),
)
}
return
2020-04-08 22:59:22 +00:00
}