summaryrefslogtreecommitdiff
path: root/http-client/client.go
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2021-04-28 18:09:00 +0400
committerAndrew <saintruler@gmail.com>2021-04-28 18:09:00 +0400
commit7d6270f64b1dc00d91230b5c793bc49991f0fcf8 (patch)
treeee41d9e909968d56a83a09cf83fbb6e5ff6dbb1c /http-client/client.go
parent355dab5bdc924202b1d877b18ae31f04154a4aee (diff)
Added http client and tryAuth view to server.
Diffstat (limited to 'http-client/client.go')
-rw-r--r--http-client/client.go106
1 files changed, 106 insertions, 0 deletions
diff --git a/http-client/client.go b/http-client/client.go
new file mode 100644
index 0000000..ee3e044
--- /dev/null
+++ b/http-client/client.go
@@ -0,0 +1,106 @@
+package main
+
+import (
+ "bytes"
+ "crypto/sha256"
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "fyne.io/fyne/v2/data/binding"
+ "io"
+ "net/http"
+ "sync"
+ "time"
+)
+
+const (
+ URL = "http://localhost:8080/api"
+ Register = "register"
+ SendMessage = "sendMessage"
+ PollMessages = "pollMessages"
+ GetUserKey = "getUserKey"
+ TryAuth = "tryAuth"
+)
+
+const TimestampFormat = "2006-01-02T15-01-05.999"
+
+var storage struct {
+ sync.RWMutex
+ messages []Message
+ data []string
+ binding binding.ExternalStringList
+}
+
+type Request struct {
+ User string
+ Data string
+}
+
+type Response struct {
+ Message string
+}
+
+type Message struct {
+ User string
+ Data string
+ Timestamp string
+}
+
+func (msg *Message) toString() string {
+ return fmt.Sprintf("%s: %s", msg.User, msg.Data)
+}
+
+func signData(data []byte) string {
+ data64 := base64.StdEncoding.EncodeToString(data)
+ h := sha256.Sum256([]byte(data64))
+ signature := fmt.Sprintf("%x", h)
+ return fmt.Sprintf("%s.%s", data64, signature)
+}
+
+func makeRequest(request Request, apiMethod string) (*http.Response, error) {
+ req, _ := json.Marshal(request)
+ signedRequest := signData(req)
+ reader := bytes.NewReader([]byte(signedRequest))
+ return http.Post(URL+"/"+apiMethod, "application/json", reader)
+}
+
+func sendMessage(user UserData, message string) {
+ // TODO(andrew): Добавить отображение ошибки в интерфейс
+ _, _ = makeRequest(Request{
+ User: user.Username,
+ Data: message,
+ }, SendMessage)
+}
+
+func runClient(user UserData) {
+ lastPoll := time.Now().UnixNano()
+ for {
+ httpResp, _ := makeRequest(Request{
+ User: user.Username,
+ Data: fmt.Sprint(lastPoll),
+ }, PollMessages)
+ lastPoll = time.Now().UnixNano()
+
+ if httpResp.StatusCode == http.StatusOK {
+ body, _ := io.ReadAll(httpResp.Body)
+ var resp Response
+ _ = json.Unmarshal(body, &resp)
+ var messages []Message
+ _ = json.Unmarshal([]byte(resp.Message), &messages)
+
+ storage.Lock()
+ for _, msg := range messages {
+ fmt.Printf("Polled new message from %s: %s (%s)\n", msg.User, msg.Data, msg.Timestamp)
+ _ = storage.binding.Append(msg.toString())
+ storage.messages = append(storage.messages, msg)
+ }
+ storage.Unlock()
+ } else {
+ fmt.Println(httpResp.StatusCode)
+ ae, _ := io.ReadAll(httpResp.Body)
+ fmt.Println(string(ae))
+ }
+
+ time.Sleep(100 * time.Millisecond)
+ }
+}