Skip to content

Commit 016fd35

Browse files
committed
re-factor all API's to pass in all request info to send method so a new request can be created
1 parent 80d0597 commit 016fd35

File tree

2 files changed

+108
-100
lines changed

2 files changed

+108
-100
lines changed

src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java

Lines changed: 90 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)