diff options
| author | Andrew <saintruler@gmail.com> | 2021-04-26 20:26:15 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2021-04-26 20:26:15 +0400 |
| commit | 6276962c32b4be940cb6959cc746abbd81c73a45 (patch) | |
| tree | f901837e6a4429d15c7bd40f1a2dc9e95bd84f19 /server | |
Initial commit for server.
Diffstat (limited to 'server')
| -rw-r--r-- | server/main.go | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..ec848ad --- /dev/null +++ b/server/main.go @@ -0,0 +1,120 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "net" +) + +const ( + MESSAGE = "message" + AUTHENTICATE = "authenticate" + RENAME = "rename" +) + +const ( + SUCCESS = "success" + FAILURE = "failure" +) + +type Message struct { + Type string + Data string + User string +} + +type Response struct { + Status string + Data string +} + +func parseMessage(data []byte) Message { + var m Message + // TODO(andrew): Добавить обработку ошибок + json.Unmarshal(data, &m) + return m +} + +func handleConnection(conn net.Conn) { + defer conn.Close() + + maxAuthAttempts := 5 + authAttempts := 0 + authenticated := false + buf := make([]byte, 4096) + + for { + if authAttempts >= maxAuthAttempts { + resp, _ := json.Marshal(Response{ + Status: FAILURE, + Data: "Превышено количество неавторизованных запросов", + }) + _, _ = conn.Write(resp) + break + } + + readLen, err := conn.Read(buf) + if err != nil { + break + } + + message := parseMessage(buf[:readLen]) + if message.Type == AUTHENTICATE { + // TODO(andrew): Добавить процесс аутентификации + if true { + authenticated = true + } + } + + if !authenticated { + resp, _ := json.Marshal(Response{ + Status: FAILURE, + Data: "Для работы с сервером необходима аутентификация", + }) + _, err = conn.Write(resp) + if err != nil { + conn.Close() + break + } else { + authAttempts += 1 + continue + } + } + + if message.Data == "exit" { + break + } + + fmt.Println(message.Data) + resp, _ := json.Marshal(Response{ + Status: SUCCESS, + Data: "some data", + }) + _, err = conn.Write(resp) + if err != nil { + err = conn.Close() + break + } + } +} + +func main() { + sock, err := net.Listen("tcp", "localhost:8080") + handleError(err) + + for { + conn, err := sock.Accept() + if err == nil { + go handleConnection(conn) + } else { + break + } + } +} + +func handleError(err error) { + if err != nil { + log.Fatal(err) + } +} |