Merge pull request #17370 from gmethvin/http-date-header
Fix caching of HTTP Date header
This commit is contained in:
commit
ba3a69369f
2 changed files with 23 additions and 5 deletions
|
|
@ -37,18 +37,19 @@ private[http] class HttpResponseRendererFactory(serverHeader: Option[headers.Ser
|
||||||
|
|
||||||
private def dateHeader: Array[Byte] = {
|
private def dateHeader: Array[Byte] = {
|
||||||
var (cachedSeconds, cachedBytes) = cachedDateHeader
|
var (cachedSeconds, cachedBytes) = cachedDateHeader
|
||||||
val now = System.currentTimeMillis
|
val now = currentTimeMillis()
|
||||||
if (now - 1000 > cachedSeconds) {
|
if (now / 1000 > cachedSeconds) {
|
||||||
cachedSeconds = now / 1000
|
cachedSeconds = now / 1000
|
||||||
val r = new ByteArrayRendering(48)
|
val r = new ByteArrayRendering(48)
|
||||||
dateTime(now).renderRfc1123DateTimeString(r ~~ headers.Date) ~~ CrLf
|
DateTime(now).renderRfc1123DateTimeString(r ~~ headers.Date) ~~ CrLf
|
||||||
cachedBytes = r.get
|
cachedBytes = r.get
|
||||||
cachedDateHeader = cachedSeconds -> cachedBytes
|
cachedDateHeader = cachedSeconds -> cachedBytes
|
||||||
}
|
}
|
||||||
cachedBytes
|
cachedBytes
|
||||||
}
|
}
|
||||||
|
|
||||||
protected def dateTime(now: Long) = DateTime(now) // split out so we can stabilize by overriding in tests
|
// split out so we can stabilize by overriding in tests
|
||||||
|
protected def currentTimeMillis(): Long = System.currentTimeMillis()
|
||||||
|
|
||||||
def newRenderer: HttpResponseRenderer = new HttpResponseRenderer
|
def newRenderer: HttpResponseRenderer = new HttpResponseRenderer
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,23 @@ class ResponseRendererSpec extends FreeSpec with Matchers with BeforeAndAfterAll
|
||||||
|"""
|
|"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"a custom status code and no headers and different dates" in new TestSetup() {
|
||||||
|
val initial = DateTime(2011, 8, 25, 9, 10, 0).clicks
|
||||||
|
var extraMillis = 0L
|
||||||
|
(0 until 10000 by 500) foreach { millis ⇒
|
||||||
|
extraMillis = millis
|
||||||
|
HttpResponse(200) should renderTo {
|
||||||
|
s"""HTTP/1.1 200 OK
|
||||||
|
|Server: akka-http/1.0.0
|
||||||
|
|Date: Thu, 25 Aug 2011 09:10:0${extraMillis / 1000 % 60} GMT
|
||||||
|
|Content-Length: 0
|
||||||
|
|
|
||||||
|
|"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override def currentTimeMillis() = initial + extraMillis
|
||||||
|
}
|
||||||
|
|
||||||
"to a transparent HEAD request (Strict response entity)" in new TestSetup() {
|
"to a transparent HEAD request (Strict response entity)" in new TestSetup() {
|
||||||
ResponseRenderingContext(
|
ResponseRenderingContext(
|
||||||
|
|
@ -559,7 +576,7 @@ class ResponseRendererSpec extends FreeSpec with Matchers with BeforeAndAfterAll
|
||||||
Await.result(future, 250.millis) -> renderer.isComplete
|
Await.result(future, 250.millis) -> renderer.isComplete
|
||||||
}
|
}
|
||||||
|
|
||||||
override def dateTime(now: Long) = DateTime(2011, 8, 25, 9, 10, 29) // provide a stable date for testing
|
override def currentTimeMillis() = DateTime(2011, 8, 25, 9, 10, 29).clicks // provide a stable date for testing
|
||||||
}
|
}
|
||||||
|
|
||||||
def source[T](elems: T*) = Source(elems.toList)
|
def source[T](elems: T*) = Source(elems.toList)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue