1
0
Fork 0
forked from boyska/circolog

Merge remote-tracking branch 'blallo/master'

This commit is contained in:
boyska 2018-11-08 19:11:57 +01:00
commit f2b02e5ec2
2 changed files with 47 additions and 38 deletions

View file

@ -1,9 +1,9 @@
package main package main
import ( import (
"fmt" "errors"
"log"
"net/http" "net/http"
"os"
"strconv" "strconv"
"time" "time"
@ -12,57 +12,65 @@ import (
"gopkg.in/mcuadros/go-syslog.v2/format" "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) { func setupHTTP(hub circolog.Hub) {
http.HandleFunc("/", getHTTPHandler(hub)) http.HandleFunc("/", getHTTPHandler(hub))
http.HandleFunc("/ws", getWSHandler(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 { func getHTTPHandler(hub circolog.Hub) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { 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{ client := circolog.Client{
Messages: make(chan format.LogParts, 20), Messages: make(chan format.LogParts, 20),
LastMsg: params.requestMessageLen,
Nofollow: true} Nofollow: true}
hub.Register <- client hub.Register <- client
err := r.ParseForm()
if err != nil {
fmt.Fprintln(os.Stderr, "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 {
var err error
switch {
case len(reqL) == 1:
requestMessageLen, err = strconv.Atoi(reqL[0])
if requestMessageLen <= 0 {
fmt.Fprintln(os.Stderr, "malformed request, l non positive:", requestMessageLen)
//requestMessageLen := 0
}
if err != nil {
fmt.Fprintln(os.Stderr, "malformed request on parameter l:", err)
}
case len(reqL) > 1:
requestMessageLen, err = strconv.Atoi(reqL[len(reqL)-1])
fmt.Fprintln(os.Stderr, "multiple values of l parameter, taking last:",
requestMessageLen)
if err != nil {
fmt.Fprintln(os.Stderr, "malformed request on parameter l:", err)
}
default:
fmt.Fprintln(os.Stderr, "empty parameter l in request")
}
}
i := 1
for x := range client.Messages { for x := range client.Messages {
w.Write([]byte(circolog.FormatSyslog(x))) w.Write([]byte(circolog.FormatSyslog(x)))
w.Write([]byte("\n")) w.Write([]byte("\n"))
if requestMessageLen != 0 && i >= requestMessageLen {
break
}
i++
} }
} }
} }

1
hub.go
View file

@ -11,6 +11,7 @@ import (
// new messages are sent. // new messages are sent.
type Client struct { type Client struct {
Messages chan format.LogParts // only hub should write/close this 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 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
} }