summaryrefslogtreecommitdiff
path: root/http-client/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'http-client/client.go')
-rw-r--r--http-client/client.go41
1 files changed, 36 insertions, 5 deletions
diff --git a/http-client/client.go b/http-client/client.go
index 211c299..a83659e 100644
--- a/http-client/client.go
+++ b/http-client/client.go
@@ -2,12 +2,14 @@ package main
import (
"bytes"
+ "encoding/base64"
"encoding/json"
"errors"
"fmt"
"fyne.io/fyne/v2/data/binding"
"io"
"net/http"
+ "strings"
"sync"
"time"
)
@@ -39,7 +41,8 @@ type Response struct {
type Message struct {
User string
Data string
- Timestamp string
+ Payload string
+ Signature string
}
func (msg *Message) toString() string {
@@ -108,6 +111,33 @@ func pingServer(user UserData) error {
return err
}
+func parseMessage(signedMessage string) (Message, error) {
+ var msg Message
+
+ parts := strings.Split(signedMessage, ".")
+ if len(parts) != 2 {
+ return msg, errors.New("request doesn't contain exactly two parts")
+ }
+
+ payload := parts[0]
+ signature := parts[1]
+
+ messageBody, err := base64.StdEncoding.DecodeString(payload)
+ if err != nil {
+ return msg, err
+ }
+
+ err = json.Unmarshal(messageBody, &msg)
+ if err != nil {
+ return msg, errors.New("unable to parse message")
+ }
+ msg.Payload = payload
+ msg.Signature = signature
+ return msg, nil
+}
+
+// TODO(andrew): Заменить сбор новых сообщений через http запрос к серверу на
+// получения обновлений через сокет от сервера.
func runClient(user UserData) {
var lastPoll int64 = 0
for {
@@ -121,12 +151,13 @@ func runClient(user UserData) {
body, _ := io.ReadAll(httpResp.Body)
var resp Response
_ = json.Unmarshal(body, &resp)
- var messages []Message
- _ = json.Unmarshal([]byte(resp.Message), &messages)
+ var signedMessages []string
+ _ = json.Unmarshal([]byte(resp.Message), &signedMessages)
storage.Lock()
- for _, msg := range messages {
- fmt.Printf("Polled new message from %s: %s (%s)\n", msg.User, msg.Data, msg.Timestamp)
+ for _, signedMessage := range signedMessages {
+ msg, _ := parseMessage(signedMessage)
+ fmt.Printf("Polled new message from %s: %s\n", msg.User, msg.Data)
_ = storage.binding.Append(msg.toString())
storage.messages = append(storage.messages, msg)
}