1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- package cproxy
- import "net/http"
- type defaultHandler struct {
- filter Filter
- clientConnector clientConnector
- serverConnector serverConnector
- meter monitor
- }
- func newHandler(filter Filter, clientConnector clientConnector, serverConnector serverConnector, meter monitor) *defaultHandler {
- return &defaultHandler{
- filter: filter,
- clientConnector: clientConnector,
- serverConnector: serverConnector,
- meter: meter,
- }
- }
- func (this *defaultHandler) ServeHTTP(response http.ResponseWriter, request *http.Request) {
- this.meter.Measure(MeasurementHTTPRequest)
- if request.Method != "CONNECT" {
- this.meter.Measure(MeasurementBadMethod)
- writeResponseStatus(response, http.StatusMethodNotAllowed)
- } else if !this.filter.IsAuthorized(response, request) {
- this.meter.Measure(MeasurementUnauthorizedRequest)
- //writeResponseStatus(response, http.StatusUnauthorized)
- } else if client := this.clientConnector.Connect(response); client == nil {
- this.meter.Measure(MeasurementClientConnectionFailed)
- writeResponseStatus(response, http.StatusNotImplemented)
- } else if connection := this.serverConnector.Connect(client, request.URL.Host); connection == nil {
- this.meter.Measure(MeasurementServerConnectionFailed)
- _, _ = client.Write(statusBadGateway)
- _ = client.Close()
- } else {
- this.meter.Measure(MeasurementProxyReady)
- _, _ = client.Write(statusReady)
- connection.Proxy()
- this.meter.Measure(MeasurementProxyComplete)
- }
- }
- func writeResponseStatus(response http.ResponseWriter, statusCode int) {
- http.Error(response, http.StatusText(statusCode), statusCode)
- }
- var (
- statusBadGateway = []byte("HTTP/1.1 502 Bad Gateway\r\n\r\n")
- statusReady = []byte("HTTP/1.1 200 OK\r\n\r\n")
- )
|