diff options
Diffstat (limited to 'http-client')
| -rw-r--r-- | http-client/client.go | 40 | ||||
| -rw-r--r-- | http-client/main.go | 47 |
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, |