Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assets controller not handling IE If-Modified-Since #3569

Closed
dylex opened this issue Oct 28, 2014 · 9 comments
Closed

Assets controller not handling IE If-Modified-Since #3569

dylex opened this issue Oct 28, 2014 · 9 comments

Comments

@dylex
Copy link
Contributor

dylex commented Oct 28, 2014

2.3.6: IE (at least 9 through 11, and apparently old firefox, too) sends weird If-Modified-Since headers that can include an extra length value:

[debug] application - An invalidate date was received: Sat, 18 Oct 2014 20:41:26 GMT; length=1323
java.lang.IllegalArgumentException: Invalid format: "Sat, 18 Oct 2014 20:41:26; length=1323" is malformed at "; length=1323"
        at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:873) ~[joda-time.joda-time-2.3.jar:2.3]
        at controllers.AssetInfo$.parseDate(Assets.scala:106) ~[com.typesafe.play.play_2.11-2.3.6.jar:v1.0-56-gcb66af3]
        at controllers.AssetsBuilder$$anonfun$controllers$AssetsBuilder$$maybeNotModified$3.apply(Assets.scala:326) [com.typesafe.play.play_2.11-2.3.6.jar:v1.0-56-gcb66af3]
        at controllers.AssetsBuilder$$anonfun$controllers$AssetsBuilder$$maybeNotModified$3.apply(Assets.scala:325) [com.typesafe.play.play_2.11-2.3.6.jar:v1.0-56-gcb66af3]
        at scala.Option.flatMap(Option.scala:170) [org.scala-lang.scala-library-2.11.2.jar:na]

Not a huge issue, but it seems safe enough to ignore the extra stuff. (Also, "invalidate"?)

@richdougherty
Copy link
Member

It's annoying when browsers don't follow the spec, but I guess it's better to be lenient, especially with commonly-used browsers.

http://stackoverflow.com/questions/12626699/if-modified-since-http-header-passed-by-ie9-includes-length

@martinpallmann
Copy link
Contributor

Seems like @gmethvin fixed it already in master.

@gmethvin
Copy link
Member

gmethvin commented Nov 9, 2014

Oops. I was going to submit a separate PR for that and somehow it got included in #3478. That should work but I was meaning to add some tests as well. I'm happy to revert/change as necessary.

@jroper
Copy link
Member

jroper commented Nov 25, 2014

Goes to show how carefully I review things submitted by @gmethvin. I wonder what other changes you've piggy backed onto PRs that I've merged? 😃

@Cody-SDLGov
Copy link

I seem to be having a similar problem as the IE complaint, but I'm not sure the source exactly. However, it is very similar:

[debug] application - An invalidate date was received: Wed Jan 07 2015 22:54:20 GMT-0800 (Pacific Standard Time)
java.lang.IllegalArgumentException: Invalid format: "Wed Jan 07 2015 22:54:20-0800 (Paci..." is malformed at " Jan 07 2015 22:54:20-0800 (Paci..."
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:873) ~[joda-time-2.3.jar:2.3]
    at controllers.AssetInfo$.parseDate(Assets.scala:106) ~[play_2.11-2.3.5.jar:2.3.5]
    at controllers.AssetsBuilder$$anonfun$controllers$AssetsBuilder$$maybeNotModified$3.apply(Assets.scala:326) [play_2.11-2.3.5.jar:2.3.5]
    at controllers.AssetsBuilder$$anonfun$controllers$AssetsBuilder$$maybeNotModified$3.apply(Assets.scala:325) [play_2.11-2.3.5.jar:2.3.5]
    at scala.Option.flatMap(Option.scala:170) [scala-library-2.11.2.jar:na]

@Cody-SDLGov
Copy link

It appears this occurs when I am accessing endpoints themselves defined in my Play application:

Remote Address:127.0.0.1:9090
Request URL:http://localhost:9090/api/v1/token
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
mixedMode=false; 
Host:localhost:9090
If-Modified-Since:Wed Jan 07 2015 22:54:20 GMT-0800 (Pacific Standard Time)
Pragma:no-cache
Referer:http://localhost:9090/ui
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36

@Cody-SDLGov
Copy link

In case it's helpful, I upped versions of play and joda-time, which gave same exception but deeper stack:

