diff options
Diffstat (limited to 'server/main.go')
| -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) + } +} |