2626import java .net .URLEncoder ;
2727import java .nio .charset .Charset ;
2828import java .util .Date ;
29+ import java .util .List ;
2930import java .util .Map ;
3031import java .util .UUID ;
3132
@@ -39,6 +40,7 @@ public class JsonServiceClient implements ServiceClient {
3940 String userName ;
4041 String password ;
4142 String bearerToken ;
43+ String refreshToken ;
4244
4345 Integer timeoutMs ;
4446 public ConnectionFilter RequestFilter ;
@@ -179,7 +181,7 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt
179181 if (bearerToken != null ) {
180182 req .setRequestProperty (HttpHeaders .Authorization , "Bearer " + bearerToken );
181183 req .setRequestProperty ("X-Auth" , "Bearer" ); // HttpURLConnection doesn't allow re-reading Authorization Header
182- } else if (forceAuthentication || alwaysSendBasicAuthHeaders ) {
184+ } else if (getTokenCookie () == null && ( forceAuthentication || alwaysSendBasicAuthHeaders ) ) {
183185 req .setRequestProperty (HttpHeaders .Authorization , "Basic " + Utils .toBase64String (userName + ":" + password ));
184186 req .setRequestProperty ("X-Auth" , "Basic" ); // HttpURLConnection doesn't allow re-reading Authorization Header
185187 }
@@ -208,12 +210,11 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt
208210 }
209211 }
210212
211- private static boolean shouldAuthenticate (HttpURLConnection req , String userName , String password ){
213+ private static boolean shouldAuthenticate (HttpURLConnection req , boolean hasAuthInfo ){
212214 try {
213215 return req .getResponseCode () == 401
214- && req .getRequestProperty ("X-Auth" ) == null //only auth if auth never attempted
215- && userName != null
216- && password != null ;
216+ && req .getRequestProperty ("X-Auth" ) == null //only auth if auth never attempted
217+ && hasAuthInfo ;
217218 } catch (IOException e ) {
218219 return false ;
219220 }
@@ -308,6 +309,21 @@ public void setTokenCookie(String value) {
308309 setCookie ("ss-tok" , value , (long ) (365 * 24 * 60 * 60 )); //1 year
309310 }
310311
312+ @ Override
313+ public void setRefreshToken (String bearerToken ) {
314+ this .refreshToken = bearerToken ;
315+ }
316+
317+ @ Override
318+ public String getRefreshToken () {
319+ return refreshToken ;
320+ }
321+
322+ @ Override
323+ public void setRefreshTokenCookie (String value ) {
324+ setCookie ("ss-reftok" , value , (long ) (365 * 24 * 60 * 60 )); //1 year
325+ }
326+
311327 @ Override
312328 public void setCredentials (String userName , String password ) {
313329 this .userName = userName ;
@@ -370,8 +386,26 @@ public <TResponse> TResponse send(String requestUrl, String httpMethod, byte[] r
370386 if (responseCode >= 400 ){
371387 boolean success = false ;
372388
373- if (shouldAuthenticate (req , userName , password )){
389+ boolean hasRefreshTokenCookie = getRefreshTokenCookie () != null ;
390+ boolean hasRefreshToken = refreshToken != null || hasRefreshTokenCookie ;
391+ if (shouldAuthenticate (req , (userName !=null && password != null )
392+ || bearerToken != null
393+ || hasRefreshToken )) {
374394 req .disconnect ();
395+
396+ if (hasRefreshToken ) {
397+ GetAccessToken refreshRequest = new GetAccessToken ()
398+ .setRefreshToken (refreshToken );
399+ try {
400+ GetAccessTokenResponse response = post (refreshRequest );
401+ if (response .getAccessToken () != null ) {
402+ this .setBearerToken (response .getAccessToken ());
403+ }
404+ } catch (WebServiceException e ) {
405+ throw new RefreshTokenException (e );
406+ }
407+ }
408+
375409 req = createRequest (requestUrl , httpMethod , requestBody , requestType , true );
376410
377411 success = req .getResponseCode () < 400 ;
@@ -583,6 +617,28 @@ public HttpURLConnection delete(String path) {
583617 return createRequest (resolveUrl (path ), HttpMethods .Delete , null , null );
584618 }
585619
620+ public List <HttpCookie > getCookies () {
621+ CookieManager cookieManager = (CookieManager ) CookieHandler .getDefault ();
622+ return cookieManager .getCookieStore ().getCookies ();
623+ }
624+
625+ public String getCookieValue (String name ) {
626+ CookieManager cookieManager = (CookieManager ) CookieHandler .getDefault ();
627+ for (HttpCookie cookie : cookieManager .getCookieStore ().getCookies ()) {
628+ if (cookie .getName ().equals (name )) {
629+ return cookie .getValue ();
630+ }
631+ }
632+ return null ;
633+ }
634+
635+ public String getTokenCookie () {
636+ return getCookieValue ("ss-tok" );
637+ }
638+ public String getRefreshTokenCookie () {
639+ return getCookieValue ("ss-reftok" );
640+ }
641+
586642 @ Override
587643 public void setCookie (String name , String value ) {
588644 setCookie (name , value , null );
0 commit comments