@@ -127,26 +127,6 @@ public String createUrl(Object requestDto, Map<String,String> query){
127127 return requestUrl + sb .toString ();
128128 }
129129
130- public HttpURLConnection createRequest (String url , String httpMethod ) {
131- return createRequest (url , httpMethod , null , null );
132- }
133-
134- public HttpURLConnection createRequest (String url , String httpMethod , Object request ) {
135- String contentType = null ;
136- byte [] requestBody = null ;
137-
138- if (request != null ) {
139- contentType = MimeTypes .Json ;
140- String json = getGson ().toJson (request );
141- if (Log .isDebugEnabled ()){
142- Log .d (json );
143- }
144- requestBody = json .getBytes (UTF8 );
145- }
146-
147- return createRequest (url , httpMethod , requestBody , contentType );
148- }
149-
150130 public HttpURLConnection createRequest (String requestUrl , String httpMethod , byte [] requestBody , String requestType ) {
151131 try {
152132 URL url = new URL (requestUrl );
@@ -196,6 +176,18 @@ public HttpURLConnection createRequest(String requestUrl, String httpMethod, byt
196176 private static void addBasicAuth (HttpURLConnection req , String userName , String password ) {
197177 req .setRequestProperty (HttpHeaders .Authorization ,
198178 "Basic " + Utils .toBase64String (userName + ":" + password ));
179+ req .setRequestProperty ("X-Auth" , "Basic" ); // HttpURLConnection doesn't allow re-reading Authorization Header
180+ }
181+
182+ private static boolean shouldAuthenticate (HttpURLConnection req , String userName , String password ){
183+ try {
184+ return req .getResponseCode () == 401
185+ && req .getRequestProperty ("X-Auth" ) == null //only auth if auth never attempted
186+ && userName != null
187+ && password != null ;
188+ } catch (IOException e ) {
189+ return false ;
190+ }
199191 }
200192
201193 public static RuntimeException createException (HttpURLConnection res , int responseCode ){
@@ -262,16 +254,6 @@ public static boolean hasRequestBody(String httpMethod)
262254 return true ;
263255 }
264256
265- public HttpURLConnection createSendRequest (Object request ) {
266- String httpMethod = GetSendMethod (request );
267- if (hasRequestBody (httpMethod )){
268- return createRequest (Utils .combinePath (replyUrl , typeName (request )), httpMethod , request );
269- } else {
270- String url = createUrl (request );
271- return createRequest (url , httpMethod , null , null );
272- }
273- }
274-
275257 @ Override
276258 public void setAlwaysSendBasicAuthHeaders (boolean value ) {
277259 this .alwaysSendBasicAuthHeaders = value ;
@@ -283,38 +265,79 @@ public void setCredentials(String userName, String password) {
283265 this .password = password ;
284266 }
285267
268+ public <TResponse > TResponse sendRequest (Object request , Object responseClass ) {
269+ String httpMethod = GetSendMethod (request );
270+ if (hasRequestBody (httpMethod )){
271+ return send (Utils .combinePath (replyUrl , typeName (request )), httpMethod , request , responseClass );
272+ } else {
273+ String url = createUrl (request );
274+ return send (url , httpMethod , null , null , responseClass );
275+ }
276+ }
277+
286278 @ Override
287279 public <TResponse > TResponse send (IReturn <TResponse > request ) {
288- return send (
289- createSendRequest (request ),
290- request .getResponseType ());
280+ return sendRequest (request , request .getResponseType ());
291281 }
292282
293283 @ Override
294284 public void send (IReturnVoid request ) {
295285 String httpMethod = GetSendMethod (request );
296- send (createRequest ( Utils .combinePath (replyUrl , typeName (request )), httpMethod , request ) ,
286+ send (Utils .combinePath (replyUrl , typeName (request )), httpMethod , request ,
297287 IReturnVoid .class );
298288 }
299289
300- public <TResponse > TResponse send (HttpURLConnection req , Object responseClass ) {
290+ public <TResponse > TResponse send (String url , String httpMethod , Object responseClass ) {
291+ return send (url , httpMethod , null , null , responseClass );
292+ }
293+
294+ public <TResponse > TResponse send (String url , String httpMethod , Object request , Object responseClass ) {
295+ String contentType = null ;
296+ byte [] requestBody = null ;
297+
298+ if (request != null ) {
299+ contentType = MimeTypes .Json ;
300+ String json = getGson ().toJson (request );
301+ if (Log .isDebugEnabled ()){
302+ Log .d (json );
303+ }
304+ requestBody = json .getBytes (UTF8 );
305+ }
306+
307+ return send (url , httpMethod , requestBody , contentType , responseClass );
308+ }
309+
310+ public <TResponse > TResponse send (String requestUrl , String httpMethod , byte [] requestBody , String requestType , Object responseClass ) {
311+ HttpURLConnection req = null ;
301312 try {
313+ req = createRequest (requestUrl , httpMethod , requestBody , requestType );
302314 Class resClass = responseClass instanceof Class ? (Class )responseClass : null ;
303315 Type resType = responseClass instanceof Type ? (Type )responseClass : null ;
304316 if (resClass == null && resType == null )
305317 throw new RuntimeException ("responseClass '" + responseClass .getClass ().getSimpleName () + "' must be a Class or Type" );
306318
307319 int responseCode = req .getResponseCode ();
308320 if (responseCode >= 400 ){
309- RuntimeException ex = createException ( req , responseCode ) ;
321+ boolean success = false ;
310322
311- if (ExceptionFilter != null )
312- ExceptionFilter .exec (req , ex );
323+ if (shouldAuthenticate (req , userName , password )){
324+ req .disconnect ();
325+ req = createRequest (requestUrl , httpMethod , requestBody , requestType );
326+ addBasicAuth (req , userName , password );
327+ success = req .getResponseCode () < 400 ;
328+ }
329+
330+ if (!success ){
331+ RuntimeException ex = createException (req , responseCode );
313332
314- if (GlobalExceptionFilter != null )
315- GlobalExceptionFilter .exec (req , ex );
333+ if (ExceptionFilter != null )
334+ ExceptionFilter .exec (req , ex );
316335
317- throw ex ;
336+ if (GlobalExceptionFilter != null )
337+ GlobalExceptionFilter .exec (req , ex );
338+
339+ throw ex ;
340+ }
318341 }
319342
320343 InputStream is = req .getInputStream ();
@@ -357,7 +380,8 @@ public <TResponse> TResponse send(HttpURLConnection req, Object responseClass) {
357380 throw new RuntimeException (e );
358381 }
359382 finally {
360- req .disconnect ();
383+ if (req != null )
384+ req .disconnect ();
361385 }
362386 }
363387
@@ -374,81 +398,64 @@ private String resolveUrl(String relativeOrAbsoluteUrl) {
374398
375399 @ Override
376400 public <TResponse > TResponse get (IReturn <TResponse > request ) {
377- return send (
378- createRequest (createUrl (request ), HttpMethods .Get ),
379- request .getResponseType ());
401+ return send (createUrl (request ), HttpMethods .Get , request .getResponseType ());
380402 }
381403
382404 @ Override
383405 public void get (IReturnVoid request ) {
384- send (createRequest ( createUrl (request ), HttpMethods .Get ) , IReturnVoid .class );
406+ send (createUrl (request ), HttpMethods .Get , IReturnVoid .class );
385407 }
386408
387409 @ Override
388410 public <TResponse > TResponse get (IReturn <TResponse > request , Map <String , String > queryParams ) {
389- return send (
390- createRequest (createUrl (request , queryParams ), HttpMethods .Get ),
391- request .getResponseType ());
411+ return send (createUrl (request , queryParams ), HttpMethods .Get , request .getResponseType ());
392412 }
393413
394414 @ Override
395415 public <TResponse > TResponse get (String path , Class responseType ) {
396- return send (
397- createRequest (resolveUrl (path ), HttpMethods .Get ),
398- responseType );
416+ return send (resolveUrl (path ), HttpMethods .Get , responseType );
399417 }
400418
401419 @ Override
402420 public <TResponse > TResponse get (String path , Type responseType ) {
403- return send (
404- createRequest (resolveUrl (path ), HttpMethods .Get ),
405- responseType );
421+ return send (resolveUrl (path ), HttpMethods .Get , responseType );
406422 }
407423
408424 @ Override
409425 public HttpURLConnection get (String path ) {
410- return createRequest (resolveUrl (path ), HttpMethods .Get );
426+ return createRequest (resolveUrl (path ), HttpMethods .Get , null , null );
411427 }
412428
413429 @ Override
414430 public <TResponse > TResponse post (IReturn <TResponse > request ) {
415431 return send (
416- createRequest ( Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request ) ,
432+ Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request ,
417433 request .getResponseType ());
418434 }
419435
420436 @ Override
421437 public void post (IReturnVoid request ) {
422- send (createRequest (Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request ),
423- IReturnVoid .class );
438+ send (Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Post , request , IReturnVoid .class );
424439 }
425440
426441 @ Override
427442 public <TResponse > TResponse post (String path , Object request , Class responseType ) {
428- return send (
429- createRequest (resolveUrl (path ), HttpMethods .Post , request ),
430- responseType );
443+ return send (resolveUrl (path ), HttpMethods .Post , request , responseType );
431444 }
432445
433446 @ Override
434447 public <TResponse > TResponse post (String path , Object request , Type responseType ) {
435- return send (
436- createRequest (resolveUrl (path ), HttpMethods .Post , request ),
437- responseType );
448+ return send (resolveUrl (path ), HttpMethods .Post , request , responseType );
438449 }
439450
440451 @ Override
441452 public <TResponse > TResponse post (String path , byte [] requestBody , String contentType , Class responseType ) {
442- return send (
443- createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType ),
444- responseType );
453+ return send (resolveUrl (path ), HttpMethods .Post , requestBody , contentType , responseType );
445454 }
446455
447456 @ Override
448457 public <TResponse > TResponse post (String path , byte [] requestBody , String contentType , Type responseType ) {
449- return send (
450- createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType ),
451- responseType );
458+ return send (resolveUrl (path ), HttpMethods .Post , requestBody , contentType , responseType );
452459 }
453460
454461 @ Override
@@ -459,42 +466,34 @@ public HttpURLConnection post(String path, byte[] requestBody, String contentTyp
459466 @ Override
460467 public <TResponse > TResponse put (IReturn <TResponse > request ) {
461468 return send (
462- createRequest ( Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ) ,
469+ Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ,
463470 request .getResponseType ());
464471 }
465472
466473 @ Override
467474 public void put (IReturnVoid request ) {
468- send (createRequest ( Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ) ,
475+ send (Utils .combinePath (replyUrl , typeName (request )), HttpMethods .Put , request ,
469476 IReturnVoid .class );
470477 }
471478
472479 @ Override
473480 public <TResponse > TResponse put (String path , Object request , Class responseType ) {
474- return send (
475- createRequest (resolveUrl (path ), HttpMethods .Put , request ),
476- responseType );
481+ return send (resolveUrl (path ), HttpMethods .Put , request , responseType );
477482 }
478483
479484 @ Override
480485 public <TResponse > TResponse put (String path , Object request , Type responseType ) {
481- return send (
482- createRequest (resolveUrl (path ), HttpMethods .Put , request ),
483- responseType );
486+ return send (resolveUrl (path ), HttpMethods .Put , request , responseType );
484487 }
485488
486489 @ Override
487490 public <TResponse > TResponse put (String path , byte [] requestBody , String contentType , Class responseType ) {
488- return send (
489- createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType ),
490- responseType );
491+ return send (resolveUrl (path ), HttpMethods .Put , requestBody , contentType , responseType );
491492 }
492493
493494 @ Override
494495 public <TResponse > TResponse put (String path , byte [] requestBody , String contentType , Type responseType ) {
495- return send (
496- createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType ),
497- responseType );
496+ return send (resolveUrl (path ), HttpMethods .Put , requestBody , contentType , responseType );
498497 }
499498
500499 @ Override
@@ -504,40 +503,32 @@ public HttpURLConnection put(String path, byte[] requestBody, String contentType
504503
505504 @ Override
506505 public <TResponse > TResponse delete (IReturn <TResponse > request ) {
507- return send (
508- createRequest (createUrl (request ), HttpMethods .Delete ),
509- request .getResponseType ());
506+ return send (createUrl (request ), HttpMethods .Delete , request .getResponseType ());
510507 }
511508
512509 @ Override
513510 public void delete (IReturnVoid request ) {
514- send (createRequest ( createUrl (request ), HttpMethods .Delete ) , IReturnVoid .class );
511+ send (createUrl (request ), HttpMethods .Delete , IReturnVoid .class );
515512 }
516513
517514 @ Override
518515 public <TResponse > TResponse delete (IReturn <TResponse > request , Map <String , String > queryParams ) {
519- return send (
520- createRequest (createUrl (request , queryParams ), HttpMethods .Delete ),
521- request .getResponseType ());
516+ return send (createUrl (request , queryParams ), HttpMethods .Delete , request .getResponseType ());
522517 }
523518
524519 @ Override
525520 public <TResponse > TResponse delete (String path , Class responseType ) {
526- return send (
527- createRequest (resolveUrl (path ), HttpMethods .Delete ),
528- responseType );
521+ return send (resolveUrl (path ), HttpMethods .Delete , responseType );
529522 }
530523
531524 @ Override
532525 public <TResponse > TResponse delete (String path , Type responseType ) {
533- return send (
534- createRequest (resolveUrl (path ), HttpMethods .Delete ),
535- responseType );
526+ return send (resolveUrl (path ), HttpMethods .Delete , responseType );
536527 }
537528
538529 @ Override
539530 public HttpURLConnection delete (String path ) {
540- return createRequest (resolveUrl (path ), HttpMethods .Delete );
531+ return createRequest (resolveUrl (path ), HttpMethods .Delete , null , null );
541532 }
542533
543534}
0 commit comments