diff --git a/core/common/src/main/java/org/trellisldp/common/TrellisRequest.java b/core/common/src/main/java/org/trellisldp/common/TrellisRequest.java index b11f5501c..ac9912131 100644 --- a/core/common/src/main/java/org/trellisldp/common/TrellisRequest.java +++ b/core/common/src/main/java/org/trellisldp/common/TrellisRequest.java @@ -15,6 +15,7 @@ */ package org.trellisldp.common; +import static java.util.Collections.emptyList; import static javax.ws.rs.core.HttpHeaders.CONTENT_TYPE; import static javax.ws.rs.core.HttpHeaders.LINK; import static org.trellisldp.common.HttpConstants.ACCEPT_DATETIME; @@ -34,6 +35,8 @@ import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; +import org.trellisldp.vocabulary.LDP; + /** * A class representing an HTTP request with various LDP-related headers and query parameters. * @@ -110,14 +113,19 @@ public String getSlug() { } /** - * Get the Link header. + * Get the first LDP Link header. * - * @return the Link header + * @return the first LDP Link header */ public Link getLink() { - final String link = headers.getFirst(LINK); - if (link != null) { - return Link.valueOf(link); + for (final String header : headers.getOrDefault(LINK, emptyList())) { + final Link link = Link.valueOf(header); + if (Link.TYPE.equals(link.getRel())) { + final String uri = link.getUri().toString(); + if (uri.startsWith(LDP.getNamespace()) && !uri.equals(LDP.Resource.getIRIString())) { + return link; + } + } } return null; } diff --git a/core/common/src/test/java/org/trellisldp/common/TrellisRequestTest.java b/core/common/src/test/java/org/trellisldp/common/TrellisRequestTest.java index 03c38b7df..58933a484 100644 --- a/core/common/src/test/java/org/trellisldp/common/TrellisRequestTest.java +++ b/core/common/src/test/java/org/trellisldp/common/TrellisRequestTest.java @@ -208,6 +208,9 @@ void testLinkHeader() { final URI uri = create("http://example.com/"); final MultivaluedMap queryParams = new MultivaluedHashMap<>(); final MultivaluedMap headers = new MultivaluedHashMap<>(); + headers.add("Link", "; rel=\"type\""); + headers.add("Link", "; rel=\"type\""); + headers.add("Link", "; rel=\"about\""); final String rawLink = "; rel=\"type\""; headers.add("Link", rawLink); final MultivaluedMap pathParams = new MultivaluedHashMap<>(); @@ -224,4 +227,27 @@ void testLinkHeader() { final TrellisRequest req = new TrellisRequest(mockRequest, mockUriInfo, mockHeaders); assertEquals(Link.valueOf(rawLink), req.getLink()); } + + @Test + void testSkippedLinkHeaders() { + final URI uri = create("http://example.com/"); + final MultivaluedMap queryParams = new MultivaluedHashMap<>(); + final MultivaluedMap headers = new MultivaluedHashMap<>(); + headers.add("Link", "; rel=\"type\""); + headers.add("Link", "; rel=\"type\""); + headers.add("Link", "; rel=\"about\""); + final MultivaluedMap pathParams = new MultivaluedHashMap<>(); + pathParams.add("path", "resource"); + + when(mockUriInfo.getPath()).thenReturn("resource"); + when(mockUriInfo.getPathParameters()).thenReturn(pathParams); + when(mockUriInfo.getQueryParameters()).thenReturn(queryParams); + when(mockUriInfo.getBaseUri()).thenReturn(uri); + when(mockHeaders.getRequestHeaders()).thenReturn(headers); + when(mockRequest.getMethod()).thenReturn(GET); + when(mockHeaders.getAcceptableMediaTypes()).thenReturn(singletonList(RdfMediaType.TEXT_TURTLE_TYPE)); + + final TrellisRequest req = new TrellisRequest(mockRequest, mockUriInfo, mockHeaders); + assertNull(req.getLink()); + } } diff --git a/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java b/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java index 509a0cfb7..886de9421 100644 --- a/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java +++ b/core/http/src/main/java/org/trellisldp/http/impl/PostHandler.java @@ -119,14 +119,8 @@ private static RDFSyntax getRdfSyntax(final String contentType, final List