[http] Better handling of parameters and added LastMsg to Client

This commit is contained in:
Blallo 2018-11-08 12:37:31 +01:00
parent 4838f45f13
commit 5ae6078805
No known key found for this signature in database
GPG key ID: 0CBE577C9B72DC3F
2 changed files with 49 additions and 32 deletions

View file

@ -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
View file

@ -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
}