@@ -30,6 +30,16 @@ func newUpClient(cfg *config.UpStream) *upClient {
3030 }
3131}
3232
33+ func (c * upClient ) Token () string {
34+ return c .loginToken
35+ }
36+
37+ // need a parsable schema defination
38+ type loginSchema struct {
39+ Time string `json:"time"`
40+ Token string `json:"token"`
41+ }
42+
3343// FullLogin performs the complete login process: get challenge then login
3444func (c * upClient ) Login (ctx context.Context , genLogin func (string ) (* types.LoginParameter , error )) (* types.LoginSchema , error ) {
3545 // Step 1: Get challenge
@@ -44,22 +54,24 @@ func (c *upClient) Login(ctx context.Context, genLogin func(string) (*types.Logi
4454 if err != nil {
4555 return nil , fmt .Errorf ("failed to get challenge: %w" , err )
4656 }
47- defer challengeResp .Body .Close ()
4857
49- if challengeResp .StatusCode != http .StatusOK {
50- return nil , fmt .Errorf ("challenge request failed with status: %d" , challengeResp .StatusCode )
58+ parsedResp , err := handleHttpResp (challengeResp )
59+ if err != nil {
60+ return nil , err
61+ } else if parsedResp .ErrCode != 0 {
62+ return nil , fmt .Errorf ("challenge failed: %d (%s)" , parsedResp .ErrCode , parsedResp .ErrMsg )
5163 }
5264
53- // Step 2 : Parse challenge response
54- var loginSchema types. LoginSchema
55- if err := json . NewDecoder ( challengeResp . Body ). Decode ( & loginSchema ); err != nil {
65+ // Ste p2 : Parse challenge response
66+ var challengeSchema loginSchema
67+ if err := parsedResp . DecodeData ( & challengeSchema ); err != nil {
5668 return nil , fmt .Errorf ("failed to parse challenge response: %w" , err )
5769 }
5870
5971 // Step 3: Use the token from challenge as Bearer token for login
6072 url = fmt .Sprintf ("%s/coordinator/v1/login" , c .baseURL )
6173
62- param , err := genLogin (loginSchema .Token )
74+ param , err := genLogin (challengeSchema .Token )
6375 if err != nil {
6476 return nil , fmt .Errorf ("failed to setup login parameter: %w" , err )
6577 }
@@ -75,26 +87,32 @@ func (c *upClient) Login(ctx context.Context, genLogin func(string) (*types.Logi
7587 }
7688
7789 req .Header .Set ("Content-Type" , "application/json" )
78- req .Header .Set ("Authorization" , "Bearer " + loginSchema .Token )
90+ req .Header .Set ("Authorization" , "Bearer " + challengeSchema .Token )
7991
8092 loginResp , err := c .httpClient .Do (req )
8193 if err != nil {
8294 return nil , fmt .Errorf ("failed to perform login request: %w" , err )
8395 }
8496
85- parsedResp , err : = handleHttpResp (loginResp )
97+ parsedResp , err = handleHttpResp (loginResp )
8698 if err != nil {
8799 return nil , err
100+ } else if parsedResp .ErrCode != 0 {
101+ return nil , fmt .Errorf ("login failed: %d (%s)" , parsedResp .ErrCode , parsedResp .ErrMsg )
88102 }
89103
90- var loginResult types. LoginSchema
104+ var loginResult loginSchema
91105 err = parsedResp .DecodeData (& loginResult )
92106 if err != nil {
93107 return nil , fmt .Errorf ("login parsing data fail: %v" , err )
94108 }
95109 c .loginToken = loginResult .Token
96- return & loginResult , nil
97110
111+ // TODO: we need to parse time if we start making use of it
112+
113+ return & types.LoginSchema {
114+ Token : loginResult .Token ,
115+ }, nil
98116}
99117
100118func handleHttpResp (resp * http.Response ) (* ctypes.Response , error ) {
0 commit comments