refactor code
This commit is contained in:
parent
402ad73377
commit
081b968fc2
66
api.go
Normal file
66
api.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"auth_proxy/types"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func MinetestEndpoint(w http.ResponseWriter, req *http.Request) {
|
||||||
|
logger.Printf("Got mod-request from %s, method: %s", req.Host, req.Method)
|
||||||
|
|
||||||
|
if req.Method == http.MethodGet {
|
||||||
|
select {
|
||||||
|
case msg := <-loginMessages:
|
||||||
|
logger.Printf("Relaying message to mod: name=%s", msg.Username)
|
||||||
|
err := json.NewEncoder(w).Encode(msg)
|
||||||
|
if err != nil {
|
||||||
|
SendError(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case <-time.After(30 * time.Second):
|
||||||
|
// timed out without data
|
||||||
|
w.WriteHeader(204)
|
||||||
|
}
|
||||||
|
} else if req.Method == http.MethodPost {
|
||||||
|
msg := &types.ModMessage{}
|
||||||
|
err := json.NewDecoder(req.Body).Decode(msg)
|
||||||
|
if err != nil {
|
||||||
|
SendError(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logger.Printf("Received message from mod: name=%s", msg.Name)
|
||||||
|
ee.Emit("mod-message", msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoginEndpoint(w http.ResponseWriter, req *http.Request) {
|
||||||
|
msg := &types.LoginMessage{}
|
||||||
|
err := json.NewDecoder(req.Body).Decode(&msg)
|
||||||
|
if err != nil {
|
||||||
|
SendError(w, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Printf("Got request from host=%s, username=%s", req.Host, msg.Username)
|
||||||
|
|
||||||
|
done := make(chan bool)
|
||||||
|
|
||||||
|
lh := &LoginHandler{
|
||||||
|
done: done,
|
||||||
|
username: msg.Username,
|
||||||
|
w: w,
|
||||||
|
}
|
||||||
|
ee.AddListener(lh)
|
||||||
|
|
||||||
|
logger.Printf("Sending loginmessage to event channel")
|
||||||
|
loginMessages <- msg
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-time.After(5 * time.Second):
|
||||||
|
SendError(w, "timed out")
|
||||||
|
case <-done:
|
||||||
|
}
|
||||||
|
ee.RemoveListener(lh)
|
||||||
|
}
|
@ -20,7 +20,7 @@ func NewEventEmitter() *EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ee *EventEmitter) AddListener(name string, handler EventHandler) {
|
func (ee *EventEmitter) AddListener(handler EventHandler) {
|
||||||
ee.mutex.Lock()
|
ee.mutex.Lock()
|
||||||
defer ee.mutex.Unlock()
|
defer ee.mutex.Unlock()
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ func (ee *EventEmitter) Emit(name string, payload interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ee *EventEmitter) RemoveListener(name string, remove_handler EventHandler) {
|
func (ee *EventEmitter) RemoveListener(remove_handler EventHandler) {
|
||||||
ee.mutex.Lock()
|
ee.mutex.Lock()
|
||||||
defer ee.mutex.Unlock()
|
defer ee.mutex.Unlock()
|
||||||
|
|
||||||
|
@ -26,9 +26,9 @@ func TestEventEmitter(t *testing.T) {
|
|||||||
if handler.count != 0 {
|
if handler.count != 0 {
|
||||||
t.Fatal("Count not 0")
|
t.Fatal("Count not 0")
|
||||||
}
|
}
|
||||||
ee.AddListener("my-event", handler)
|
ee.AddListener(handler)
|
||||||
ee.Emit("my-event", "test")
|
ee.Emit("my-event", "test")
|
||||||
ee.RemoveListener("my-event", handler)
|
ee.RemoveListener(handler)
|
||||||
|
|
||||||
if handler.count != 1 {
|
if handler.count != 1 {
|
||||||
t.Fatal("Count not 0")
|
t.Fatal("Count not 0")
|
||||||
|
39
loginhandler.go
Normal file
39
loginhandler.go
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"auth_proxy/types"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LoginHandler struct {
|
||||||
|
username string
|
||||||
|
w http.ResponseWriter
|
||||||
|
done chan bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lh *LoginHandler) OnEvent(name string, payload interface{}) {
|
||||||
|
if name != "mod-message" {
|
||||||
|
// Wrong event
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
msg, ok := payload.(*types.ModMessage)
|
||||||
|
if !ok {
|
||||||
|
// Wrong type
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if msg.Name != lh.username {
|
||||||
|
// Wrong username
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lh.w.WriteHeader(200)
|
||||||
|
err := json.NewEncoder(lh.w).Encode(msg)
|
||||||
|
if err != nil {
|
||||||
|
SendError(lh.w, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
lh.done <- true
|
||||||
|
}
|
77
main.go
77
main.go
@ -1,13 +1,15 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"auth_proxy/eventemitter"
|
||||||
|
"auth_proxy/types"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var logger = log.Default()
|
var logger = log.Default()
|
||||||
|
var loginMessages = make(chan *types.LoginMessage)
|
||||||
|
var ee = eventemitter.NewEventEmitter()
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
@ -20,74 +22,3 @@ func main() {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var toMt = make(chan json.RawMessage)
|
|
||||||
var fromMt = make(chan json.RawMessage)
|
|
||||||
|
|
||||||
func SendError(w http.ResponseWriter, msg string) {
|
|
||||||
logger.Printf("Error: %s", msg)
|
|
||||||
w.WriteHeader(500)
|
|
||||||
w.Write([]byte(msg))
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: check for race conditions
|
|
||||||
func MinetestEndpoint(w http.ResponseWriter, req *http.Request) {
|
|
||||||
logger.Printf("Got mod-request from %s, method: %s", req.Host, req.Method)
|
|
||||||
|
|
||||||
if req.Method == http.MethodGet {
|
|
||||||
select {
|
|
||||||
case msg := <-toMt:
|
|
||||||
logger.Printf("Relaying message to mod")
|
|
||||||
err := json.NewEncoder(w).Encode(msg)
|
|
||||||
if err != nil {
|
|
||||||
SendError(w, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
case <-time.After(30 * time.Second):
|
|
||||||
// timed out without data
|
|
||||||
w.WriteHeader(204)
|
|
||||||
}
|
|
||||||
} else if req.Method == http.MethodPost {
|
|
||||||
msg := json.RawMessage{}
|
|
||||||
err := json.NewDecoder(req.Body).Decode(&msg)
|
|
||||||
if err != nil {
|
|
||||||
SendError(w, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
logger.Printf("Received message from mod: %s", string(msg))
|
|
||||||
select {
|
|
||||||
case fromMt <- msg:
|
|
||||||
default:
|
|
||||||
SendError(w, "no receiver available")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func LoginEndpoint(w http.ResponseWriter, req *http.Request) {
|
|
||||||
logger.Printf("Got request from %s", req.Host)
|
|
||||||
|
|
||||||
msg := json.RawMessage{}
|
|
||||||
err := json.NewDecoder(req.Body).Decode(&msg)
|
|
||||||
if err != nil {
|
|
||||||
SendError(w, err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
case toMt <- msg:
|
|
||||||
case <-time.After(5 * time.Second):
|
|
||||||
SendError(w, "timed out sending")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
case msg = <-fromMt:
|
|
||||||
w.WriteHeader(200)
|
|
||||||
err = json.NewEncoder(w).Encode(msg)
|
|
||||||
if err != nil {
|
|
||||||
SendError(w, err.Error())
|
|
||||||
}
|
|
||||||
case <-time.After(5 * time.Second):
|
|
||||||
SendError(w, "timed out receiving")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
6
types/loginmessage.go
Normal file
6
types/loginmessage.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
type LoginMessage struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user