From 5f334dc2cc4093ab0863d75f29469a93bc6ca179 Mon Sep 17 00:00:00 2001 From: philippus Date: Wed, 9 Aug 2023 23:11:33 +0200 Subject: [PATCH] Update naming for status codes 413 and 422 --- .../directives/MiscDirectivesExamplesTest.java | 4 ++-- .../directives/MiscDirectivesExamplesSpec.scala | 4 ++-- .../pekko/http/javadsl/model/StatusCodes.java | 17 ++++++++++++++++- .../impl/engine/parsing/HttpRequestParser.scala | 4 ++-- .../engine/server/HttpServerBluePrint.scala | 2 +- .../pekko/http/scaladsl/model/StatusCode.scala | 6 +++++- .../impl/engine/server/HttpServerSpec.scala | 4 ++-- .../server/directives/MiscDirectivesTest.java | 2 +- .../server/directives/RouteDirectivesTest.java | 2 +- .../http/scaladsl/server/SizeLimitSpec.scala | 8 ++++---- .../server/directives/MiscDirectivesSpec.scala | 8 ++++---- .../http/scaladsl/server/ExceptionHandler.scala | 4 ++-- .../http/scaladsl/server/RejectionHandler.scala | 2 +- 13 files changed, 43 insertions(+), 24 deletions(-) diff --git a/docs/src/test/java/docs/http/javadsl/server/directives/MiscDirectivesExamplesTest.java b/docs/src/test/java/docs/http/javadsl/server/directives/MiscDirectivesExamplesTest.java index 4a4c3be6c..814c9475d 100644 --- a/docs/src/test/java/docs/http/javadsl/server/directives/MiscDirectivesExamplesTest.java +++ b/docs/src/test/java/docs/http/javadsl/server/directives/MiscDirectivesExamplesTest.java @@ -93,7 +93,7 @@ public void testWithSizeLimit() { testRoute(route) .run(withEntityOfSize.apply(501)) - .assertStatusCode(StatusCodes.PAYLOAD_TOO_LARGE); + .assertStatusCode(StatusCodes.CONTENT_TOO_LARGE); // #withSizeLimitExample } @@ -119,7 +119,7 @@ public void testWithSizeLimitNested() { testRoute(route) .run(withEntityOfSize.apply(801)) - .assertStatusCode(StatusCodes.PAYLOAD_TOO_LARGE); + .assertStatusCode(StatusCodes.CONTENT_TOO_LARGE); // #withSizeLimitExampleNested } diff --git a/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala b/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala index 4743f35a7..192e752f3 100644 --- a/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala +++ b/docs/src/test/scala/docs/http/scaladsl/server/directives/MiscDirectivesExamplesSpec.scala @@ -139,7 +139,7 @@ class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec { } Post("/abc", entityOfSize(501)) ~> Route.seal(route) ~> check { - status shouldEqual StatusCodes.PayloadTooLarge + status shouldEqual StatusCodes.ContentTooLarge } // #withSizeLimit-example @@ -184,7 +184,7 @@ class MiscDirectivesExamplesSpec extends RoutingSpec with CompileOnlySpec { } Post("/abc", entityOfSize(801)) ~> Route.seal(route) ~> check { - status shouldEqual StatusCodes.PayloadTooLarge + status shouldEqual StatusCodes.ContentTooLarge } // #withSizeLimit-nested-example } diff --git a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/StatusCodes.java b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/StatusCodes.java index 638b4a9ad..6c107e1b4 100644 --- a/http-core/src/main/java/org/apache/pekko/http/javadsl/model/StatusCodes.java +++ b/http-core/src/main/java/org/apache/pekko/http/javadsl/model/StatusCodes.java @@ -97,10 +97,19 @@ private StatusCodes() {} org.apache.pekko.http.scaladsl.model.StatusCodes.LengthRequired(); public static final StatusCode PRECONDITION_FAILED = org.apache.pekko.http.scaladsl.model.StatusCodes.PreconditionFailed(); + + public static final StatusCode CONTENT_TOO_LARGE = + org.apache.pekko.http.scaladsl.model.StatusCodes.ContentTooLarge(); + + /** @deprecated deprecated in favor of CONTENT_TOO_LARGE since 1.0.0 */ + @Deprecated public static final StatusCode PAYLOAD_TOO_LARGE = org.apache.pekko.http.scaladsl.model.StatusCodes.PayloadTooLarge(); - /** @deprecated deprecated in favor of PAYLOAD_TOO_LARGE */ + /** + * @deprecated deprecated in favor of PAYLOAD_TOO_LARGE, which was later deprecated in favor of + * CONTENT_TOO_LARGE (please switch to CONTENT_TOO_LARGE) + */ @Deprecated public static final StatusCode REQUEST_ENTITY_TOO_LARGE = org.apache.pekko.http.scaladsl.model.StatusCodes.RequestEntityTooLarge(); @@ -131,8 +140,14 @@ private StatusCodes() {} org.apache.pekko.http.scaladsl.model.StatusCodes.EnhanceYourCalm(); public static final StatusCode MISDIRECTED_REQUEST = org.apache.pekko.http.scaladsl.model.StatusCodes.MisdirectedRequest(); + public static final StatusCode UNPROCESSABLE_CONTENT = + org.apache.pekko.http.scaladsl.model.StatusCodes.UnprocessableContent(); + + /** @deprecated deprecated in favor of UNPROCESSABLE_CONTENT since 1.0.0 */ + @Deprecated public static final StatusCode UNPROCESSABLE_ENTITY = org.apache.pekko.http.scaladsl.model.StatusCodes.UnprocessableEntity(); + public static final StatusCode LOCKED = org.apache.pekko.http.scaladsl.model.StatusCodes.Locked(); public static final StatusCode FAILED_DEPENDENCY = org.apache.pekko.http.scaladsl.model.StatusCodes.FailedDependency(); diff --git a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpRequestParser.scala b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpRequestParser.scala index bb68f8b4d..eda2d7705 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpRequestParser.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/parsing/HttpRequestParser.scala @@ -228,7 +228,7 @@ private[http] final class HttpRequestParser( setCompletionHandling(HttpMessageParser.CompletionOk) startNewMessage(input, bodyStart) } else if (!method.isEntityAccepted) { - failMessageStart(UnprocessableEntity, s"${method.name} requests must not have an entity") + failMessageStart(UnprocessableContent, s"${method.name} requests must not have an entity") } else if (contentLength <= input.size - bodyStart) { val cl = contentLength.toInt emitRequestStart(strictEntity(cth, input, bodyStart, cl)) @@ -240,7 +240,7 @@ private[http] final class HttpRequestParser( } } else { if (!method.isEntityAccepted) { - failMessageStart(UnprocessableEntity, s"${method.name} requests must not have an entity") + failMessageStart(UnprocessableContent, s"${method.name} requests must not have an entity") } else { if (clh.isEmpty) { emitRequestStart(chunkedEntity(cth), headers) diff --git a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/server/HttpServerBluePrint.scala b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/server/HttpServerBluePrint.scala index 61582a470..b173544d7 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/impl/engine/server/HttpServerBluePrint.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/impl/engine/server/HttpServerBluePrint.scala @@ -546,7 +546,7 @@ private[http] object HttpServerBluePrint { } val info = ErrorInfo(summary, "Consider increasing the value of pekko.http.server.parsing.max-content-length") - finishWithIllegalRequestError(StatusCodes.PayloadTooLarge, info) + finishWithIllegalRequestError(StatusCodes.ContentTooLarge, info) case IllegalUriException(errorInfo) => finishWithIllegalRequestError(StatusCodes.BadRequest, errorInfo) diff --git a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala index 221940e09..64af65ab1 100644 --- a/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala +++ b/http-core/src/main/scala/org/apache/pekko/http/scaladsl/model/StatusCode.scala @@ -151,8 +151,10 @@ object StatusCodes extends ObjectRegistry[Int, StatusCode] { val Gone = reg(c(410)("Gone", "The resource requested is no longer available and will not be available again.")) val LengthRequired = reg(c(411)("Length Required", "The request did not specify the length of its content, which is required by the requested resource.")) val PreconditionFailed = reg(c(412)("Precondition Failed", "The server does not meet one of the preconditions that the requester put on the request.")) + val ContentTooLarge = reg(c(413)("Content Too Large", "The request content is larger than the server is willing or able to process.")) + @deprecated("deprecated in favor of ContentTooLarge", "1.0.0") val PayloadTooLarge = reg(c(413)("Payload Too Large", "The request payload is larger than the server is willing or able to process.")) - @deprecated("deprecated in favor of PayloadTooLarge", "Akka HTTP 10.1.11") + @deprecated("deprecated in favor of PayloadTooLarge, which was later deprecated in favor of ContentTooLarge (please switch to ContentTooLarge)", "Akka HTTP 10.1.11") val RequestEntityTooLarge = PayloadTooLarge val UriTooLong = reg(c(414)("URI Too Long", "The URI provided was too long for the server to process.")) @deprecated("deprecated in favor of UriTooLong", "Akka HTTP 10.1.11") @@ -165,6 +167,8 @@ object StatusCodes extends ObjectRegistry[Int, StatusCode] { val ImATeapot = reg(c(418)("I'm a teapot", "The resulting entity body MAY be short and stout.")) val EnhanceYourCalm = reg(c(420)("Enhance Your Calm", "You are being rate-limited.")) // Twitter only val MisdirectedRequest = reg(c(421)("Misdirected Request", "The request was directed at a server that is not able to produce a response.")) // HTTP/2 only. https://tools.ietf.org/html/rfc7540#section-9.1.2 + val UnprocessableContent = reg(c(422)("Unprocessable Content", "The request was well-formed but was unable to be followed due to semantic errors.")) + @deprecated("deprecated in favor of UnprocessableContent", "1.0.0") val UnprocessableEntity = reg(c(422)("Unprocessable Entity", "The request was well-formed but was unable to be followed due to semantic errors.")) val Locked = reg(c(423)("Locked", "The resource that is being accessed is locked.")) val FailedDependency = reg(c(424)("Failed Dependency", "The request failed due to failure of a previous request.")) diff --git a/http-core/src/test/scala/org/apache/pekko/http/impl/engine/server/HttpServerSpec.scala b/http-core/src/test/scala/org/apache/pekko/http/impl/engine/server/HttpServerSpec.scala index 911eb8c2b..a6ee05a83 100644 --- a/http-core/src/test/scala/org/apache/pekko/http/impl/engine/server/HttpServerSpec.scala +++ b/http-core/src/test/scala/org/apache/pekko/http/impl/engine/server/HttpServerSpec.scala @@ -1394,7 +1394,7 @@ class HttpServerSpec extends PekkoSpec( responses.sendError(error.asInstanceOf[Exception]) expectResponseWithWipedDate( - s"""HTTP/1.1 413 Payload Too Large + s"""HTTP/1.1 413 Content Too Large |Server: pekko-http/test |Date: XXXX |Connection: close @@ -1418,7 +1418,7 @@ class HttpServerSpec extends PekkoSpec( responses.sendError(error.asInstanceOf[Exception]) expectResponseWithWipedDate( - s"""HTTP/1.1 413 Payload Too Large + s"""HTTP/1.1 413 Content Too Large |Server: pekko-http/test |Date: XXXX |Connection: close diff --git a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/MiscDirectivesTest.java b/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/MiscDirectivesTest.java index a714b48d5..126e56432 100644 --- a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/MiscDirectivesTest.java +++ b/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/MiscDirectivesTest.java @@ -99,7 +99,7 @@ public void testWithSizeLimit() { route.run(withEntityOfSize(500)).assertStatusCode(StatusCodes.OK); - route.run(withEntityOfSize(501)).assertStatusCode(StatusCodes.PAYLOAD_TOO_LARGE); + route.run(withEntityOfSize(501)).assertStatusCode(StatusCodes.CONTENT_TOO_LARGE); } private HttpRequest withEntityOfSize(int sizeLimit) { diff --git a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/RouteDirectivesTest.java b/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/RouteDirectivesTest.java index c42d74ecb..3df0c503d 100644 --- a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/RouteDirectivesTest.java +++ b/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/directives/RouteDirectivesTest.java @@ -97,7 +97,7 @@ public void testEntitySizeLargerThanLimit() { route .run(HttpRequest.create("/limit-5").withEntity("1234567890")) - .assertStatusCode(StatusCodes.PAYLOAD_TOO_LARGE) + .assertStatusCode(StatusCodes.CONTENT_TOO_LARGE) .assertEntity( "EntityStreamSizeException: incoming entity size (10) exceeded size limit (5 bytes)! " + "This may have been a parser limit (set via `pekko.http.[server|client].parsing.max-content-length`), " diff --git a/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/SizeLimitSpec.scala b/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/SizeLimitSpec.scala index e1f99a93e..8e90215ab 100644 --- a/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/SizeLimitSpec.scala +++ b/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/SizeLimitSpec.scala @@ -78,7 +78,7 @@ class SizeLimitSpec extends AnyWordSpec with Matchers with RequestBuilding with "not accept entities bigger than configured with pekko.http.parsing.max-content-length" in { Http().singleRequest(Post(s"http:/${binding.localAddress}/noDirective", entityOfSize(maxContentLength + 1))) - .futureValue.status shouldEqual StatusCodes.PayloadTooLarge + .futureValue.status shouldEqual StatusCodes.ContentTooLarge } } @@ -116,7 +116,7 @@ class SizeLimitSpec extends AnyWordSpec with Matchers with RequestBuilding with data.size should be > decodeMaxSize Http().singleRequest(request) - .futureValue.status shouldEqual StatusCodes.PayloadTooLarge + .futureValue.status shouldEqual StatusCodes.ContentTooLarge } } @@ -139,7 +139,7 @@ class SizeLimitSpec extends AnyWordSpec with Matchers with RequestBuilding with val request = Post(s"http:/${binding.localAddress}/noDirective", "x").withHeaders(`Content-Encoding`(HttpEncoding("custom"))) val response = Http().singleRequest(request).futureValue - response.status shouldEqual StatusCodes.PayloadTooLarge + response.status shouldEqual StatusCodes.ContentTooLarge } } @@ -162,7 +162,7 @@ class SizeLimitSpec extends AnyWordSpec with Matchers with RequestBuilding with val request = Post(s"http:/${binding.localAddress}/noDirective", "x").withHeaders(`Content-Encoding`(HttpEncoding("custom"))) val response = Http().singleRequest(request).futureValue - response.status shouldEqual StatusCodes.PayloadTooLarge + response.status shouldEqual StatusCodes.ContentTooLarge } } diff --git a/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/directives/MiscDirectivesSpec.scala b/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/directives/MiscDirectivesSpec.scala index 28c60c339..af49b84f7 100644 --- a/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/directives/MiscDirectivesSpec.scala +++ b/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/directives/MiscDirectivesSpec.scala @@ -117,7 +117,7 @@ class MiscDirectivesSpec extends RoutingSpec { } Post("/abc", entityOfSize(501)) ~> Route.seal(route) ~> check { - status shouldEqual StatusCodes.PayloadTooLarge + status shouldEqual StatusCodes.ContentTooLarge entityAs[String] should include("exceeded size limit") } } @@ -135,7 +135,7 @@ class MiscDirectivesSpec extends RoutingSpec { } Post("/abc", formDataOfSize(128)) ~> Route.seal(route) ~> check { - status shouldEqual StatusCodes.PayloadTooLarge + status shouldEqual StatusCodes.ContentTooLarge responseAs[String] shouldEqual "The request content was malformed:\n" + "EntityStreamSizeException: incoming entity size (134) " + "exceeded size limit (64 bytes)! " + @@ -160,7 +160,7 @@ class MiscDirectivesSpec extends RoutingSpec { } Post("/abc", entityOfSize(801)) ~> Route.seal(route) ~> check { - status shouldEqual StatusCodes.PayloadTooLarge + status shouldEqual StatusCodes.ContentTooLarge entityAs[String] should include("exceeded size limit") } @@ -178,7 +178,7 @@ class MiscDirectivesSpec extends RoutingSpec { } Post("/abc", entityOfSize(401)) ~> Route.seal(route2) ~> check { - status shouldEqual StatusCodes.PayloadTooLarge + status shouldEqual StatusCodes.ContentTooLarge entityAs[String] should include("exceeded size limit") } } diff --git a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala index 239229a23..8221ba7ee 100644 --- a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala +++ b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/ExceptionHandler.scala @@ -63,9 +63,9 @@ object ExceptionHandler { ctx.complete((status, info.format(settings.verboseErrorMessages))) } case e: EntityStreamSizeException => ctx => { - ctx.log.error(e, ErrorMessageTemplate, e, PayloadTooLarge) + ctx.log.error(e, ErrorMessageTemplate, e, ContentTooLarge) ctx.request.discardEntityBytes(ctx.materializer) - ctx.complete((PayloadTooLarge, e.getMessage)) + ctx.complete((ContentTooLarge, e.getMessage)) } case e: ExceptionWithErrorInfo => ctx => { ctx.log.error(e, ErrorMessageTemplate, e.info.formatPretty, InternalServerError) diff --git a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/RejectionHandler.scala b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/RejectionHandler.scala index 9481878e3..1206713e3 100644 --- a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/RejectionHandler.scala +++ b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/RejectionHandler.scala @@ -202,7 +202,7 @@ object RejectionHandler { case MalformedRequestContentRejection(msg, throwable) => { val rejectionMessage = "The request content was malformed:\n" + msg throwable match { - case _: EntityStreamSizeException => rejectRequestEntityAndComplete((PayloadTooLarge, rejectionMessage)) + case _: EntityStreamSizeException => rejectRequestEntityAndComplete((ContentTooLarge, rejectionMessage)) case _ => rejectRequestEntityAndComplete((BadRequest, rejectionMessage)) } }