2014-05-08 2 views
0

Je suis en train d'analyser l'en-tête HTTP Date: Tue, 15 Nov 1994 08:12:31 GMT pour un HttpServletRequest avec un appel à request.getDateHeader("Date") mais obtenir l'exception suivante:Exception lors de l'analyse date de RFC1123 avec HttpServletRequest # getDateHeader()

java.lang.NumberFormatException: Tue, 15 Nov 1994 08:12:31 GMT 
    at org.mortbay.io.BufferUtil.toLong(BufferUtil.java:106) 
    at org.mortbay.jetty.HttpFields$Field.getLongValue(HttpFields.java:1479) 
    at org.mortbay.jetty.HttpFields.getLongField(HttpFields.java:720) 
    at org.mortbay.jetty.Request.getIntHeader(Request.java:728) 
    at javax.servlet.http.HttpServletRequestWrapper.getIntHeader(HttpServletRequestWrapper.java:106) 
    at javax.servlet.http.HttpServletRequestWrapper.getIntHeader(HttpServletRequestWrapper.java:106) 
    at com.google.appengine.tools.development.ResponseRewriterFilter$RequestWrapper.getDateHeader(ResponseRewriterFilter.java:417) 
    at com.example.ExampleServlet.doPost(ExampleServlet.java:93) 

Qu'est-ce que je fais mal? La date de l'échantillon provient directement du HTTP specification, donc je m'attendrais à ce qu'il soit valide selon RFC 1123. Le servlet fait partie d'une application App Engine (sur le serveur de développement).

+0

Avez-vous coupé cette trace de pile? Il ne contient aucune référence à 'getDateHeader' ou tout code que vous avez pu écrire. Pourriez-vous modifier votre question pour inclure le code que vous avez écrit et une trace de pile plus complète? – Kenster

+0

@Kenster J'ai ajouté quelques lignes de plus à la trace de la pile (et j'ai rendu le nom de ma classe actuelle 'ExampleServlet'). Comme vous pouvez le voir, la servlet est hébergée sur Google App Engine. Je peux également poster la trace complète si nécessaire. L'appel réel dans 'doPost()' ressemble à ceci: 'Date date = new Date (request.getDateHeader (" Date "))'. – Drux

Répondre

1

This is a known bug dans la bibliothèque du moteur de l'application. Here is the getDateHeader function à la question, et il appelle clairement super.getIntHeader(). Il ne semble pas que Google soit pressé de le réparer, malheureusement.

+1

+1 Ma solution actuelle consiste à appeler 'date date = rfc1123DateFormat.parse (request.getHeader (" Date "))' sur un 'DateFormat' qui a été initialisé avec' rfc1123DateFormat = new SimpleDateFormat ("EEE, jj MMM aaaa HH : mm: ss z ", Locale.US); rfc1123DateFormat.setTimeZone (TimeZone.getTimeZone ("GMT")); '. – Drux

Questions connexes