summaryrefslogtreecommitdiff
path: root/http-client
diff options
context:
space:
mode:
Diffstat (limited to 'http-client')
-rw-r--r--http-client/client.go40
-rw-r--r--http-client/main.go47
2 files changed, 64 insertions, 23 deletions
diff --git a/http-client/client.go b/http-client/client.go
index 346a654..211c299 100644
--- a/http-client/client.go
+++ b/http-client/client.go
@@ -2,7 +2,6 @@ package main
import (
"bytes"
- "crypto/rsa"
"encoding/json"
"errors"
"fmt"
@@ -14,12 +13,11 @@ import (
)
const (
- URL = "http://localhost:8080/api"
- Register = "register"
- SendMessage = "sendMessage"
- PollMessages = "pollMessages"
- GetUserKey = "getUserKey"
- TryAuth = "tryAuth"
+ Register = "/api/register"
+ SendMessage = "/api/sendMessage"
+ PollMessages = "/api/pollMessages"
+ GetUserKey = "/api/getUserKey"
+ TryAuth = "/api/tryAuth"
)
var storage struct {
@@ -48,29 +46,29 @@ func (msg *Message) toString() string {
return fmt.Sprintf("%s: %s", msg.User, msg.Data)
}
-func makeRequest(request Request, apiMethod string, key *rsa.PublicKey) (*http.Response, error) {
- signedRequest, err := signRequest(request, key)
+func makeRequest(request Request, apiMethod string, user UserData) (*http.Response, error) {
+ signedRequest, err := signRequest(request, user.ParsedUserKey)
if err != nil {
return nil, err
}
reader := bytes.NewReader([]byte(signedRequest))
- return http.Post(URL+"/"+apiMethod, "application/json", reader)
+ return http.Post(user.ServerUrl+apiMethod, "application/json", reader)
}
-func sendMessage(user UserData, message string, key *rsa.PublicKey) {
+func sendMessage(user UserData, message string) {
// TODO(andrew): Добавить отображение ошибки в интерфейс
_, _ = makeRequest(Request{
User: user.Username,
Data: message,
- }, SendMessage, key)
+ }, SendMessage, user)
}
-func register(user UserData, serverKey string, key *rsa.PublicKey) (Response, error) {
+func register(user UserData, serverKey string) (Response, error) {
var resp Response
httpResp, err := makeRequest(Request{
User: user.Username,
Data: serverKey,
- }, Register, key)
+ }, Register, user)
if err != nil {
return resp, err
}
@@ -85,12 +83,12 @@ func register(user UserData, serverKey string, key *rsa.PublicKey) (Response, er
}
}
-func tryAuth(user UserData, key *rsa.PublicKey) (bool, error) {
+func tryAuth(user UserData) (bool, error) {
var resp Response
httpResp, err := makeRequest(Request{
User: user.Username,
Data: "auth",
- }, TryAuth, key)
+ }, TryAuth, user)
if err != nil {
return false, err
}
@@ -105,14 +103,18 @@ func tryAuth(user UserData, key *rsa.PublicKey) (bool, error) {
}
}
+func pingServer(user UserData) error {
+ _, err := http.Get(user.ServerUrl)
+ return err
+}
+
func runClient(user UserData) {
- lastPoll := time.Now().UnixNano()
- key, _ := parseKey(user.UserKey)
+ var lastPoll int64 = 0
for {
httpResp, _ := makeRequest(Request{
User: user.Username,
Data: fmt.Sprint(lastPoll),
- }, PollMessages, key)
+ }, PollMessages, user)
lastPoll = time.Now().UnixNano()
if httpResp.StatusCode == http.StatusOK {
diff --git a/http-client/main.go b/http-client/main.go
index 7d32e9b..0af8efa 100644
--- a/http-client/main.go
+++ b/http-client/main.go
@@ -12,9 +12,11 @@ import (
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget"
"image/color"
+ "strings"
)
type UserData struct {
+ ServerUrl string
Username string
ServerKey []byte
UserKey []byte
@@ -36,7 +38,7 @@ func chatLayout(window fyne.Window, user UserData) {
entry := widget.NewEntry()
submit := widget.NewButton("Отправить", func() {
- go sendMessage(user, entry.Text, user.ParsedUserKey)
+ go sendMessage(user, entry.Text)
entry.SetText("")
storage.RLock()
@@ -62,6 +64,9 @@ func loginLayout(window fyne.Window, user UserData) {
label := canvas.NewText("Chat", color.White)
label.TextSize = 40
+ urlLabel := widget.NewLabel("URL: ")
+ urlEntry := widget.NewEntry()
+
loginLabel := widget.NewLabel("Логин: ")
loginEntry := widget.NewEntry()
@@ -105,9 +110,21 @@ func loginLayout(window fyne.Window, user UserData) {
dialog.ShowInformation("Ошибка", "Логин не может быть пустым", window)
return
}
-
user.Username = loginEntry.Text
- _, err := tryAuth(user, user.ParsedUserKey)
+
+ if len(urlEntry.Text) == 0 {
+ dialog.ShowInformation("Ошибка", "URL не может быть пустым", window)
+ return
+ }
+ user.ServerUrl = strings.TrimRight(urlEntry.Text, "/")
+
+ err := pingServer(user)
+ if err != nil {
+ dialog.ShowInformation("Ошибка", "Нет связи с сервером", window)
+ return
+ }
+
+ _, err = tryAuth(user)
if err != nil {
dialog.ShowInformation("Ошибка", fmt.Sprint(err), window)
return
@@ -122,6 +139,7 @@ func loginLayout(window fyne.Window, user UserData) {
mainContainer := container.NewCenter(container.NewVBox(
container.NewCenter(label), layout.NewSpacer(),
+ container.NewBorder(nil, nil, urlLabel, nil, urlEntry),
container.NewBorder(nil, nil, loginLabel, nil, loginEntry),
chooseKey,
loginButton,
@@ -138,6 +156,9 @@ func registerLayout(window fyne.Window, user UserData) {
label := canvas.NewText("Chat", color.White)
label.TextSize = 40
+ urlLabel := widget.NewLabel("URL: ")
+ urlEntry := widget.NewEntry()
+
loginLabel := widget.NewLabel("Логин: ")
loginEntry := widget.NewEntry()
@@ -168,8 +189,25 @@ func registerLayout(window fyne.Window, user UserData) {
return
}
+ if len(loginEntry.Text) == 0 {
+ dialog.ShowInformation("Ошибка", "Логин не может быть пустым", window)
+ return
+ }
user.Username = loginEntry.Text
- _, err := register(user, string(user.ServerKey), user.ParsedUserKey)
+
+ if len(urlEntry.Text) == 0 {
+ dialog.ShowInformation("Ошибка", "URL не может быть пустым", window)
+ return
+ }
+ user.ServerUrl = strings.TrimRight(urlEntry.Text, "/")
+
+ err := pingServer(user)
+ if err != nil {
+ dialog.ShowInformation("Ошибка", "Нет связи с сервером", window)
+ return
+ }
+
+ _, err = register(user, string(user.ServerKey))
if err != nil {
dialog.ShowInformation("Ошибка", fmt.Sprint(err), window)
return
@@ -184,6 +222,7 @@ func registerLayout(window fyne.Window, user UserData) {
window.SetContent(container.NewCenter(container.NewVBox(
container.NewCenter(label), layout.NewSpacer(),
+ container.NewBorder(nil, nil, urlLabel, nil, urlEntry),
container.NewBorder(nil, nil, loginLabel, nil, loginEntry),
generateKeysBtn,
registerButton,