hub.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package http
  2. import (
  3. "context"
  4. "io"
  5. "net/http"
  6. "v2ray.com/core/common"
  7. "v2ray.com/core/common/net"
  8. "v2ray.com/core/common/serial"
  9. "v2ray.com/core/common/signal"
  10. "v2ray.com/core/transport/internet"
  11. "v2ray.com/core/transport/internet/tls"
  12. )
  13. type Listener struct {
  14. server *http.Server
  15. handler internet.ConnHandler
  16. local net.Addr
  17. }
  18. func (l *Listener) Addr() net.Addr {
  19. return l.local
  20. }
  21. func (l *Listener) Close() error {
  22. return l.server.Shutdown(context.Background())
  23. }
  24. type flushWriter struct {
  25. w io.Writer
  26. }
  27. func (fw flushWriter) Write(p []byte) (n int, err error) {
  28. n, err = fw.w.Write(p)
  29. if f, ok := fw.w.(http.Flusher); ok {
  30. f.Flush()
  31. }
  32. return
  33. }
  34. func (l *Listener) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
  35. writer.WriteHeader(200)
  36. if f, ok := writer.(http.Flusher); ok {
  37. f.Flush()
  38. }
  39. done := signal.NewDone()
  40. l.handler(&Connection{
  41. Reader: request.Body,
  42. Writer: flushWriter{writer},
  43. Closer: common.NewChainedClosable(request.Body, done),
  44. Local: l.Addr(),
  45. Remote: l.Addr(),
  46. })
  47. <-done.C()
  48. }
  49. func Listen(ctx context.Context, address net.Address, port net.Port, handler internet.ConnHandler) (internet.Listener, error) {
  50. listener := &Listener{
  51. handler: handler,
  52. local: &net.TCPAddr{
  53. IP: address.IP(),
  54. Port: int(port),
  55. },
  56. }
  57. config := tls.ConfigFromContext(ctx)
  58. if config == nil {
  59. return nil, newError("TLS must be enabled for http transport.").AtWarning()
  60. }
  61. server := &http.Server{
  62. Addr: serial.Concat(address, ":", port),
  63. TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")),
  64. Handler: listener,
  65. }
  66. listener.server = server
  67. go server.ListenAndServeTLS("", "")
  68. return listener, nil
  69. }
  70. func init() {
  71. common.Must(internet.RegisterTransportListener(internet.TransportProtocol_HTTP, Listen))
  72. }