[http] Better handling of parameters and added LastMsg to Client
This commit is contained in:
parent
4838f45f13
commit
5ae6078805
2 changed files with 49 additions and 32 deletions
|
@ -1,6 +1,7 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
@ -11,50 +12,65 @@ import (
|
|||
"gopkg.in/mcuadros/go-syslog.v2/format"
|
||||
)
|
||||
|
||||
type requestParams struct {
|
||||
// Add here the expected request parameters
|
||||
errorList map[string]error
|
||||
requestMessageLen int
|
||||
}
|
||||
|
||||
func setupHTTP(hub circolog.Hub) {
|
||||
http.HandleFunc("/", getHTTPHandler(hub))
|
||||
http.HandleFunc("/ws", getWSHandler(hub))
|
||||
}
|
||||
|
||||
func parseParameterL(r *http.Request) (int, error) {
|
||||
var requestMessageLen int
|
||||
var err error
|
||||
if reqL, ok := r.Form["l"]; ok {
|
||||
if len(reqL) == 1 {
|
||||
requestMessageLen, err = strconv.Atoi(reqL[0])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if requestMessageLen <= 0 {
|
||||
return 0, errors.New("malformed request")
|
||||
}
|
||||
} else {
|
||||
return 0, errors.New("malformed request")
|
||||
}
|
||||
}
|
||||
return requestMessageLen, nil
|
||||
}
|
||||
|
||||
func (p *requestParams) parseParameters(w http.ResponseWriter, r *http.Request) {
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
log.Println("error parsing http request", err)
|
||||
}
|
||||
p.errorList = make(map[string]error, 1)
|
||||
p.requestMessageLen, p.errorList["l"] = parseParameterL(r)
|
||||
}
|
||||
|
||||
func getHTTPHandler(hub circolog.Hub) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
// Looking for known parameter in the request
|
||||
var params requestParams
|
||||
params.parseParameters(w, r)
|
||||
if params.errorList["l"] != nil {
|
||||
log.Println("Request parameter \"l\":", params.errorList["l"])
|
||||
w.WriteHeader(400)
|
||||
return
|
||||
}
|
||||
|
||||
client := circolog.Client{
|
||||
Messages: make(chan format.LogParts, 20),
|
||||
LastMsg: params.requestMessageLen,
|
||||
Nofollow: true}
|
||||
hub.Register <- client
|
||||
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
log.Println("error parsing http request", err)
|
||||
}
|
||||
// Looking for known parameter in the request
|
||||
// TODO: write specialized function
|
||||
var requestMessageLen int
|
||||
if reqL, ok := r.Form["l"]; ok {
|
||||
if len(reqL) == 1 {
|
||||
requestMessageLen, err = strconv.Atoi(reqL[0])
|
||||
if err != nil || requestMessageLen <= 0 {
|
||||
log.Println("malformed request on parameter l")
|
||||
requestMessageLen = -1
|
||||
w.WriteHeader(400)
|
||||
}
|
||||
} else {
|
||||
log.Println("malformed request on parameter l")
|
||||
requestMessageLen = -1
|
||||
w.WriteHeader(400)
|
||||
}
|
||||
}
|
||||
|
||||
if requestMessageLen >= 0 {
|
||||
i := 1
|
||||
for x := range client.Messages {
|
||||
w.Write([]byte(circolog.FormatSyslog(x)))
|
||||
w.Write([]byte("\n"))
|
||||
if requestMessageLen != 0 && i >= requestMessageLen {
|
||||
break
|
||||
}
|
||||
i++
|
||||
}
|
||||
for x := range client.Messages {
|
||||
w.Write([]byte(circolog.FormatSyslog(x)))
|
||||
w.Write([]byte("\n"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
1
hub.go
1
hub.go
|
@ -11,6 +11,7 @@ import (
|
|||
// new messages are sent.
|
||||
type Client struct {
|
||||
Messages chan format.LogParts // only hub should write/close this
|
||||
LastMsg int // The number of last messages to display
|
||||
Nofollow bool // if Nofollow is true, the hub will not keep this client permanently. Rather, it will send every message to "Messages" and close the channel. Use this if you want to get the messages one-shot
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue