Skip to content

Commit 0b8a4e2

Browse files
committed
limit supported sparql output types to application/json, application/ld+json
1 parent 770f559 commit 0b8a4e2

2 files changed

Lines changed: 17 additions & 11 deletions

File tree

src/main/java/nl/dtls/fairdatapoint/api/controller/search/SearchSparqlController.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636

3737
package nl.dtls.fairdatapoint.api.controller.search;
3838

39-
import io.swagger.v3.oas.annotations.media.Schema;
4039
import io.swagger.v3.oas.annotations.tags.Tag;
4140
import jakarta.servlet.http.HttpServletResponse;
4241
import org.eclipse.rdf4j.http.server.readonly.sparql.EvaluateResult;
@@ -57,6 +56,8 @@ public class SearchSparqlController {
5756

5857
private static final String[] ALL_GRAPHS = {};
5958

59+
private static final String JSON_MEDIA_TYPES = "application/json, application/ld+json";
60+
6061
private final Repository rdf4jRepository;
6162

6263
private final SparqlQueryEvaluator sparqlQueryEvaluator;
@@ -72,19 +73,23 @@ public SearchSparqlController(Repository rdf4jRepository, SparqlQueryEvaluator s
7273
/**
7374
* Allows authenticated users to POST a full SPARQL query.
7475
* Method body copied from org.eclipse.rdf4j.http.server.readonly.QueryResponder.
75-
* The "Accept" header is required, and allowable values depend on the type of query,
76+
* The "Accept" header is required, and allowable media types depend on the type of query,
7677
* as defined in <code>org.eclipse.rdf4j.http.server.readonly.sparql.QueryTypes.formats</code>.
78+
* However, to simplify things, we restrict the allowable media types to JSON and/or JSON-LD.
7779
*/
7880
@PreAuthorize("isAuthenticated()")
79-
@PostMapping(path = "/search/sparql", consumes = MediaType.APPLICATION_JSON_VALUE)
81+
@PostMapping(
82+
path = "/search/sparql",
83+
consumes = MediaType.APPLICATION_JSON_VALUE,
84+
produces = { MediaType.APPLICATION_JSON_VALUE, "application/ld+json" }
85+
)
8086
public void sparqlPost(
81-
@Schema(example = MediaType.APPLICATION_JSON_VALUE)
82-
@RequestHeader(value = HttpHeaders.ACCEPT) String acceptHeader,
87+
@RequestHeader(value = HttpHeaders.ACCEPT, defaultValue = JSON_MEDIA_TYPES) String acceptHeader,
8388
@RequestBody SparqlQuery sparqlQuery,
8489
HttpServletResponse response
8590
) throws IOException {
8691
// enforce default accept header for wildcard
87-
final String accept = ("*/*".equals(acceptHeader)) ? MediaType.APPLICATION_JSON_VALUE : acceptHeader;
92+
final String accept = ("*/*".equals(acceptHeader)) ? JSON_MEDIA_TYPES : acceptHeader;
8893
try {
8994
final EvaluateResultHttpResponse result = new EvaluateResultHttpResponse(response);
9095
sparqlQueryEvaluator.evaluate(

src/test/java/nl/dtls/fairdatapoint/acceptance/search/sparql/TestSearchSparqlController.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,16 @@ public void postSparqlUnauthenticated() throws JsonProcessingException {
7272
assertTrue(responseBodyMap.containsKey("error"));
7373
}
7474

75-
@Test
76-
public void postSparqlSelectAll() throws JsonProcessingException {
75+
@ParameterizedTest
76+
@ValueSource(strings = { MediaType.APPLICATION_JSON_VALUE, "*/*" })
77+
public void postSparqlSelectAll(String acceptHeader) throws JsonProcessingException {
7778
// prepare request
7879
SearchSparqlController.SparqlQuery sparqlQuery = new SearchSparqlController.SparqlQuery(
7980
querySelectAll, null, null);
8081
RequestEntity<SearchSparqlController.SparqlQuery> request = RequestEntity
8182
.post(url)
8283
.header(HttpHeaders.AUTHORIZATION, ALBERT_TOKEN)
83-
.accept(MediaType.APPLICATION_JSON)
84+
.accept(MediaType.valueOf(acceptHeader))
8485
.contentType(MediaType.APPLICATION_JSON)
8586
.body(sparqlQuery);
8687

@@ -127,8 +128,8 @@ public void postSparqlAskAny() throws JsonProcessingException {
127128

128129
@ParameterizedTest
129130
@ValueSource(strings = {
130-
"CONSTRUCT WHERE { ?s a <https://w3id.org/fdp/fdp-o#MetadataService> } ",
131-
"DESCRIBE ?s WHERE { ?s a <https://w3id.org/fdp/fdp-o#MetadataService> } "
131+
"CONSTRUCT WHERE { ?s a <https://w3id.org/fdp/fdp-o#MetadataService> }",
132+
"DESCRIBE ?s WHERE { ?s a <https://w3id.org/fdp/fdp-o#MetadataService> }"
132133
})
133134
public void postSparqlConstructOrDescribe(String query) throws JsonProcessingException {
134135
// prepare request

0 commit comments

Comments
 (0)