package httpu
import (
"bufio"
"bytes"
"log"
"net"
"net/http"
"regexp"
"sync"
)
const (
DefaultMaxMessageBytes = 2048
)
var (
trailingWhitespaceRx = regexp .MustCompile (" +\r\n" )
crlf = []byte ("\r\n" )
)
type Handler interface {
ServeMessage (r *http .Request )
}
type HandlerFunc func (r *http .Request )
func (f HandlerFunc ) ServeMessage (r *http .Request ) {
f (r )
}
type Server struct {
Addr string
Multicast bool
Interface *net .Interface
Handler Handler
MaxMessageBytes int
}
func (srv *Server ) ListenAndServe () error {
var err error
var addr *net .UDPAddr
if addr , err = net .ResolveUDPAddr ("udp" , srv .Addr ); err != nil {
log .Fatal (err )
}
var conn net .PacketConn
if srv .Multicast {
if conn , err = net .ListenMulticastUDP ("udp" , srv .Interface , addr ); err != nil {
return err
}
} else {
if conn , err = net .ListenUDP ("udp" , addr ); err != nil {
return err
}
}
return srv .Serve (conn )
}
func (srv *Server ) Serve (l net .PacketConn ) error {
maxMessageBytes := DefaultMaxMessageBytes
if srv .MaxMessageBytes != 0 {
maxMessageBytes = srv .MaxMessageBytes
}
bufPool := &sync .Pool {
New : func () interface {} {
return make ([]byte , maxMessageBytes )
},
}
for {
buf := bufPool .Get ().([]byte )
n , peerAddr , err := l .ReadFrom (buf )
if err != nil {
return err
}
go func () {
defer bufPool .Put (buf )
reqBuf := trailingWhitespaceRx .ReplaceAllLiteral (buf [:n ], crlf )
req , err := http .ReadRequest (bufio .NewReader (bytes .NewBuffer (reqBuf )))
if err != nil {
log .Printf ("httpu: Failed to parse request: %v" , err )
return
}
req .RemoteAddr = peerAddr .String ()
srv .Handler .ServeMessage (req )
}()
}
}
func Serve (l net .PacketConn , handler Handler ) error {
srv := Server {
Handler : handler ,
MaxMessageBytes : DefaultMaxMessageBytes ,
}
return srv .Serve (l )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .