Skip to content

Commit

Permalink
Merge pull request spray#761 from jrudolph/i/754/require-form-field-v…
Browse files Browse the repository at this point in the history
…alues

+ routing: add missing support for RequiredValueReceptacles in formField and anyParam directives, fixes spray#754
  • Loading branch information
sirthias committed Jan 14, 2014
2 parents 3a58df5 + 644870a commit 0912eb1
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import shapeless.HNil
import spray.httpx.marshalling.marshalUnsafe
import spray.httpx.unmarshalling.FromStringDeserializers.HexInt
import spray.http._
import spray.httpx.unmarshalling.Deserializer

class FormFieldDirectivesSpec extends RoutingSpec {

Expand Down Expand Up @@ -124,5 +125,38 @@ class FormFieldDirectivesSpec extends RoutingSpec {
}
}
}

"The 'formField' requirement directive" should {
"block requests that do not contain the required formField" in {
Get("/", urlEncodedForm) ~> {
formFields('name ! "Mr. Mike") { completeOk }
} ~> check { handled must beFalse }
}
"block requests that contain the required parameter but with an unmatching value" in {
Get("/", urlEncodedForm) ~> {
formFields('firstName ! "Pete") { completeOk }
} ~> check { handled must beFalse }
}
"let requests pass that contain the required parameter with its required value" in {
Get("/", urlEncodedForm) ~> {
formFields('firstName ! "Mike") { completeOk }
} ~> check { response === Ok }
}
}
"The 'formField' requirement with deserializer directive" should {
"block requests that do not contain the required formField" in {
Get("/", urlEncodedForm) ~> {
formFields('oldAge.as(Deserializer.HexInt) ! 78) { completeOk }
} ~> check { handled must beFalse }
}
"block requests that contain the required parameter but with an unmatching value" in {
Get("/", urlEncodedForm) ~> {
formFields('age.as(Deserializer.HexInt) ! 78) { completeOk }
} ~> check { handled must beFalse }
}
"let requests pass that contain the required parameter with its required value" in {
Get("/", urlEncodedForm) ~> {
formFields('age.as(Deserializer.HexInt) ! 66 /* hex! */ ) { completeOk }
} ~> check { response === Ok }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ object AnyParamDefMagnet {
implicit def forNDefR[T <: NameDefaultReceptacle[_]](value: T)(implicit apdm2: APDM2Tuple1[T]) = apply(value)
implicit def forNDesDefR[T <: NameDeserializerDefaultReceptacle[_]](value: T)(implicit apdm2: APDM2Tuple1[T]) = apply(value)

implicit def forRVR[T <: RequiredValueReceptacle[_]](value: T)(implicit apdm2: APDM2Tuple1[T]) = apply(value)
implicit def forRVDR[T <: RequiredValueDeserializerReceptacle[_]](value: T)(implicit apdm2: APDM2Tuple1[T]) = apply(value)

implicit def forTuple[T <: Product](value: T)(implicit apdm21: AnyParamDefMagnet2[T]) =
new AnyParamDefMagnet {
type Out = apdm21.Out
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,20 @@ object FieldDefMagnet2 extends ToNameReceptaclePimps {
implicit def forNR[T](implicit ev1: UM[HttpForm], ev2: FFC[T]) =
extractField[NameReceptacle[T], T](nr filter(nr))

/************ required formField support ******************/

private def requiredFilter[A](paramName: String, requiredValue: A)(implicit ev1: UM[HttpForm], ffc: FFC[A]) =
filter(NameReceptacle[A](paramName))
.require(_ == requiredValue, MalformedFormFieldRejection(paramName, s"Form field '$paramName' had wrong value."))
implicit def forRVR[T](implicit ev1: UM[HttpForm], ev2: FFC[T]) =
FieldDefMagnetAux[RequiredValueReceptacle[T], Directive0] { rvr
requiredFilter(rvr.name, rvr.requiredValue)
}
implicit def forRVDR[T](implicit ev1: UM[HttpForm], ev2: FBPOU[T] = null) =
FieldDefMagnetAux[RequiredValueDeserializerReceptacle[T], Directive0] { rvr
requiredFilter(rvr.name, rvr.requiredValue)(ev1, FFC.fromFSOD(rvr.deserializer))
}

/************ tuple support ******************/

implicit def forTuple[T <: Product, L <: HList, Out0](implicit hla: HListerAux[T, L], fdma: FieldDefMagnetAux[L, Out0]) =
Expand Down

0 comments on commit 0912eb1

Please sign in to comment.