From 5250f6d2c566669c2a848022456929356af6558c Mon Sep 17 00:00:00 2001 From: Benjamin Geer Date: Fri, 5 Mar 2021 14:04:41 +0100 Subject: [PATCH] feat(store): Return 404 if the triplestore returns 404. (#1828) --- .../http/HttpTriplestoreConnector.scala | 30 ++++++++++++------- .../e2e/v2/MetadataRouteV2E2ESpec.scala | 12 +++++++- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala b/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala index 40f8f676ab..9bbbfe4bbe 100644 --- a/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala +++ b/webapi/src/main/scala/org/knora/webapi/store/triplestore/http/HttpTriplestoreConnector.scala @@ -1028,18 +1028,24 @@ class HttpTriplestoreConnector extends Actor with ActorLogging with Instrumentat val response = client.execute(targetHost, request, context) maybeResponse = Some(response) val statusCode: Int = response.getStatusLine.getStatusCode - val statusCategory: Int = statusCode / 100 - if (statusCategory != 2) { - Option(response.getEntity) - .map(responseEntity => EntityUtils.toString(responseEntity, StandardCharsets.UTF_8)) match { - case Some(responseEntityStr) => - log.error(s"Triplestore responded with HTTP code $statusCode: $responseEntityStr") - throw TriplestoreResponseException(s"Triplestore responded with HTTP code $statusCode: $responseEntityStr") - - case None => - log.error(s"Triplestore responded with HTTP code $statusCode") - throw TriplestoreResponseException(s"Triplestore responded with HTTP code $statusCode") + if (statusCode == 404) { + throw NotFoundException("The requested data was not found") + } else { + val statusCategory: Int = statusCode / 100 + + if (statusCategory != 2) { + Option(response.getEntity) + .map(responseEntity => EntityUtils.toString(responseEntity, StandardCharsets.UTF_8)) match { + case Some(responseEntityStr) => + log.error(s"Triplestore responded with HTTP code $statusCode: $responseEntityStr") + throw TriplestoreResponseException( + s"Triplestore responded with HTTP code $statusCode: $responseEntityStr") + + case None => + log.error(s"Triplestore responded with HTTP code $statusCode") + throw TriplestoreResponseException(s"Triplestore responded with HTTP code $statusCode") + } } } @@ -1061,6 +1067,8 @@ class HttpTriplestoreConnector extends Actor with ActorLogging with Instrumentat log.error(socketTimeoutException, message) throw TriplestoreTimeoutException(message = message, e = socketTimeoutException, log = log) + case notFound: NotFoundException => throw notFound + case e: Exception => val message = "Failed to connect to triplestore" log.error(e, message) diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/v2/MetadataRouteV2E2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/v2/MetadataRouteV2E2ESpec.scala index 2adf718664..267c2815c2 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/v2/MetadataRouteV2E2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/v2/MetadataRouteV2E2ESpec.scala @@ -4,7 +4,7 @@ import java.net.URLEncoder import java.nio.file.Paths import akka.http.scaladsl.model.headers.{BasicHttpCredentials, RawHeader} -import akka.http.scaladsl.model.{HttpEntity, HttpResponse} +import akka.http.scaladsl.model.{HttpEntity, HttpResponse, StatusCodes} import org.knora.webapi._ import org.knora.webapi.messages.util.rdf._ import org.knora.webapi.routing.RouteUtilV2 @@ -99,5 +99,15 @@ class MetadataRouteV2E2ESpec extends E2ESpec { assert(response.status.isFailure()) } + "return HTTP 404 if nonexistent metadata is requested" in { + val turtleType = RdfMediaTypes.`text/turtle`.toString() + val header = RawHeader("Accept", turtleType) + val request = Get( + s"$baseApiUrl/v2/metadata/${URLEncoder.encode(SharedTestDataADM.INCUNABULA_PROJECT_IRI, "UTF-8")}") ~> addHeader( + header) + val response: HttpResponse = singleAwaitingRequest(request) + assert(response.status == StatusCodes.NotFound) + } + } }