godoor/godoor_server/godoor_server.go

119 lines
2.6 KiB
Go

// really stupid test door server
package main
import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"os"
)
type DoorBoyServer struct {
longPollers map[string]chan string
}
type card struct {
UidHash string `json:"uid_hash"`
}
type cardToken struct {
Token card `json:"token"`
}
type cardList struct {
AllowedUids []cardToken `json:"allowed_uids"`
}
func getRoot(w http.ResponseWriter, r *http.Request) {
fmt.Printf("got / request\n")
io.WriteString(w, "This is my website!\n")
}
func getAllowed(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
keys := cardList{
AllowedUids: []cardToken{
{card{UidHash: "0a0b0c0d0e0f"}},
{card{UidHash: "112233445566"}},
{card{UidHash: "aabbccddeeff"}},
},
}
respJson, _ := json.Marshal(keys)
_, err := w.Write(respJson)
if err != nil {
return
}
}
func writeAndFlush(writer http.ResponseWriter, buffer []byte) error {
_, err := writer.Write(buffer)
if err != nil {
return err
}
if f, ok := writer.(http.Flusher); ok {
f.Flush()
}
return nil
}
func (doorboyserver *DoorBoyServer) getLongPoll(w http.ResponseWriter, r *http.Request) {
err := writeAndFlush(w, []byte("data: response-generator-started\n\n"))
if err != nil {
return
}
events := make(chan string)
doorboyserver.longPollers[r.RemoteAddr] = events
err = writeAndFlush(w, []byte("data: watch-stream-opened\n\n"))
if err != nil {
delete(doorboyserver.longPollers, r.RemoteAddr)
return
}
d := <-events // get door open event
_, err = w.Write([]byte("data: "))
if err != nil {
delete(doorboyserver.longPollers, r.RemoteAddr)
return
}
_, err = w.Write([]byte(d))
if err != nil {
delete(doorboyserver.longPollers, r.RemoteAddr)
return
}
err = writeAndFlush(w, []byte("\n\n"))
if err != nil {
delete(doorboyserver.longPollers, r.RemoteAddr)
return
}
delete(doorboyserver.longPollers, r.RemoteAddr)
}
func (doobserver *DoorBoyServer) postOpenDoor(w http.ResponseWriter, r *http.Request) {
fmt.Println("longPollers:")
for key, value := range doobserver.longPollers {
fmt.Println(" Key:", key, "Value:", value)
value <- "workshop"
}
w.Write([]byte("OK"))
}
func main() {
doorboyserver := DoorBoyServer{longPollers: map[string]chan string{}}
http.HandleFunc("/", getRoot)
http.HandleFunc("/allowed", getAllowed)
http.HandleFunc("/longpoll", doorboyserver.getLongPoll)
http.HandleFunc("/open", doorboyserver.postOpenDoor)
err := http.ListenAndServe(":3333", nil)
if errors.Is(err, http.ErrServerClosed) {
fmt.Printf("server closed\n")
} else if err != nil {
fmt.Printf("error starting server: %s\n", err)
os.Exit(1)
}
}