From 83184db5443f75c19e93a06de1ec0dacf115d280 Mon Sep 17 00:00:00 2001 From: Stavros Date: Wed, 8 Jul 2026 17:12:08 +0300 Subject: [PATCH] chore: review nitpicks --- internal/service/oauth_extractors.go | 11 ++++++----- internal/service/oauth_service.go | 4 ++-- internal/service/simple_req.go | 11 ++++++++--- internal/service/tailscale_service.go | 11 ++++++++--- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/internal/service/oauth_extractors.go b/internal/service/oauth_extractors.go index 8cc1cb3e..7ce37fd3 100644 --- a/internal/service/oauth_extractors.go +++ b/internal/service/oauth_extractors.go @@ -1,6 +1,7 @@ package service import ( + "context" "errors" "net/http" "strconv" @@ -20,21 +21,21 @@ type GithubUserinfoResponse struct { ID int `json:"id"` } -func defaultExtractor(client *http.Client, url string) (*model.Claims, error) { - return simpleReq[model.Claims](client, url, nil) +func defaultExtractor(client *http.Client, ctx context.Context, url string) (*model.Claims, error) { + return simpleReq[model.Claims](client, ctx, url, nil) } -func githubExtractor(client *http.Client, _ string) (*model.Claims, error) { +func githubExtractor(client *http.Client, ctx context.Context, _ string) (*model.Claims, error) { var user model.Claims - userInfo, err := simpleReq[GithubUserinfoResponse](client, "https://api.github.com/user", map[string]string{ + userInfo, err := simpleReq[GithubUserinfoResponse](client, ctx, "https://api.github.com/user", map[string]string{ "accept": "application/vnd.github+json", }) if err != nil { return nil, err } - userEmails, err := simpleReq[GithubEmailResponse](client, "https://api.github.com/user/emails", map[string]string{ + userEmails, err := simpleReq[GithubEmailResponse](client, ctx, "https://api.github.com/user/emails", map[string]string{ "accept": "application/vnd.github+json", }) if err != nil { diff --git a/internal/service/oauth_service.go b/internal/service/oauth_service.go index 888614ec..44d12555 100644 --- a/internal/service/oauth_service.go +++ b/internal/service/oauth_service.go @@ -10,7 +10,7 @@ import ( "golang.org/x/oauth2" ) -type OAuthUserinfoExtractor func(client *http.Client, url string) (*model.Claims, error) +type OAuthUserinfoExtractor func(client *http.Client, ctx context.Context, url string) (*model.Claims, error) type OAuthService struct { serviceCfg model.OAuthServiceConfig @@ -80,7 +80,7 @@ func (s *OAuthService) GetToken(code string, verifier string) (*oauth2.Token, er func (s *OAuthService) GetUserinfo(token *oauth2.Token) (*model.Claims, error) { client := oauth2.NewClient(s.ctx, oauth2.StaticTokenSource(token)) - return s.userinfoExtractor(client, s.serviceCfg.UserinfoURL) + return s.userinfoExtractor(client, s.ctx, s.serviceCfg.UserinfoURL) } func (s *OAuthService) GetConfig() model.OAuthServiceConfig { diff --git a/internal/service/simple_req.go b/internal/service/simple_req.go index ca7d14af..fd67509c 100644 --- a/internal/service/simple_req.go +++ b/internal/service/simple_req.go @@ -1,16 +1,17 @@ package service import ( + "context" "encoding/json" "fmt" "io" "net/http" ) -func simpleReq[T any](client *http.Client, url string, headers map[string]string) (*T, error) { +func simpleReq[T any](client *http.Client, ctx context.Context, url string, headers map[string]string) (*T, error) { var decodedRes T - req, err := http.NewRequest("GET", url, nil) + req, err := http.NewRequestWithContext(ctx, "GET", url, nil) if err != nil { return nil, err } @@ -26,7 +27,11 @@ func simpleReq[T any](client *http.Client, url string, headers map[string]string defer res.Body.Close() if res.StatusCode < 200 || res.StatusCode >= 300 { - return nil, fmt.Errorf("request failed with status: %s", res.Status) + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, fmt.Errorf("request failed with status: %s", res.Status) + } + return nil, fmt.Errorf("request failed with status: %s and body: %s", res.Status, body) } body, err := io.ReadAll(res.Body) diff --git a/internal/service/tailscale_service.go b/internal/service/tailscale_service.go index 9776e65f..490a59a8 100644 --- a/internal/service/tailscale_service.go +++ b/internal/service/tailscale_service.go @@ -53,6 +53,7 @@ type TailscaleService struct { config *model.Config log *logger.Logger client *http.Client + ctx context.Context caches struct { devices *CacheStore[tailscaleAPIDevices] @@ -71,6 +72,7 @@ type TailscaleServiceInput struct { Ding *ding.Ding Config *model.Config Log *logger.Logger + Ctx context.Context } func NewTailscaleService(i TailscaleServiceInput) (*TailscaleService, error) { @@ -89,6 +91,7 @@ func NewTailscaleService(i TailscaleServiceInput) (*TailscaleService, error) { s := &TailscaleService{ config: i.Config, log: i.Log, + ctx: i.Ctx, } devicesCache := NewCacheStore[tailscaleAPIDevices](0) @@ -114,7 +117,9 @@ func NewTailscaleService(i TailscaleServiceInput) (*TailscaleService, error) { s.urls.devices = tailscaleAPIDeviceList(i.Config.Tailscale.Tailnet) s.urls.users = tailscaleAPIUserList(i.Config.Tailscale.Tailnet) - s.client = &http.Client{} + s.client = &http.Client{ + Timeout: 10 * time.Second, + } _, _, err := s.getDeviceList() @@ -144,7 +149,7 @@ func (s *TailscaleService) getDeviceList() (*tailscaleAPIDevices, bool, error) { return &cached, true, nil } - devices, err := simpleReq[tailscaleAPIDevices](s.client, s.urls.devices, map[string]string{ + devices, err := simpleReq[tailscaleAPIDevices](s.client, s.ctx, s.urls.devices, map[string]string{ "Authorization": s.buildAuthorizationHeader(), }) @@ -164,7 +169,7 @@ func (s *TailscaleService) getUsersList() (*tailscaleAPIUsers, bool, error) { return &cached, true, nil } - users, err := simpleReq[tailscaleAPIUsers](s.client, s.urls.users, map[string]string{ + users, err := simpleReq[tailscaleAPIUsers](s.client, s.ctx, s.urls.users, map[string]string{ "Authorization": s.buildAuthorizationHeader(), })