1
1
package io .mailtrap .http .impl ;
2
2
3
+ import com .fasterxml .jackson .databind .JavaType ;
4
+ import com .fasterxml .jackson .databind .type .TypeFactory ;
3
5
import io .mailtrap .Mapper ;
4
6
import io .mailtrap .config .MailtrapConfig ;
5
7
import io .mailtrap .exception .BaseMailtrapException ;
13
15
import io .mailtrap .model .response .ErrorResponse ;
14
16
15
17
import java .io .IOException ;
16
- import java .io .InputStream ;
17
18
import java .net .URI ;
18
19
import java .net .http .HttpClient ;
19
20
import java .net .http .HttpRequest ;
20
21
import java .net .http .HttpResponse ;
21
22
import java .util .HashMap ;
23
+ import java .util .List ;
22
24
import java .util .Map ;
23
25
24
26
public class DefaultMailtrapHttpClient implements CustomHttpClient {
@@ -37,72 +39,106 @@ public DefaultMailtrapHttpClient(MailtrapConfig config) {
37
39
38
40
@ Override
39
41
public <T > T get (String url , RequestData requestData , Class <T > responseType ) throws HttpException {
40
- HttpRequest httpRequest = prebuildRequest (url , requestData )
42
+ HttpRequest httpRequest = prepareRequest (url , requestData )
41
43
.GET ()
42
44
.build ();
43
45
return this .request (httpRequest , responseType );
44
46
}
45
47
48
+ @ Override
49
+ public <T > List <T > getList (String url , RequestData requestData , Class <T > responseClass ) throws HttpException {
50
+ HttpRequest httpRequest = prepareRequest (url , requestData )
51
+ .GET ()
52
+ .build ();
53
+
54
+ JavaType responseType = TypeFactory .defaultInstance ().constructCollectionType (List .class , responseClass );
55
+
56
+ return this .request (httpRequest , responseType );
57
+ }
58
+
46
59
@ Override
47
60
public <T > T delete (String url , RequestData requestData , Class <T > responseType ) throws HttpException {
48
- HttpRequest httpRequest = prebuildRequest (url , requestData )
61
+ HttpRequest httpRequest = prepareRequest (url , requestData )
49
62
.DELETE ()
50
63
.build ();
51
64
return this .request (httpRequest , responseType );
52
65
}
53
66
54
67
@ Override
55
68
public <T > T head (String url , RequestData requestData , Class <T > responseType ) throws HttpException {
56
- HttpRequest httpRequest = prebuildRequest (url , requestData )
69
+ HttpRequest httpRequest = prepareRequest (url , requestData )
57
70
.method ("HEAD" , HttpRequest .BodyPublishers .noBody ())
58
71
.build ();
59
72
return this .request (httpRequest , responseType );
60
73
}
61
74
62
75
@ Override
63
76
public <T , V extends AbstractModel > T post (String url , V data , RequestData requestData , Class <T > responseType ) throws HttpException {
64
- HttpRequest httpRequest = prebuildRequest (url , requestData )
77
+ HttpRequest httpRequest = prepareRequest (url , requestData )
65
78
.POST (HttpRequest .BodyPublishers .ofString (data .toJson ()))
66
79
.build ();
67
80
return this .request (httpRequest , responseType );
68
81
}
69
82
70
83
@ Override
71
84
public <T , V extends AbstractModel > T put (String url , V data , RequestData requestData , Class <T > responseType ) throws HttpException {
72
- HttpRequest httpRequest = prebuildRequest (url , requestData )
85
+ HttpRequest httpRequest = prepareRequest (url , requestData )
73
86
.PUT (HttpRequest .BodyPublishers .ofString (data .toJson ()))
74
87
.build ();
75
88
return this .request (httpRequest , responseType );
76
89
}
77
90
78
91
@ Override
79
92
public <T , V extends AbstractModel > T patch (String url , V data , RequestData requestData , Class <T > responseType ) throws HttpException {
80
- HttpRequest httpRequest = prebuildRequest (url , requestData )
93
+ HttpRequest httpRequest = prepareRequest (url , requestData )
81
94
.method ("PATCH" , HttpRequest .BodyPublishers .ofString (data .toJson ()))
82
95
.build ();
83
96
return this .request (httpRequest , responseType );
84
97
}
85
98
86
99
private <T > T request (HttpRequest request , Class <T > responseType ) throws HttpException {
87
100
try {
88
- var send = httpClient .send (request , HttpResponse .BodyHandlers .ofInputStream ());
101
+ var send = httpClient .send (request , HttpResponse .BodyHandlers .ofString ());
102
+ return handleResponse (send , responseType );
103
+ } catch (InterruptedException | IOException e ) {
104
+ throw new BaseMailtrapException ("An error has occurred while sending request" , e );
105
+ }
106
+ }
107
+
108
+ private <T > T request (HttpRequest request , JavaType responseType ) throws HttpException {
109
+ try {
110
+ var send = httpClient .send (request , HttpResponse .BodyHandlers .ofString ());
89
111
return handleResponse (send , responseType );
90
112
} catch (InterruptedException | IOException e ) {
91
113
throw new BaseMailtrapException ("An error has occurred while sending request" , e );
92
114
}
93
115
}
94
116
95
- private <T > T handleResponse (HttpResponse <InputStream > response , Class <T > responseType ) {
96
- try (InputStream body = response .body ()) {
97
- if (body == null ) {
117
+ private <T > T handleResponse (HttpResponse <String > response , Class <T > responseType ) throws HttpException {
118
+ return handleResponseInternal (response , responseType , null );
119
+ }
120
+
121
+ private <T > T handleResponse (HttpResponse <String > response , JavaType responseType ) throws HttpException {
122
+ return handleResponseInternal (response , null , responseType );
123
+ }
124
+
125
+ private <T > T handleResponseInternal (HttpResponse <String > response , Class <T > responseClassType , JavaType responseJavaType ) throws HttpException {
126
+ try {
127
+ if (response .body () == null ) {
98
128
throw new BaseMailtrapException ("Response body is null" );
99
129
}
100
130
101
131
int statusCode = response .statusCode ();
102
132
if (statusCode == 200 ) {
103
- return Mapper .get ().readValue (body , responseType );
133
+ if (responseClassType != null ) {
134
+ return Mapper .get ().readValue (response .body (), responseClassType );
135
+ } else if (responseJavaType != null ) {
136
+ return Mapper .get ().readValue (response .body (), responseJavaType );
137
+ } else {
138
+ throw new IllegalArgumentException ("Both responseType and typeReference are null" );
139
+ }
104
140
} else if (statusCode >= 400 && statusCode < 500 ) {
105
- ErrorResponse errorResponse = Mapper .get ().readValue (body , ErrorResponse .class );
141
+ ErrorResponse errorResponse = Mapper .get ().readValue (response . body () , ErrorResponse .class );
106
142
throw new HttpClientException (String .join (", " , errorResponse .getErrors ()), statusCode );
107
143
} else if (statusCode > 500 ) {
108
144
throw new HttpServerException (String .format ("Internal Server Error. HTTP response code (%d) received from the API server. Retry later or contact support." , statusCode ), statusCode );
@@ -113,7 +149,7 @@ private <T> T handleResponse(HttpResponse<InputStream> response, Class<T> respon
113
149
}
114
150
}
115
151
116
- private HttpRequest .Builder prebuildRequest (String url , RequestData requestData ) {
152
+ private HttpRequest .Builder prepareRequest (String url , RequestData requestData ) {
117
153
118
154
HttpRequest .Builder requestBuilder = HttpRequest .newBuilder ()
119
155
.uri (URI .create (this .appendUrlParams (url , requestData .getQueryParams ())))
0 commit comments