2015-01-08 00:15:51,434 - [DEBUG] -  -- from application in play-akka.actor.default-dispatcher-9
An invalidate date was received: Thu Jan 08 2015 00:15:51 GMT-0800 (Pacific Standard Time)
java.lang.IllegalArgumentException: Invalid format: "Thu Jan 08 2015 00:15:51-0800 (Paci..." is malformed at " Jan 08 2015 00:15:51-0800 (Paci..."
        at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:899) ~[joda-time-2.6.jar:2.6]
        at controllers.AssetInfo$.parseDate(Assets.scala:106) ~[play_2.11-2.3.7.jar:2.3.7]
        at controllers.AssetsBuilder$$anonfun$controllers$AssetsBuilder$$maybeNotModified$3.apply(Assets.scala:326) [play_2.11-2.3.7.jar:2.3.7]
        at controllers.AssetsBuilder$$anonfun$controllers$AssetsBuilder$$maybeNotModified$3.apply(Assets.scala:325) [play_2.11-2.3.7.jar:2.3.7]
        at scala.Option.flatMap(Option.scala:170) [scala-library-2.11.2.jar:na]
        at controllers.AssetsBuilder.controllers$AssetsBuilder$$maybeNotModified(Assets.scala:325) [play_2.11-2.3.7.jar:2.3.7]
        at controllers.AssetsBuilder$$anonfun$at$1$$anonfun$19.apply(Assets.scala:415) [play_2.11-2.3.7.jar:2.3.7]
        at controllers.AssetsBuilder$$anonfun$at$1$$anonfun$19.apply(Assets.scala:409) [play_2.11-2.3.7.jar:2.3.7]
        at scala.util.Success$$anonfun$map$1.apply(Try.scala:236) [scala-library-2.11.2.jar:na]
        at scala.util.Try$.apply(Try.scala:191) [scala-library-2.11.2.jar:na]
        at scala.util.Success.map(Try.scala:236) [scala-library-2.11.2.jar:na]
        at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) [scala-library-2.11.2.jar:na]
        at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) [scala-library-2.11.2.jar:na]
        at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library-2.11.2.jar:na]
        at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46) [play-iteratees_2.11-2.3.7.jar:2.3.7]
        at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [scala-library-2.11.2.jar:na]
        at scala.concurrent.impl.Promise$DefaultPromise.scala$concurrent$impl$Promise$DefaultPromise$$dispatchOrAddCallback(Promise.scala:280) [scala-library-2.11.2.jar:na]
        at scala.concurrent.impl.Promise$DefaultPromise.onComplete(Promise.scala:270) [scala-library-2.11.2.jar:na]
        at scala.concurrent.Future$class.map(Future.scala:235) [scala-library-2.11.2.jar:na]
        at scala.concurrent.impl.Promise$DefaultPromise.map(Promise.scala:153) [scala-library-2.11.2.jar:na]
        at controllers.AssetsBuilder$$anonfun$at$1.apply(Assets.scala:409) [play_2.11-2.3.7.jar:2.3.7]
        at controllers.AssetsBuilder$$anonfun$at$1.apply(Assets.scala:401) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$.invokeBlock(Action.scala:556) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$.invokeBlock(Action.scala:555) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:518) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:130) [play_2.11-2.3.7.jar:2.3.7]
        at play.utils.Threads$.withContextClassLoader(Threads.scala:21) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:129) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:128) [play_2.11-2.3.7.jar:2.3.7]
        at scala.Option.map(Option.scala:145) [scala-library-2.11.2.jar:na]
        at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:128) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:121) [play_2.11-2.3.7.jar:2.3.7]
        at play.api.libs.iteratee.DoneIteratee$$anonfun$mapM$2.apply(Iteratee.scala:705) [play-iteratees_2.11-2.3.7.jar:2.3.7]
        at play.api.libs.iteratee.DoneIteratee$$anonfun$mapM$2.apply(Iteratee.scala:705) [play-iteratees_2.11-2.3.7.jar:2.3.7]
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [scala-library-2.11.2.jar:na]
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.2.jar:na]
        at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) [akka-actor_2.11-2.3.4.jar:na]
        at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) [akka-actor_2.11-2.3.4.jar:na]
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.2.jar:na]
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.2.jar:na]
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.2.jar:na]
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.2.jar:na]

@Cody-SDLGov
Copy link

And one more note, I'm using client Chrome, Version 39.0.2171.95 m.

richdougherty added a commit to richdougherty/playframework that referenced this issue Jan 8, 2015
Use a regex to recognize the date format and discard any extra
trailing information. Then use one of two date formats to do
the parsing. See playframework#3569.
@jroper
Copy link
Member

jroper commented Jan 12, 2015

Fixed in #3792.

@jroper jroper closed this as completed Jan 12, 2015
ClaraAllende pushed a commit to ClaraAllende/playframework that referenced this issue Aug 28, 2015
Use a regex to recognize the date format and discard any extra
trailing information. Then use one of two date formats to do
the parsing. See playframework#3569.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants