@@ -33,6 +33,10 @@ public class JsonServiceClient implements ServiceClient {
33
33
String baseUrl ;
34
34
String replyUrl ;
35
35
36
+ boolean alwaysSendBasicAuthHeaders ;
37
+ String userName ;
38
+ String password ;
39
+
36
40
Integer timeoutMs ;
37
41
public ConnectionFilter RequestFilter ;
38
42
public ConnectionFilter ResponseFilter ;
@@ -123,26 +127,6 @@ public String createUrl(Object requestDto, Map<String,String> query){
123
127
return requestUrl + sb .toString ();
124
128
}
125
129
126
- public HttpURLConnection createRequest (String url , String httpMethod ) {
127
- return createRequest (url , httpMethod , null , null );
128
- }
129
-
130
- public HttpURLConnection createRequest (String url , String httpMethod , Object request ) {
131
- String contentType = null ;
132
- byte [] requestBody = null ;
133
-
134
- if (request != null ) {
135
- contentType = MimeTypes .Json ;
136
- String json = getGson ().toJson (request );
137
- if (Log .isDebugEnabled ()){
138
- Log .d (json );
139
- }
140
- requestBody = json .getBytes (UTF8 );
141
- }
142
-
143
- return createRequest (url , httpMethod , requestBody , contentType );
144
- }
145
-
146
130
public HttpURLConnection createRequest (String requestUrl , String httpMethod , byte [] requestBody , String requestType ) {
147
131
try {
148
132
URL url = new URL (requestUrl );
@@ -161,6 +145,10 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt
161
145
req .setRequestProperty (HttpHeaders .ContentType , requestType );
162
146
}
163
147
148
+ if (alwaysSendBasicAuthHeaders ) {
149
+ addBasicAuth (req , userName , password );
150
+ }
151
+
164
152
if (RequestFilter != null ) {
165
153
RequestFilter .exec (req );
166
154
}
@@ -185,6 +173,21 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt
185
173
}
186
174
}
187
175
176
+ private static void addBasicAuth (HttpURLConnection req , String userName , String password ) {
177
+ req .setRequestProperty (HttpHeaders .Authorization ,
178
+ "Basic " + Utils .toBase64String (userName + ":" + password ));
179
+ }
180
+
181
+ private static boolean shouldAuthenticate (HttpURLConnection req , String userName , String password ){
182
+ try {
183
+ return req .getResponseCode () == 401
184
+ && userName != null
185
+ && password != null ;
186
+ } catch (IOException e ) {
187
+ return false ;
188
+ }
189
+ }
190
+
188
191
public static RuntimeException createException (HttpURLConnection res , int responseCode ){
189
192
190
193
WebServiceException webEx = null ;
@@ -249,48 +252,90 @@ public static boolean hasRequestBody(String httpMethod)
249
252
return true ;
250
253
}
251
254
252
- public HttpURLConnection createSendRequest (Object request ) {
255
+ @ Override
256
+ public void setAlwaysSendBasicAuthHeaders (boolean value ) {
257
+ this .alwaysSendBasicAuthHeaders = value ;
258
+ }
259
+
260
+ @ Override
261
+ public void setCredentials (String userName , String password ) {
262
+ this .userName = userName ;
263
+ this .password = password ;
264
+ }
265
+
266
+ public <TResponse > TResponse sendRequest (Object request , Object responseClass ) {
253
267
String httpMethod = GetSendMethod (request );
254
268
if (hasRequestBody (httpMethod )){
255
- return createRequest (Utils .combinePath (replyUrl , typeName (request )), httpMethod , request );
269
+ return send (Utils .combinePath (replyUrl , typeName (request )), httpMethod , request , responseClass );
256
270
} else {
257
271
String url = createUrl (request );
258
- return createRequest (url , httpMethod , null , null );
272
+ return send (url , httpMethod , null , null , responseClass );
259
273
}
260
274
}
261
275
262
276
@ Override
263
277
public <TResponse > TResponse send (IReturn <TResponse > request ) {
264
- return send (
265
- createSendRequest (request ),
266
- request .getResponseType ());
278
+ return sendRequest (request , request .getResponseType ());
267
279
}
268
280
269
281
@ Override
270
282
public void send (IReturnVoid request ) {
271
283
String httpMethod = GetSendMethod (request );
272
- send (createRequest ( Utils .combinePath (replyUrl , typeName (request )), httpMethod , request ) ,
284
+ send (Utils .combinePath (replyUrl , typeName (request )), httpMethod , request ,
273
285
IReturnVoid .class );
274
286
}
275
287
276
- public <TResponse > TResponse send (HttpURLConnection req , Object responseClass ) {
288
+ public <TResponse > TResponse send (String url , String httpMethod , Object responseClass ) {
289
+ return send (url , httpMethod , null , null , responseClass );
290
+ }
291
+
292
+ public <TResponse > TResponse send (String url , String httpMethod , Object request , Object responseClass ) {
293
+ String contentType = null ;
294
+ byte [] requestBody = null ;
295
+
296
+ if (request != null ) {
297
+ contentType = MimeTypes .Json ;
298
+ String json = getGson ().toJson (request );
299
+ if (Log .isDebugEnabled ()){
300
+ Log .d (json );
301
+ }
302
+ requestBody = json .getBytes (UTF8 );
303
+ }
304
+
305
+ return send (url , httpMethod , requestBody , contentType , responseClass );
306
+ }
307
+
308
+ public <TResponse > TResponse send (String requestUrl , String httpMethod , byte [] requestBody , String requestType , Object responseClass ) {
309
+ HttpURLConnection req = null ;
277
310
try {
311
+ req = createRequest (requestUrl , httpMethod , requestBody , requestType );
278
312
Class resClass = responseClass instanceof Class ? (Class )responseClass : null ;
279
313
Type resType = responseClass instanceof Type ? (Type )responseClass : null ;
280
314
if (resClass == null && resType == null )
281
315
throw new RuntimeException ("responseClass '" + responseClass .getClass ().getSimpleName () + "' must be a Class or Type" );
282
316
283
317
int responseCode = req .getResponseCode ();
284
318
if (responseCode >= 400 ){
285
- RuntimeException ex = createException ( req , responseCode ) ;
319
+ boolean success = false ;
286
320
287
- if (ExceptionFilter != null )
288
- ExceptionFilter .exec (req , ex );
321
+ if (shouldAuthenticate (req , userName , password )){
322
+ req .disconnect ();
323
+ req = createRequest (requestUrl , httpMethod , requestBody , requestType );
324
+ addBasicAuth (req , userName , password );
325
+ success = req .getResponseCode () < 400 ;
326
+ }
289
327
290
- if (GlobalExceptionFilter != null )
291
- GlobalExceptionFilter . exec (req , ex );
328
+ if (! success ){
329
+ RuntimeException ex = createException (req , responseCode );
292
330
293
- throw ex ;
331
+ if (ExceptionFilter != null )
332
+ ExceptionFilter .exec (req , ex );
333
+
334
+ if (GlobalExceptionFilter != null )
335
+ GlobalExceptionFilter .exec (req , ex );
336
+
337
+ throw ex ;
338
+ }
294
339
}
295
340
296
341
InputStream is = req .getInputStream ();
@@ -323,8 +368,8 @@ public <TResponse> TResponse send(HttpURLConnection req, Object responseClass) {
323
368
else {
324
369
BufferedReader reader = new BufferedReader (new InputStreamReader (is ));
325
370
TResponse response = resClass != null
326
- ? (TResponse ) getGson ().fromJson (reader , resClass )
327
- : (TResponse ) getGson ().fromJson (reader , resType );
371
+ ? (TResponse ) getGson ().fromJson (reader , resClass )
372
+ : (TResponse ) getGson ().fromJson (reader , resType );
328
373
329
374
reader .close ();
330
375
return response ;
@@ -333,7 +378,8 @@ public <TResponse> TResponse send(HttpURLConnection req, Object responseClass) {
333
378
throw new RuntimeException (e );
334
379
}
335
380
finally {
336
- req .disconnect ();
381
+ if (req != null )
382
+ req .disconnect ();
337
383
}
338
384
}
339
385
@@ -350,81 +396,64 @@ private String resolveUrl(String relativeOrAbsoluteUrl) {
350
396
351
397
@ Override
352
398
public <TResponse > TResponse get (IReturn <TResponse > request ) {
353
- return send (
354
- createRequest (createUrl (request ), HttpMethods .Get ),
355
- request .getResponseType ());
399
+ return send (createUrl (request ), HttpMethods .Get , request .getResponseType ());
356
400
}
357
401
358
402
@ Override
359
403
public void get (IReturnVoid request ) {
360
- send (createRequest ( createUrl (request ), HttpMethods .Get ) , IReturnVoid .class );
404
+ send (createUrl (request ), HttpMethods .Get , IReturnVoid .class );
361
405
}
362
406
363
407
@ Override
364
408
public <TResponse > TResponse get (IReturn <TResponse > request , Map <String , String > queryParams ) {
365
- return send (
366
- createRequest (createUrl (request , queryParams ), HttpMethods .Get ),
367
- request .getResponseType ());
409
+ return send (createUrl (request , queryParams ), HttpMethods .Get , request .getResponseType ());
368
410
}
369
411
370
412
@ Override
371
413
public <TResponse > TResponse get (String path , Class responseType ) {
372
- return send (
373
- createRequest (resolveUrl (path ), HttpMethods .Get ),
374
- responseType );
414
+ return send (resolveUrl (path ), HttpMethods .Get , responseType );
375
415
}
376
416
377
417
@ Override
378
418
public <TResponse > TResponse get (String path , Type responseType ) {
379
- return send (
380
- createRequest (resolveUrl (path ), HttpMethods .Get ),
381
- responseType );
419
+ return send (resolveUrl (path ), HttpMethods .Get , responseType );
382
420
}
383
421
384
422
@ Override
385
423
public HttpURLConnection get (String path ) {
386
- return createRequest (resolveUrl (path ), HttpMethods .Get );
424
+ return createRequest (resolveUrl (path ), HttpMethods .Get , null , null );
387
425
}
388
426
389
427
@ Override
390
428
public <TResponse > TResponse post (IReturn <TResponse > request ) {
391
429
return send (
392
- createRequest ( Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request ) ,
430
+ Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request ,
393
431
request .getResponseType ());
394
432
}
395
433
396
434
@ Override
397
435
public void post (IReturnVoid request ) {
398
- send (createRequest (Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request ),
399
- IReturnVoid .class );
436
+ send (Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request , IReturnVoid .class );
400
437
}
401
438
402
439
@ Override
403
440
public <TResponse > TResponse post (String path , Object request , Class responseType ) {
404
- return send (
405
- createRequest (resolveUrl (path ), HttpMethods .Post , request ),
406
- responseType );
441
+ return send (resolveUrl (path ), HttpMethods .Post , request , responseType );
407
442
}
408
443
409
444
@ Override
410
445
public <TResponse > TResponse post (String path , Object request , Type responseType ) {
411
- return send (
412
- createRequest (resolveUrl (path ), HttpMethods .Post , request ),
413
- responseType );
446
+ return send (resolveUrl (path ), HttpMethods .Post , request , responseType );
414
447
}
415
448
416
449
@ Override
417
450
public <TResponse > TResponse post (String path , byte [] requestBody , String contentType , Class responseType ) {
418
- return send (
419
- createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType ),
420
- responseType );
451
+ return send (resolveUrl (path ), HttpMethods .Post , requestBody , contentType , responseType );
421
452
}
422
453
423
454
@ Override
424
455
public <TResponse > TResponse post (String path , byte [] requestBody , String contentType , Type responseType ) {
425
- return send (
426
- createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType ),
427
- responseType );
456
+ return send (resolveUrl (path ), HttpMethods .Post , requestBody , contentType , responseType );
428
457
}
429
458
430
459
@ Override
@@ -435,42 +464,34 @@ public HttpURLConnection post(String path, byte[] requestBody, String contentTyp
435
464
@ Override
436
465
public <TResponse > TResponse put (IReturn <TResponse > request ) {
437
466
return send (
438
- createRequest ( Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ) ,
467
+ Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ,
439
468
request .getResponseType ());
440
469
}
441
470
442
471
@ Override
443
472
public void put (IReturnVoid request ) {
444
- send (createRequest ( Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ) ,
473
+ send (Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ,
445
474
IReturnVoid .class );
446
475
}
447
476
448
477
@ Override
449
478
public <TResponse > TResponse put (String path , Object request , Class responseType ) {
450
- return send (
451
- createRequest (resolveUrl (path ), HttpMethods .Put , request ),
452
- responseType );
479
+ return send (resolveUrl (path ), HttpMethods .Put , request , responseType );
453
480
}
454
481
455
482
@ Override
456
483
public <TResponse > TResponse put (String path , Object request , Type responseType ) {
457
- return send (
458
- createRequest (resolveUrl (path ), HttpMethods .Put , request ),
459
- responseType );
484
+ return send (resolveUrl (path ), HttpMethods .Put , request , responseType );
460
485
}
461
486
462
487
@ Override
463
488
public <TResponse > TResponse put (String path , byte [] requestBody , String contentType , Class responseType ) {
464
- return send (
465
- createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType ),
466
- responseType );
489
+ return send (resolveUrl (path ), HttpMethods .Put , requestBody , contentType , responseType );
467
490
}
468
491
469
492
@ Override
470
493
public <TResponse > TResponse put (String path , byte [] requestBody , String contentType , Type responseType ) {
471
- return send (
472
- createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType ),
473
- responseType );
494
+ return send (resolveUrl (path ), HttpMethods .Put , requestBody , contentType , responseType );
474
495
}
475
496
476
497
@ Override
@@ -480,40 +501,32 @@ public HttpURLConnection put(String path, byte[] requestBody, String contentType
480
501
481
502
@ Override
482
503
public <TResponse > TResponse delete (IReturn <TResponse > request ) {
483
- return send (
484
- createRequest (createUrl (request ), HttpMethods .Delete ),
485
- request .getResponseType ());
504
+ return send (createUrl (request ), HttpMethods .Delete , request .getResponseType ());
486
505
}
487
506
488
507
@ Override
489
508
public void delete (IReturnVoid request ) {
490
- send (createRequest ( createUrl (request ), HttpMethods .Delete ) , IReturnVoid .class );
509
+ send (createUrl (request ), HttpMethods .Delete , IReturnVoid .class );
491
510
}
492
511
493
512
@ Override
494
513
public <TResponse > TResponse delete (IReturn <TResponse > request , Map <String , String > queryParams ) {
495
- return send (
496
- createRequest (createUrl (request , queryParams ), HttpMethods .Delete ),
497
- request .getResponseType ());
514
+ return send (createUrl (request , queryParams ), HttpMethods .Delete , request .getResponseType ());
498
515
}
499
516
500
517
@ Override
501
518
public <TResponse > TResponse delete (String path , Class responseType ) {
502
- return send (
503
- createRequest (resolveUrl (path ), HttpMethods .Delete ),
504
- responseType );
519
+ return send (resolveUrl (path ), HttpMethods .Delete , responseType );
505
520
}
506
521
507
522
@ Override
508
523
public <TResponse > TResponse delete (String path , Type responseType ) {
509
- return send (
510
- createRequest (resolveUrl (path ), HttpMethods .Delete ),
511
- responseType );
524
+ return send (resolveUrl (path ), HttpMethods .Delete , responseType );
512
525
}
513
526
514
527
@ Override
515
528
public HttpURLConnection delete (String path ) {
516
- return createRequest (resolveUrl (path ), HttpMethods .Delete );
529
+ return createRequest (resolveUrl (path ), HttpMethods .Delete , null , null );
517
530
}
518
531
519
532
}
0 commit comments