Skip to content

Commit 530a293

Browse files
committed
feat(http-servers-core): add unified request abstraction and headers to response
- Introduced `Request` interface to standardize handling across FusionAuth, JDK, and Jetty servers. - Added custom headers support to `HttpResponse`, including `withHeader` for easy modifications. - Updated query handler methods to utilize the new `Request` abstraction for consistency. - Refactored FusionAuth, JDK, and Jetty query handlers to integrate `Request` and headers. - Bumped Solana BOM version to `25.22.1` in `sava.properties`.
1 parent bece83e commit 530a293

18 files changed

Lines changed: 197 additions & 17 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,4 @@ replay_pid*
6565
*.local
6666
secrets/
6767
/.junie/
68+
/symlinks/

gradle/modules.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
systems.comodal.json_iterator=software.sava:json-iterator
22
software.sava.core=software.sava:sava-core
33
software.sava.rpc=software.sava:sava-rpc
4+
software.sava.idl.clients.core=software.sava:idl-clients-core
5+
software.sava.idl.clients.spl=software.sava:idl-clients-spl
46
software.sava.ravina_core=software.sava:ravina-core
57
software.sava.ravina_solana=software.sava:ravina-solana
68
io.fusionauth.http=io.fusionauth:java-http

gradle/sava.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
productDescription=Http Servers
22
javaVersion=25
3-
solanaBOMVersion=25.21.5
3+
solanaBOMVersion=25.22.1

http-servers-core/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import software.sava.http_servers.core.server.HttpServerBuilderFactory;
22

33
module software.sava.http_servers.core {
4+
exports software.sava.http_servers.core.request;
45
exports software.sava.http_servers.core.response;
56
exports software.sava.http_servers.core.handlers;
67
exports software.sava.http_servers.core.server;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package software.sava.http_servers.core.request;
2+
3+
public interface Request {
4+
5+
String path();
6+
7+
String query();
8+
9+
String header(final String name);
10+
11+
byte[] body();
12+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package software.sava.http_servers.core.response;
22

3-
record HttpBytesResponse(int statusCode, String contentType, byte[] body) implements HttpResponse {
3+
import java.util.Map;
4+
5+
record HttpBytesResponse(int statusCode,
6+
String contentType,
7+
Map<String, String> headers,
8+
byte[] body) implements HttpResponse {
49

510
}

http-servers-core/src/main/java/software/sava/http_servers/core/response/HttpResponse.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
package software.sava.http_servers.core.response;
22

33
import java.nio.charset.StandardCharsets;
4+
import java.util.LinkedHashMap;
5+
import java.util.Map;
46

57
public interface HttpResponse {
68

79
HttpResponse EMPTY = response(200, "application/json", "{}".getBytes(StandardCharsets.US_ASCII));
810

911
static HttpResponse response(final int statusCode, final String contentType, final byte[] body) {
10-
return new HttpBytesResponse(statusCode, contentType, body);
12+
return new HttpBytesResponse(statusCode, contentType, Map.of(), body);
13+
}
14+
15+
static HttpResponse response(final int statusCode,
16+
final String contentType,
17+
final Map<String, String> headers,
18+
final byte[] body) {
19+
return new HttpBytesResponse(statusCode, contentType, headers, body);
1120
}
1221

1322
static HttpResponse response(final String contentType, final byte[] body) {
@@ -38,5 +47,17 @@ static HttpResponse json(final String body) {
3847

3948
String contentType();
4049

50+
/// @return additional response headers (beyond {@code Content-Type}) to be written, never {@code null}.
51+
default Map<String, String> headers() {
52+
return Map.of();
53+
}
54+
55+
/// @return a copy of this response with the given response header set.
56+
default HttpResponse withHeader(final String name, final String value) {
57+
final var headers = new LinkedHashMap<>(headers());
58+
headers.put(name, value);
59+
return new HttpBytesResponse(statusCode(), contentType(), headers, body());
60+
}
61+
4162
byte[] body();
4263
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
package software.sava.http_servers.core.response;
22

3+
import software.sava.http_servers.core.request.Request;
4+
35
public interface QueryHandler {
46

7+
@Deprecated
58
HttpResponse httpResponse(final String path, final String query);
9+
10+
default HttpResponse httpResponse(final Request request) {
11+
return httpResponse(request.path(), request.query());
12+
}
613
}

http-servers-fusionauth/src/main/java/software/sava/http_servers/fusionauth/FusionAuthQueryHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ final class FusionAuthQueryHandler implements HTTPHandler {
1717

1818
@Override
1919
public void handle(final HTTPRequest request, final HTTPResponse response) throws Exception {
20-
final var httpResponse = queryHandler.httpResponse(request.getPath(), request.getQueryString());
20+
final var httpResponse = queryHandler.httpResponse(new FusionAuthRequest(request));
2121
writeResponse(response, httpResponse);
2222
}
2323
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package software.sava.http_servers.fusionauth;
2+
3+
import io.fusionauth.http.server.HTTPRequest;
4+
import software.sava.http_servers.core.request.Request;
5+
6+
final class FusionAuthRequest implements Request {
7+
8+
private final HTTPRequest request;
9+
10+
FusionAuthRequest(final HTTPRequest request) {
11+
this.request = request;
12+
}
13+
14+
@Override
15+
public String path() {
16+
return request.getPath();
17+
}
18+
19+
@Override
20+
public String query() {
21+
return request.getQueryString();
22+
}
23+
24+
@Override
25+
public String header(final String name) {
26+
return request.getHeader(name);
27+
}
28+
29+
@Override
30+
public byte[] body() {
31+
final var body = request.getBodyBytes();
32+
return body == null ? new byte[0] : body;
33+
}
34+
}

0 commit comments

Comments
 (0)