aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/scala/xyz/driver/core/rest/package.scala12
-rw-r--r--src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala14
-rw-r--r--src/test/scala/xyz/driver/core/TimeTest.scala4
3 files changed, 25 insertions, 5 deletions
diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala
index e3c0c40..07eb92e 100644
--- a/src/main/scala/xyz/driver/core/rest/package.scala
+++ b/src/main/scala/xyz/driver/core/rest/package.scala
@@ -66,6 +66,7 @@ object `package` {
val AuthenticationTokenHeader: String = "Authorization"
val PermissionsTokenHeader: String = "Permissions"
val AuthenticationHeaderPrefix: String = "Bearer"
+ val ClientFingerprintHeader: String = "X-CLIENT-FINGERPRINT"
val TrackingIdHeader: String = "X-Trace"
val StacktraceHeader: String = "X-Stacktrace"
val OriginatingIpHeader: String = "X-Forwarded-For"
@@ -90,12 +91,12 @@ object `package` {
"Content-Length",
"Accept",
"X-Trace",
- "X-Client-Fingerprint",
"Access-Control-Allow-Methods",
"Access-Control-Allow-Origin",
"Access-Control-Allow-Headers",
"Server",
"Date",
+ ContextHeaders.ClientFingerprintHeader,
ContextHeaders.TrackingIdHeader,
ContextHeaders.TraceHeaderName,
ContextHeaders.SpanHeaderName,
@@ -147,6 +148,7 @@ object `package` {
new ServiceRequestContext(
extractTrackingId(request),
extractOriginatingIP(request, remoteAddress),
+ extractFingerprintHash(request),
extractContextHeaders(request))
def extractTrackingId(request: HttpRequest): String = {
@@ -155,6 +157,12 @@ object `package` {
.fold(java.util.UUID.randomUUID.toString)(_.value())
}
+ def extractFingerprintHash(request: HttpRequest): Option[String] = {
+ request.headers
+ .find(_.name === ContextHeaders.ClientFingerprintHeader)
+ .map(_.value())
+ }
+
def extractOriginatingIP(request: HttpRequest, remoteAddress: RemoteAddress): Option[InetAddress] = {
request.headers
.find(_.name === ContextHeaders.OriginatingIpHeader)
@@ -170,7 +178,7 @@ object `package` {
h.name === ContextHeaders.AuthenticationTokenHeader || h.name === ContextHeaders.TrackingIdHeader ||
h.name === ContextHeaders.PermissionsTokenHeader || h.name === ContextHeaders.StacktraceHeader ||
h.name === ContextHeaders.TraceHeaderName || h.name === ContextHeaders.SpanHeaderName ||
- h.name === ContextHeaders.OriginatingIpHeader
+ h.name === ContextHeaders.OriginatingIpHeader || h.name === ContextHeaders.ClientFingerprintHeader
} map { header =>
if (header.name === ContextHeaders.AuthenticationTokenHeader) {
header.name -> header.value.stripPrefix(ContextHeaders.AuthenticationHeaderPrefix).trim
diff --git a/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala b/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
index 5282956..7206049 100644
--- a/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
+++ b/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala
@@ -6,11 +6,13 @@ import xyz.driver.core.auth.{AuthToken, PermissionsToken, User}
import xyz.driver.core.generators
import scalaz.Scalaz.{mapEqual, stringInstance}
+import scalaz.Scalaz.optionEqual
import scalaz.syntax.equal._
class ServiceRequestContext(
val trackingId: String = generators.nextUuid().toString,
val originatingIp: Option[InetAddress] = None,
+ val fingerprintHash: Option[String] = None,
val contextHeaders: Map[String, String] = Map.empty[String, String]) {
def authToken: Option[AuthToken] =
contextHeaders.get(AuthProvider.AuthenticationTokenHeader).map(AuthToken.apply)
@@ -22,6 +24,7 @@ class ServiceRequestContext(
new ServiceRequestContext(
trackingId,
originatingIp,
+ fingerprintHash,
contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value)
)
@@ -29,16 +32,21 @@ class ServiceRequestContext(
new AuthorizedServiceRequestContext(
trackingId,
originatingIp,
+ fingerprintHash,
contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value),
user
)
override def hashCode(): Int =
- Seq[Any](trackingId, originatingIp, contextHeaders).foldLeft(31)((result, obj) => 31 * result + obj.hashCode())
+ Seq[Any](trackingId, originatingIp, fingerprintHash, contextHeaders)
+ .foldLeft(31)((result, obj) => 31 * result + obj.hashCode())
override def equals(obj: Any): Boolean = obj match {
case ctx: ServiceRequestContext =>
- trackingId === ctx.trackingId && originatingIp == originatingIp && contextHeaders === ctx.contextHeaders
+ trackingId === ctx.trackingId &&
+ originatingIp == originatingIp &&
+ fingerprintHash === ctx.fingerprintHash &&
+ contextHeaders === ctx.contextHeaders
case _ => false
}
@@ -48,6 +56,7 @@ class ServiceRequestContext(
class AuthorizedServiceRequestContext[U <: User](
override val trackingId: String = generators.nextUuid().toString,
override val originatingIp: Option[InetAddress] = None,
+ override val fingerprintHash: Option[String] = None,
override val contextHeaders: Map[String, String] = Map.empty[String, String],
val authenticatedUser: U)
extends ServiceRequestContext {
@@ -56,6 +65,7 @@ class AuthorizedServiceRequestContext[U <: User](
new AuthorizedServiceRequestContext[U](
trackingId,
originatingIp,
+ fingerprintHash,
contextHeaders.updated(AuthProvider.PermissionsTokenHeader, permissionsToken.value),
authenticatedUser)
diff --git a/src/test/scala/xyz/driver/core/TimeTest.scala b/src/test/scala/xyz/driver/core/TimeTest.scala
index b72fde8..75588a2 100644
--- a/src/test/scala/xyz/driver/core/TimeTest.scala
+++ b/src/test/scala/xyz/driver/core/TimeTest.scala
@@ -74,7 +74,9 @@ class TimeTest extends FlatSpec with Matchers with Checkers {
}
it should "have correct textual representations" in {
-
+ import java.util.Locale
+ import java.util.Locale._
+ Locale.setDefault(ENGLISH)
textualDate(TimeZone.getTimeZone("EDT"))(Time(1468937089834L)) should be("July 19, 2016")
textualTime(TimeZone.getTimeZone("PDT"))(Time(1468937089834L)) should be("Jul 19, 2016 02:04:49 PM")
}