=htp #20884 fix header name rendering issue when $minus present (#20940)

This commit is contained in:
Konrad Malawski 2016-07-13 14:53:56 +02:00 committed by GitHub
parent 55e3e123b1
commit 65fae200b7
3 changed files with 23 additions and 4 deletions

View file

@ -21,7 +21,7 @@ import akka.http.javadsl.{ model ⇒ jm }
import akka.http.scaladsl.model._
sealed abstract class ModeledCompanion[T: ClassTag] extends Renderable {
val name = getClass.getSimpleName.replace("$minus", "-").dropRight(1) // trailing $
val name = ModeledCompanion.nameFromClass(getClass)
val lowercaseName = name.toRootLowerCase
private[this] val nameBytes = name.asciiBytes
final def render[R <: Rendering](r: R): r.type = r ~~ nameBytes ~~ ':' ~~ ' '
@ -36,6 +36,14 @@ sealed abstract class ModeledCompanion[T: ClassTag] extends Renderable {
case res Left(res.errors)
}
}
/** INTERNAL API */
private[akka] object ModeledCompanion {
def nameFromClass[T](clazz: Class[T]): String = {
val name = clazz.getSimpleName.replace("$minus", "-")
if (name.last == '$') name.dropRight(1) // trailing $
else name
}
}
sealed trait ModeledHeader extends HttpHeader with Serializable {
def renderInRequests: Boolean = false // default implementation

View file

@ -34,7 +34,7 @@ class HeaderDirectivesSpec extends RoutingSpec with Inside {
}
"The headerValueByType directive" should {
lazy val route =
val route =
headerValueByType[Origin]() { origin
complete(s"The first origin was ${origin.origins.head}")
}
@ -51,6 +51,16 @@ class HeaderDirectivesSpec extends RoutingSpec with Inside {
}
}
}
"reject a request for missing header, and format it properly when header included special characters (e.g. `-`)" in {
val route = headerValueByType[`User-Agent`]() { agent
complete(s"Agent: ${agent}")
}
Get("abc") ~> route ~> check {
inside(rejection) {
case MissingHeaderRejection("User-Agent")
}
}
}
}
"The headerValueByName directive" should {

View file

@ -7,7 +7,7 @@ package directives
import akka.http.impl.util._
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers.{ HttpOriginRange, ModeledCustomHeader, ModeledCustomHeaderCompanion, Origin }
import akka.http.scaladsl.model.headers._
import scala.reflect.ClassTag
import scala.util.control.NonFatal
@ -91,7 +91,7 @@ trait HeaderDirectives {
* @group header
*/
def headerValueByType[T](magnet: HeaderMagnet[T]): Directive1[T] =
headerValuePF(magnet.extractPF) | reject(MissingHeaderRejection(magnet.runtimeClass.getSimpleName))
headerValuePF(magnet.extractPF) | reject(MissingHeaderRejection(magnet.headerName))
//#optional-header
/**
@ -159,6 +159,7 @@ object HeaderDirectives extends HeaderDirectives
trait HeaderMagnet[T] {
def classTag: ClassTag[T]
def runtimeClass: Class[T]
def headerName = ModeledCompanion.nameFromClass(runtimeClass)
/**
* Returns a partial function that checks if the input value is of runtime type