Skip to content

Commit 133cb38

Browse files
committed
#15 - Add PATCH, HEAD, TRACE verbs, bump to upper case VERB methods and deprecate the existing lower case one
1 parent 6125bb1 commit 133cb38

File tree

4 files changed

+233
-27
lines changed

4 files changed

+233
-27
lines changed

client/src/main/java/io/avaje/http/client/DHttpClientRequest.java

Lines changed: 51 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ class DHttpClientRequest implements HttpClientRequest, HttpClientResponse {
2222

2323
private static final String CONTENT_TYPE = "Content-Type";
2424
private static final String CONTENT_ENCODING = "Content-Encoding";
25+
private static final String VERB_DELETE = "DELETE";
26+
private static final String VERB_HEAD = "HEAD";
27+
private static final String VERB_PATCH = "PATCH";
28+
private static final String VERB_TRACE = "TRACE";
2529

2630
private final DHttpClientContext context;
2731
private final UrlBuilder url;
@@ -211,7 +215,7 @@ private HttpRequest.BodyPublisher body() {
211215
} else if (formParams != null) {
212216
return bodyFromForm();
213217
} else {
214-
return null;
218+
return HttpRequest.BodyPublishers.noBody();
215219
}
216220
}
217221

@@ -264,29 +268,47 @@ private void addHeaders() {
264268
}
265269
}
266270

