diff options
| author | Andrew <saintruler@gmail.com> | 2021-05-13 21:42:24 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2021-05-13 21:42:24 +0400 |
| commit | 712c9f7153c59bc5487e781cdeab0a60dcfd6d6e (patch) | |
| tree | 6300faa4bd7653841b574cb45c1605603679f454 /http-client | |
| parent | 587ac4f7fecc417b4877c5f3c0fdefa58990b3c8 (diff) | |
Changed workflow of saving messages, so that server now saves signed messages.
Diffstat (limited to 'http-client')
| -rw-r--r-- | http-client/client.go | 41 |
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) } |