serve.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package httpu
  2. import (
  3. "bufio"
  4. "bytes"
  5. "log"
  6. "net"
  7. "net/http"
  8. "regexp"
  9. )
  10. const (
  11. DefaultMaxMessageBytes = 2048
  12. )
  13. var (
  14. trailingWhitespaceRx = regexp.MustCompile(" +\r\n")
  15. crlf = []byte("\r\n")
  16. )
  17. // Handler is the interface by which received HTTPU messages are passed to
  18. // handling code.
  19. type Handler interface {
  20. // ServeMessage is called for each HTTPU message received. peerAddr contains
  21. // the address that the message was received from.
  22. ServeMessage(r *http.Request)
  23. }
  24. // HandlerFunc is a function-to-Handler adapter.
  25. type HandlerFunc func(r *http.Request)
  26. func (f HandlerFunc) ServeMessage(r *http.Request) {
  27. f(r)
  28. }
  29. // A Server defines parameters for running an HTTPU server.
  30. type Server struct {
  31. Addr string // UDP address to listen on
  32. Multicast bool // Should listen for multicast?
  33. Interface *net.Interface // Network interface to listen on for multicast, nil for default multicast interface
  34. Handler Handler // handler to invoke
  35. MaxMessageBytes int // maximum number of bytes to read from a packet, DefaultMaxMessageBytes if 0
  36. }
  37. // ListenAndServe listens on the UDP network address srv.Addr. If srv.Multicast
  38. // is true, then a multicast UDP listener will be used on srv.Interface (or
  39. // default interface if nil).
  40. func (srv *Server) ListenAndServe() error {
  41. var err error
  42. var addr *net.UDPAddr
  43. if addr, err = net.ResolveUDPAddr("udp", srv.Addr); err != nil {
  44. log.Fatal(err)
  45. }
  46. var conn net.PacketConn
  47. if srv.Multicast {
  48. if conn, err = net.ListenMulticastUDP("udp", srv.Interface, addr); err != nil {
  49. return err
  50. }
  51. } else {
  52. if conn, err = net.ListenUDP("udp", addr); err != nil {
  53. return err
  54. }
  55. }
  56. return srv.Serve(conn)
  57. }
  58. // Serve messages received on the given packet listener to the srv.Handler.
  59. func (srv *Server) Serve(l net.PacketConn) error {
  60. maxMessageBytes := DefaultMaxMessageBytes
  61. if srv.MaxMessageBytes != 0 {
  62. maxMessageBytes = srv.MaxMessageBytes
  63. }
  64. for {
  65. buf := make([]byte, maxMessageBytes)
  66. n, peerAddr, err := l.ReadFrom(buf)
  67. if err != nil {
  68. return err
  69. }
  70. buf = buf[:n]
  71. go func(buf []byte, peerAddr net.Addr) {
  72. // At least one router's UPnP implementation has added a trailing space
  73. // after "HTTP/1.1" - trim it.
  74. buf = trailingWhitespaceRx.ReplaceAllLiteral(buf, crlf)
  75. req, err := http.ReadRequest(bufio.NewReader(bytes.NewBuffer(buf)))
  76. if err != nil {
  77. log.Printf("httpu: Failed to parse request: %v", err)
  78. return
  79. }
  80. req.RemoteAddr = peerAddr.String()
  81. srv.Handler.ServeMessage(req)
  82. // No need to call req.Body.Close - underlying reader is bytes.Buffer.
  83. }(buf, peerAddr)
  84. }
  85. }
  86. // Serve messages received on the given packet listener to the given handler.
  87. func Serve(l net.PacketConn, handler Handler) error {
  88. srv := Server{
  89. Handler: handler,
  90. MaxMessageBytes: DefaultMaxMessageBytes,
  91. }
  92. return srv.Serve(l)
  93. }