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] = {
|
||||
var (cachedSeconds, cachedBytes) = cachedDateHeader
|
||||
val now = System.currentTimeMillis
|
||||
if (now - 1000 > cachedSeconds) {
|
||||
val now = currentTimeMillis()
|
||||
if (now / 1000 > cachedSeconds) {
|
||||
cachedSeconds = now / 1000
|
||||
val r = new ByteArrayRendering(48)
|
||||
dateTime(now).renderRfc1123DateTimeString(r ~~ headers.Date) ~~ CrLf
|
||||
DateTime(now).renderRfc1123DateTimeString(r ~~ headers.Date) ~~ CrLf
|
||||
cachedBytes = r.get
|
||||
cachedDateHeader = cachedSeconds -> 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
ResponseRenderingContext(
|
||||
|
|
@ -559,7 +576,7 @@ class ResponseRendererSpec extends FreeSpec with Matchers with BeforeAndAfterAll
|
|||
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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue