Skip to content

Commit

Permalink
=htp akka#16814 Fix ClassCastException in PathMatchers.NumberMatcher
Browse files Browse the repository at this point in the history
Direct port of spray/spray@43bb625
  • Loading branch information
sirthias committed Feb 23, 2015
1 parent cac9c9f commit f869d6c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,19 @@ class PathDirectivesSpec extends RoutingSpec with Inside {
"reject [/2147483648]" in test() // > Int.MaxValue
}

"pathPrefix(CustomShortNumber)" should {
object CustomShortNumber extends NumberMatcher[Short](Short.MaxValue, 10) {
def fromChar(c: Char) = fromDecimalChar(c)
}

val test = testFor(pathPrefix(CustomShortNumber) { echoCaptureAndUnmatchedPath })
"accept [/23]" in test("23:")
"accept [/12345yes]" in test("12345:yes")
"reject [/]" in test()
"reject [/abc]" in test()
"reject [/33000]" in test() // > Short.MaxValue
}

"pathPrefix(JavaUUID)" should {
val test = testFor(pathPrefix(JavaUUID) { echoCaptureAndUnmatchedPath })
"accept [/bdea8652-f26c-40ca-8157-0b96a2a8389d]" in test("bdea8652-f26c-40ca-8157-0b96a2a8389d:")
Expand Down
7 changes: 3 additions & 4 deletions akka-http/src/main/scala/akka/http/server/PathMatcher.scala
Original file line number Diff line number Diff line change
Expand Up @@ -378,13 +378,12 @@ trait PathMatchers {

def fromChar(c: Char): T

def fromDecimalChar(c: Char): T = if ('0' <= c && c <= '9') (c - '0').asInstanceOf[T] else minusOne
def fromDecimalChar(c: Char): T = if ('0' <= c && c <= '9') x.fromInt(c - '0') else minusOne

def fromHexChar(c: Char): T =
if ('0' <= c && c <= '9') (c - '0').asInstanceOf[T] else {
if ('0' <= c && c <= '9') x.fromInt(c - '0') else {
val cn = c | 0x20 // normalize to lowercase
if ('a' <= cn && cn <= 'f') (cn - 'a' + 10).asInstanceOf[T] else
minusOne
if ('a' <= cn && cn <= 'f') x.fromInt(cn - 'a' + 10) else minusOne
}
}

Expand Down

0 comments on commit f869d6c

Please sign in to comment.