Skip to content

Commit

Permalink
httpheader X-Cluster-Client-Ip is added
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Lagutko committed Aug 12, 2011
1 parent 870908c commit 90bf221
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 3 deletions.
9 changes: 9 additions & 0 deletions src/main/scala/blueeyes/core/http/HttpHeader.scala
Expand Up @@ -77,6 +77,7 @@ object HttpHeaderField {
`X-Content-Type-Options`,
`X-Requested-With`,
`X-Forwarded-For`,
`X-Cluster-Client-Ip`,
`X-Forwarded-Proto`,
`X-Powered-By`,
`Access-Control-Allow-Origin`,
Expand Down Expand Up @@ -634,6 +635,14 @@ object HttpHeaders {
def unapply(t: (String, String)) = parse(t).map(_.ips)
}

case class `X-Cluster-Client-Ip`(ips: HttpIp*) extends HttpHeaderRequest {
def value = ips.map(_.toString).mkString(", ")
}
implicit case object `X-Cluster-Client-Ip` extends HttpHeaderField[`X-Cluster-Client-Ip`] {
override def parse(s: String) = Some(apply(HttpIps.parseHttpIps(s): _*))
def unapply(t: (String, String)) = parse(t).map(_.ips)
}

case class `X-Forwarded-Proto`(proto: String) extends HttpHeaderRequest {
def value = proto
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/blueeyes/core/service/HttpClient.scala
Expand Up @@ -51,7 +51,7 @@ trait HttpClient[A] extends HttpRequestHandler[A] { self =>
request.copy(headers = request.headers + Tuple2("Cookie", cookieEncoder.encode()))
}

def remoteHost(host: InetAddress) = buildClient { request => HttpRequest(request.method, request.uri, request.parameters, request.headers + Tuple2("X-Forwarded-For", host.getHostAddress()), request.content, Some(host), request.version)}
def remoteHost(host: InetAddress) = buildClient { request => HttpRequest(request.method, request.uri, request.parameters, request.headers + Tuple2("X-Forwarded-For", host.getHostAddress) + Tuple2("X-Cluster-Client-Ip", host.getHostAddress) , request.content, Some(host), request.version)}

def header(name: String, value: String): HttpClient[A] = header((name, value))

Expand Down
Expand Up @@ -53,8 +53,9 @@ trait NettyConverters{
val headers = buildHeaders(request.getHeaders)
val content = fromNettyContent(request.getContent, () => None)

val xforwarded = headers.header(`X-Forwarded-For`)
val remoteHost = xforwarded.flatMap(_.ips.toList.headOption.map(_.ip)).orElse(Some(remoteAddres).collect { case x: InetSocketAddress => x.getAddress })
val xforwarded = headers.header(`X-Forwarded-For`).flatMap(_.ips.toList.headOption.map(_.ip))
val remoteIp = xforwarded.orElse(headers.header(`X-Cluster-Client-Ip`).flatMap(_.ips.toList.headOption.map(_.ip)))
val remoteHost = remoteIp.orElse(Some(remoteAddres).collect { case x: InetSocketAddress => x.getAddress })

HttpRequest(request.getMethod, URI(request.getUri), parameters, headers, content, remoteHost, fromNettyVersion(request.getProtocolVersion))
}
Expand Down
Expand Up @@ -79,6 +79,19 @@ class NettyConvertersSpec extends Specification with PendingUntilFixed with Nett
request.version mustEqual(`HTTP/1.0`)
request.remoteHost mustEqual(Some(forwardedAddress.getAddress))
}
"convert netty NettyHttpRequest to service NettyHttpRequest, modifying ip if X-Cluster-Client-Ip header present" in {
val nettyRequest = new DefaultHttpRequest(NettyHttpVersion.HTTP_1_0, NettyHttpMethod.GET, "http://foo/bar?param1=value1")
nettyRequest.setHeader("X-Cluster-Client-Ip", "111.11.11.1, 121.21.2.2")

val address = new InetSocketAddress("127.0.0.0", 8080)
val forwardedAddress = new InetSocketAddress("111.11.11.1", 8080)
val request = fromNettyRequest(nettyRequest, address)

request.method mustEqual(HttpMethods.GET)
request.uri mustEqual(URI("http://foo/bar?param1=value1"))
request.headers.raw mustEqual(Map("X-Cluster-Client-Ip" -> "111.11.11.1, 121.21.2.2"))
request.remoteHost mustEqual(Some(forwardedAddress.getAddress))
}

"does not use host name from Host header" in {
val nettyRequest = new DefaultHttpRequest(NettyHttpVersion.HTTP_1_0, NettyHttpMethod.GET, "http://foo/bar?param1=value1")
Expand Down

0 comments on commit 90bf221

Please sign in to comment.