|
|
|
@ -6,6 +6,7 @@ import (
|
|
|
|
|
"bufio"
|
|
|
|
|
"strings"
|
|
|
|
|
"strconv"
|
|
|
|
|
"log"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// SCGIHeaders is a map representing the headers of an SCGI request.
|
|
|
|
@ -23,17 +24,20 @@ func handle(c net.Conn, fn HandlerFunc) {
|
|
|
|
|
hl, err := reader.ReadString(':') // SCGI Spec: First bytes until a ':' represent the header length
|
|
|
|
|
if err != nil {
|
|
|
|
|
c.Write([]byte("42" + err.Error()))
|
|
|
|
|
log.Print(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
l, err := strconv.Atoi(hl[:len(hl)-1]) // Strip the trailing :
|
|
|
|
|
if err != nil {
|
|
|
|
|
c.Write([]byte("42" + err.Error()))
|
|
|
|
|
log.Print(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
buf := make([]byte, l)
|
|
|
|
|
_, err = reader.Read(buf)
|
|
|
|
|
if err != nil {
|
|
|
|
|
c.Write([]byte("42" + err.Error()))
|
|
|
|
|
log.Print(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
headerString := string(buf[:l])
|
|
|
|
@ -47,7 +51,7 @@ func handle(c net.Conn, fn HandlerFunc) {
|
|
|
|
|
}
|
|
|
|
|
err = fn(c, header)
|
|
|
|
|
if err != nil {
|
|
|
|
|
c.Write([]byte("42" + err.Error()))
|
|
|
|
|
log.Print(err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -57,7 +61,7 @@ func Serve(listener net.Listener, fn HandlerFunc) error {
|
|
|
|
|
for {
|
|
|
|
|
conn, err := listener.Accept()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
log.Print(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
go handle(conn, fn)
|
|
|
|
|