Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fa563fc

Browse files
committed
add HeaderKey to make sure keys in Header are compared ignoring the case
1 parent 203d2a1 commit fa563fc

4 files changed

Lines changed: 55 additions & 17 deletions

File tree

src/main/scala/server/handler/FastCgi/FastCgiHandler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class FastCgiHandler(val documentRoot: String) extends Handler with LazyLogging
3030
//params.add("HTTP_CONNECTION", "keep-alive") //TODO
3131

3232
for((k,v) <- request.headers) {
33-
params.add("HTTP_"+k.replace("-", "_").toUpperCase, v)
33+
params.add("HTTP_"+k.toString.replace("-", "_").toUpperCase, v)
3434
if(k == Headers.CONTENT_TYPE) {
3535
params.add("CONTENT_TYPE", v)
3636
}

src/main/scala/server/http/headers/HeaderParser.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class HeaderParser {
55
val headers = new Headers
66
s.trim.split("\r\n(?!( |\t))").map(_.split(":", 2).map(_.trim)).foreach(h => {
77
if(h.length == 2) {
8-
headers += h(0) -> (headers.get(h(0)).map(_+",").getOrElse("")+h(1).replaceAll("\r\n[ \t]+", " "))
8+
headers += new HeaderKey(h(0)) -> (headers.get(h(0)).map(_+",").getOrElse("")+h(1).replaceAll("\r\n[ \t]+", " "))
99
}
1010
})
1111
headers

src/main/scala/server/http/headers/Headers.scala

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,46 @@ package server.http.headers
22

33
import scala.collection.mutable.HashMap
44

5-
//TODO: has to be case insensitive!
6-
class Headers extends HashMap[String, String]
7-
object Headers {
8-
val CONTENT_LENGTH = "Content-Length"
9-
val CONTENT_TYPE = "Content-Type"
10-
val TRANSFER_ENCODING = "Transfer-Encoding"
11-
val ACCEPT_ENCODING = "Accept-Encoding"
12-
val CONNECTION = "Connection"
13-
}
5+
class HeaderKey(private val key: String) {
6+
protected lazy val keyLower = if(key != null) key.toLowerCase else null
7+
8+
override def equals(other: scala.Any): Boolean = {
9+
if(other == null || !other.isInstanceOf[HeaderKey]) {
10+
return false
11+
}
12+
13+
val otherKeyLower = other.asInstanceOf[HeaderKey].keyLower
1414

15-
/*
16-
class HeaderName(name: String) {
17-
override def hashCode(): Int = name.toLowerCase.hashCode
15+
if(keyLower == null) {
16+
return otherKeyLower == null
17+
}
1818

19-
override def equals(obj: scala.Any): Boolean = obj match {
20-
case other: HeaderName
19+
keyLower.equals(otherKeyLower)
2120
}
21+
22+
override def hashCode(): Int = {
23+
if(keyLower != null) keyLower.hashCode() else 0
24+
}
25+
26+
override def toString: String = key
2227
}
23-
*/
28+
29+
class Headers extends HashMap[HeaderKey, String] {
30+
def put(key: String, value: String): Option[String] = put(new HeaderKey(key), value)
31+
32+
def get(key: String): Option[String] = get(new HeaderKey(key))
33+
34+
def getOrElse[B1 >: String](key: String, default: => B1): B1 = getOrElse(new HeaderKey(key), default)
35+
36+
def contains(key: String): Boolean = contains(new HeaderKey(key))
37+
38+
def +=(kv: (String, String)): Headers = +=(new HeaderKey(kv._1) -> kv._2)
39+
}
40+
41+
object Headers {
42+
val CONTENT_LENGTH = new HeaderKey("Content-Length")
43+
val CONTENT_TYPE = new HeaderKey("Content-Type")
44+
val TRANSFER_ENCODING = new HeaderKey("Transfer-Encoding")
45+
val ACCEPT_ENCODING = new HeaderKey("Accept-Encoding")
46+
val CONNECTION = new HeaderKey("Connection")
47+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package server.http.headers
2+
3+
import org.scalamock.scalatest._
4+
import org.scalatest._
5+
6+
class HeadersTestSpec extends FlatSpec with Matchers with MockFactory {
7+
"Headers" should "should treat the keys case-insensitive" in {
8+
val headers = new Headers
9+
10+
headers.put("Foo", "Bar")
11+
headers.get("foo") should be(Some("Bar"))
12+
headers.get("Foo") should be(Some("Bar"))
13+
}
14+
}

0 commit comments

Comments
 (0)