@@ -14,6 +14,9 @@ import (
14
14
"golang.org/x/net/publicsuffix"
15
15
)
16
16
17
+ // ListenerID is used to track event listeners
18
+ type ListenerID string
19
+
17
20
// checkStatusOk performs simple tests to ensure the request was successful
18
21
// if an error occured, try to qualify it then return it. In this case the Body of the
19
22
// response will not be usable later on.
@@ -42,58 +45,62 @@ func checkStatusOk(resp *http.Response) error {
42
45
// Client provides methods to make http requests to the api server while making the
43
46
// authentification and session ID renewal transparent.
44
47
type Client struct {
45
- username string
46
- password string
47
- baseURL string
48
- sessionID string
49
- hc * http.Client
48
+ username string
49
+ password string
50
+ baseURL string
51
+ hc * http.Client
50
52
}
51
53
52
54
// New returns a new Client
53
55
// sessionID is optional and used when caching sessions externally
54
56
func New (username , password , baseURL , sessionID string ) (APIClient , error ) {
55
57
hc := http.Client {}
56
- return NewWithHC (username , password , baseURL , sessionID , & hc )
58
+ return NewWithHTTPClient (username , password , baseURL , sessionID , & hc )
57
59
}
58
60
59
- // NewWithHC returns a new Client, injecting the HTTP client to use. See New.
60
- func NewWithHC (username , password , baseURL , sessionID string , hc * http.Client ) (APIClient , error ) {
61
+ // NewWithHTTPClient returns a new Client, injecting the HTTP client to use. See New.
62
+ func NewWithHTTPClient (username , password , baseURL , sessionID string , hc * http.Client ) (APIClient , error ) {
61
63
jar , err := cookiejar .New (& cookiejar.Options {PublicSuffixList : publicsuffix .List })
62
64
if err != nil {
63
65
return nil , err
64
66
}
67
+ url , err := url .Parse (baseURL )
65
68
if sessionID != "" {
66
- c := http.Cookie {
69
+ cookie := http.Cookie {
67
70
Name : "JSESSIONID" ,
68
71
Value : sessionID ,
69
72
}
70
- url , err := url .Parse (baseURL )
71
73
if err != nil {
72
74
return nil , err
73
75
}
74
- jar .SetCookies (url , []* http.Cookie {& c })
76
+ jar .SetCookies (url , []* http.Cookie {& cookie })
75
77
}
76
78
hc .Jar = jar
77
79
client := Client {
78
- username : username ,
79
- password : password ,
80
- baseURL : baseURL ,
81
- sessionID : sessionID ,
82
- hc : hc ,
80
+ username : username ,
81
+ password : password ,
82
+ baseURL : baseURL ,
83
+ hc : hc ,
83
84
}
84
85
return & client , nil
85
86
}
86
87
87
88
// SessionID is the latest known sessionID value
88
89
// It can be used for caching sessions externally.
90
+ // Returns an empty string if the session cookie is not set
89
91
func (c * Client ) SessionID () string {
90
- return c .sessionID
92
+ u , _ := url .Parse (c .baseURL + "/enduserAPI" )
93
+ for _ , cookie := range c .hc .Jar .Cookies (u ) {
94
+ if (cookie .Name == "JSESSIONID" ) && (cookie .Value != "" ) {
95
+ return cookie .Value
96
+ }
97
+ }
98
+ return ""
91
99
}
92
100
93
- // Login to the api server
101
+ // Login to the api server to obtain a session ID cookie
94
102
func (c * Client ) Login () error {
95
103
formData := url.Values {"userId" : {c .username }, "userPassword" : {c .password }}
96
-
97
104
resp , err := c .hc .PostForm (c .baseURL + "/enduserAPI/login" , formData )
98
105
if err != nil {
99
106
return err
@@ -102,9 +109,9 @@ func (c *Client) Login() error {
102
109
if err := checkStatusOk (resp ); err != nil {
103
110
return err
104
111
}
112
+ u , _ := url .Parse (c .baseURL )
105
113
for _ , cookie := range resp .Cookies () {
106
114
if (cookie .Name == "JSESSIONID" ) && (cookie .Value != "" ) {
107
- c .sessionID = cookie .Value
108
115
return nil
109
116
}
110
117
}
@@ -131,7 +138,6 @@ func (c *Client) DoWithAuth(req *http.Request) (*http.Response, error) {
131
138
if err := checkStatusOk (resp ); err != nil {
132
139
switch err .(type ) {
133
140
case * AuthenticationError :
134
- fmt .Println ("Need to re-authenticate" )
135
141
if err := c .Login (); err != nil {
136
142
return nil , err
137
143
}
@@ -144,7 +150,6 @@ func (c *Client) DoWithAuth(req *http.Request) (*http.Response, error) {
144
150
return nil , err
145
151
}
146
152
}
147
- fmt .Println ("Using cached sessionID" )
148
153
return resp , nil
149
154
}
150
155
@@ -176,3 +181,39 @@ func (c *Client) Execute(json []byte) (*http.Response, error) {
176
181
}
177
182
return resp , nil
178
183
}
184
+
185
+ // RegisterListener registers for events and returns a listener id
186
+ func (c * Client ) RegisterListener () (ListenerID , error ) {
187
+ req , err := http .NewRequest (http .MethodPost , c .baseURL + "/events/register" , nil )
188
+ if err != nil {
189
+ return "" , err
190
+ }
191
+ resp , err := c .DoWithAuth (req )
192
+ if err != nil {
193
+ return "" , err
194
+ }
195
+ defer resp .Body .Close ()
196
+ type Result struct {
197
+ lid ListenerID
198
+ }
199
+ var result Result
200
+ if err := json .NewDecoder (resp .Body ).Decode (& result ); err != nil {
201
+ return "" , err
202
+ }
203
+ return result .lid , nil
204
+ }
205
+
206
+ // UnregisterListener unregisters the listener
207
+ func (c * Client ) UnregisterListener (l ListenerID ) error {
208
+ query := fmt .Sprintf ("%s/events/%s/unregister" , c .baseURL , l )
209
+ req , err := http .NewRequest (http .MethodPost , query , nil )
210
+ if err != nil {
211
+ return err
212
+ }
213
+ resp , err := c .DoWithAuth (req )
214
+ if err != nil {
215
+ return err
216
+ }
217
+ resp .Body .Close ()
218
+ return nil
219
+ }
0 commit comments