1
0

default_handler.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package cproxy
  2. import "net/http"
  3. type defaultHandler struct {
  4. filter Filter
  5. clientConnector clientConnector
  6. serverConnector serverConnector
  7. meter monitor
  8. }
  9. func newHandler(filter Filter, clientConnector clientConnector, serverConnector serverConnector, meter monitor) *defaultHandler {
  10. return &defaultHandler{
  11. filter: filter,
  12. clientConnector: clientConnector,
  13. serverConnector: serverConnector,
  14. meter: meter,
  15. }
  16. }
  17. func (this *defaultHandler) ServeHTTP(response http.ResponseWriter, request *http.Request) {
  18. this.meter.Measure(MeasurementHTTPRequest)
  19. if request.Method != "CONNECT" {
  20. this.meter.Measure(MeasurementBadMethod)
  21. writeResponseStatus(response, http.StatusMethodNotAllowed)
  22. } else if !this.filter.IsAuthorized(response, request) {
  23. this.meter.Measure(MeasurementUnauthorizedRequest)
  24. //writeResponseStatus(response, http.StatusUnauthorized)
  25. } else if client := this.clientConnector.Connect(response); client == nil {
  26. this.meter.Measure(MeasurementClientConnectionFailed)
  27. writeResponseStatus(response, http.StatusNotImplemented)
  28. } else if connection := this.serverConnector.Connect(client, request.URL.Host); connection == nil {
  29. this.meter.Measure(MeasurementServerConnectionFailed)
  30. _, _ = client.Write(statusBadGateway)
  31. _ = client.Close()
  32. } else {
  33. this.meter.Measure(MeasurementProxyReady)
  34. _, _ = client.Write(statusReady)
  35. connection.Proxy()
  36. this.meter.Measure(MeasurementProxyComplete)
  37. }
  38. }
  39. func writeResponseStatus(response http.ResponseWriter, statusCode int) {
  40. http.Error(response, http.StatusText(statusCode), statusCode)
  41. }
  42. var (
  43. statusBadGateway = []byte("HTTP/1.1 502 Bad Gateway\r\n\r\n")
  44. statusReady = []byte("HTTP/1.1 200 OK\r\n\r\n")
  45. )