267-
public HttpClientResponse get() {
271+
@Override
272+
public HttpClientResponse HEAD() {
273+
httpRequest = newHead(url.build());
274+
return this;
275+
}
276+
277+
public HttpClientResponse GET() {
268278
httpRequest = newGet(url.build());
269279
return this;
270280
}
271281

272282
@Override
273-
public HttpClientResponse delete() {
274-
httpRequest = newDelete(url.build());
283+
public HttpClientResponse DELETE() {
284+
httpRequest = newDelete(url.build(), body());
275285
return this;
276286
}
277287

278288
@Override
279-
public HttpClientResponse post() {
289+
public HttpClientResponse POST() {
280290
httpRequest = newPost(url.build(), body());
281291
return this;
282292
}
283293

284294
@Override
285-
public HttpClientResponse put() {
295+
public HttpClientResponse PUT() {
286296
httpRequest = newPut(url.build(), body());
287297
return this;
288298
}
289299

300+
@Override
301+
public HttpClientResponse PATCH() {
302+
httpRequest = newPatch(url.build(), body());
303+
return this;
304+
}
305+
306+
@Override
307+
public HttpClientResponse TRACE() {
308+
httpRequest = newTrace(url.build(), body());
309+
return this;
310+
}
311+
290312
private void readResponseContent() {
291313
final HttpResponse<byte[]> response = asByteArray();
292314
this.httpResponse = response;
@@ -368,30 +390,39 @@ public HttpResponse<Stream<String>> asLines() {
368390
return withResponseHandler(HttpResponse.BodyHandlers.ofLines());
369391
}
370392

371-
protected HttpRequest.Builder newGet(String url) {
393+
private HttpRequest.Builder newReq(String url) {
372394
return HttpRequest.newBuilder()
373395
.uri(URI.create(url))
374-
.timeout(requestTimeout)
375-
.GET();
396+
.timeout(requestTimeout);
376397
}
377398

378-
protected HttpRequest.Builder newDelete(String url) {
379-
return HttpRequest.newBuilder()
380-
.uri(URI.create(url))
381-
.timeout(requestTimeout)
382-
.DELETE();
399+
private HttpRequest.Builder newHead(String url) {
400+
return newRequest(VERB_HEAD, url, HttpRequest.BodyPublishers.noBody());
401+
}
402+
403+
private HttpRequest.Builder newGet(String url) {
404+
return newReq(url).GET();
405+
}
406+
407+
private HttpRequest.Builder newPost(String url, HttpRequest.BodyPublisher body) {
408+
return newReq(url).POST(body);
409+
}
410+
411+
private HttpRequest.Builder newPut(String url, HttpRequest.BodyPublisher body) {
412+
return newReq(url).PUT(body);
383413
}
384414

385-
public HttpRequest.Builder newPost(String url, HttpRequest.BodyPublisher body) {
386-
return newRequest("POST", url, body);
415+
private HttpRequest.Builder newPatch(String url, HttpRequest.BodyPublisher body) {
416+
return newRequest(VERB_PATCH, url, body);
387417
}
388418

389-
public HttpRequest.Builder newPut(String url, HttpRequest.BodyPublisher body) {
390-
return newRequest("PUT", url, body);
419+
private HttpRequest.Builder newDelete(String url, HttpRequest.BodyPublisher body) {
420+
// allow DELETE to have a body
421+
return newRequest(VERB_DELETE, url, body);
391422
}
392423

393-
public HttpRequest.Builder newPatch(String url, HttpRequest.BodyPublisher body) {
394-
return newRequest("PATCH", url, body);
424+
private HttpRequest.Builder newTrace(String url, HttpRequest.BodyPublisher body) {
425+
return newRequest(VERB_TRACE, url, body);
395426
}
396427

397428
protected HttpRequest.Builder newRequest(String method, String url, HttpRequest.BodyPublisher body) {

client/src/main/java/io/avaje/http/client/HttpClientRequest.java

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,24 +228,79 @@ public interface HttpClientRequest {
228228
*/
229229
HttpClientRequest body(HttpRequest.BodyPublisher body);
230230

231+
/**
232+
* Deprecated migrate to GET().
233+
*/
234+
@Deprecated
235+
default HttpClientResponse get() {
236+
return GET();
237+
}
238+
239+
/**
240+
* Deprecated migrate to POST().
241+
*/
242+
@Deprecated
243+
default HttpClientResponse post() {
244+
return POST();
245+
}
246+
247+
/**
248+
* Deprecated migrate to PUT().
249+
*/
250+
@Deprecated
251+
default HttpClientResponse put() {
252+
return PUT();
253+
}
254+
255+
/**
256+
* Deprecated migrate to PATCH().
257+
*/
258+
@Deprecated
259+
default HttpClientResponse patch() {
260+
return PATCH();
261+
}
262+
263+
/**
264+
* Deprecated migrate to DELETE().
265+
*/
266+
@Deprecated
267+
default HttpClientResponse delete() {
268+
return DELETE();
269+
}
270+
231271
/**
232272
* Execute the request as a GET.
233273
*/
234-
HttpClientResponse get();
274+
HttpClientResponse GET();
235275

236276
/**
237277
* Execute the request as a POST.
238278
*/
239-
HttpClientResponse post();
279+
HttpClientResponse POST();
240280

241281
/**
242282
* Execute the request as a PUT.
243283
*/
244-
HttpClientResponse put();
284+
HttpClientResponse PUT();
285+
286+
/**
287+
* Execute the request as a PATCH.
288+
*/
289+
HttpClientResponse PATCH();
245290

246291
/**
247292
* Execute the request as a DELETE.
248293
*/
249-
HttpClientResponse delete();
294+
HttpClientResponse DELETE();
295+
296+
/**
297+
* Execute the request as a TRACE.
298+
*/
299+
HttpClientResponse TRACE();
300+
301+
/**
302+
* Execute the request as a HEAD.
303+
*/
304+
HttpClientResponse HEAD();
250305

251306
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package io.avaje.http.client;
2+
3+
import org.junit.jupiter.api.Disabled;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.net.http.HttpResponse;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
public class VerbTest extends BaseWebTest {
11+
12+
private final HttpClientContext clientContext = client();
13+
14+
@Test
15+
void post() {
16+
17+
HttpResponse<String> res = clientContext.request()
18+
.path("post")
19+
.POST()
20+
.asString();
21+
22+
assertThat(res.body()).isEqualTo("post");
23+
24+
HttpResponse<String> res2 = clientContext.request()
25+
.path("post")
26+
.post()
27+
.asString();
28+
29+
assertThat(res2.body()).isEqualTo("post");
30+
}
31+
32+
@Test
33+
void put() {
34+
35+
HttpResponse<String> res = clientContext.request()
36+
.path("put")
37+
.PUT()
38+
.asString();
39+
40+
assertThat(res.body()).isEqualTo("put");
41+
42+
HttpResponse<String> res2 = clientContext.request()
43+
.path("put")
44+
.put()
45+
.asString();
46+
47+
assertThat(res2.body()).isEqualTo("put");
48+
}
49+
50+
@Test
51+
void patch() {
52+
53+
HttpResponse<String> res = clientContext.request()
54+
.path("patch")
55+
.PATCH().asString();
56+
57+
assertThat(res.body()).isEqualTo("patch");
58+
}
59+
60+
@Disabled
61+
@Test()
62+
void trace() {
63+
64+
HttpResponse<String> res = clientContext.request()
65+
.path("patch")
66+
.TRACE().asString();
67+
68+
assertThat(res.body()).isEqualTo("patch");
69+
}
70+
71+
@Test
72+
void delete() {
73+
74+
HttpResponse<String> res = clientContext.request()
75+
.path("delete")
76+
.DELETE().asString();
77+
78+
assertThat(res.body()).isEqualTo("delete body[]");
79+
}
80+
81+
@Test
82+
void delete_with_body() {
83+
84+
HttpResponse<String> res = clientContext.request()
85+
.path("delete")
86+
.body("dummy")
87+
.DELETE().asString();
88+
89+
assertThat(res.body()).isEqualTo("delete body[dummy]");
90+
}
91+
92+
@Test
93+
void head() {
94+
95+
HttpResponse<String> res = clientContext.request()
96+
.path("head")
97+
.body("dummy")
98+
.HEAD().asString();
99+
100+
assertThat(res.statusCode()).isEqualTo(200);
101+
assertThat(res.body()).isEqualTo("");
102+
}
103+
104+
@Test
105+
void get() {
106+
107+
HttpResponse<String> res = clientContext.request()
108+
.path("get")
109+
.body("dummy")
110+
.GET().asString();
111+
112+
assertThat(res.body()).isEqualTo("get");
113+
}
114+
115+
}

client/src/test/java/org/example/webserver/App.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,14 @@ public static Javalin start(int port) {
5656
ctx.json(map);
5757
});
5858

59-
app.get("/", ctx -> {
60-
ctx.result("Hello World");
61-
});
59+
app.get("/", ctx -> ctx.result("Hello World"));
60+
app.head("/head", ctx -> ctx.result("head"));
61+
app.get("/get", ctx -> ctx.result("get"));
62+
app.post("/post", ctx -> ctx.result("post"));
63+
app.put("/put", ctx -> ctx.result("put"));
64+
app.patch("/patch", ctx -> ctx.result("patch"));
65+
//app.tra("/patch", ctx -> ctx.result("patch"));
66+
app.delete("/delete", ctx -> ctx.result("delete body[" + ctx.body() + "]"));
6267

6368
// // All WebRoutes / Controllers ... from DI Context
6469
// List<WebRoutes> webRoutes = context.getBeans(WebRoutes.class);

0 commit comments

Comments
 (0)