2015-11-19 6 views
5

Sorry, wenn dies der falsche Ort dafür ist.Spring Boot wirft Ausnahme auf ungültigen If-Modified-Since-Wert

Nach der HTTP-Spezifikation definiert als: http://tools.ietf.org/html/rfc7232#section-3.3

Ein Empfänger muss die If-Modified-Since-Header-Feld ignorieren, wenn der empfangene Feld-Wert keine gültige HTTP-date ist, oder wenn die Anfrage Methode ist weder GET noch HEAD.

Spring Boot tut dies nicht. Es wirft eine IllegalArgumentException auf, die nicht vom Code behandelt wird, der den Headerwert überprüft.

Hier ist der Conversion-Code in org.springframework.http.HttpHeaders.java

/** 
* Return the value of the {@code If-Modified-Since} header. 
* <p>The date is returned as the number of milliseconds since 
* January 1, 1970 GMT. Returns -1 when the date is unknown. 
*/ 
public long getIfModifiedSince() { 
    return getFirstDate(IF_MODIFIED_SINCE); 
} 

/** 
* Parse the first header value for the given header name as a date, 
* return -1 if there is no value, or raise {@link IllegalArgumentException} 
* if the value cannot be parsed as a date. 
*/ 
public long getFirstDate(String headerName) { 
    String headerValue = getFirst(headerName); 
    if (headerValue == null) { 
     return -1; 
    } 
    for (String dateFormat : DATE_FORMATS) { 
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat, Locale.US); 
     simpleDateFormat.setTimeZone(GMT); 
     try { 
      return simpleDateFormat.parse(headerValue).getTime(); 
     } 
     catch (ParseException ex) { 
      // ignore 
     } 
    } 
    throw new IllegalArgumentException("Cannot parse date value \"" + headerValue + 
      "\" for \"" + headerName + "\" header"); 
} 

Also, wenn Sie den Header senden If-Modified-Since: 0 Sie eine Ausnahme erhalten, anstatt die frisch von der Rückkehr GET-Antwort wie in der http-Spezifikation definiert.

Sieht dies jemand anders als ein Problem?

+0

Die eigentliche Frage ist, was macht ein Aufrufer dieser Methode. Die Methode selbst kann die Spezifikation nicht verletzen. – zeroflagL

+0

Während Sie richtig sind - warum würde jemand einen ungültigen If-Modified-Since-Header senden? Ich würde den Fehler lieber im Client beheben, ich befürchte, dass der Springframe dieses Problem nicht sofort beheben würde. – burna

+0

@zeroflagL - der Aufrufer behandelt es nicht. Ausnahme sprudelt den ganzen Weg nach oben. – micko

Antwort

3

Ich habe diese und vor kurzem created a ticket und submitted a PR zu beheben, es zu beheben In der Zwischenzeit können Sie umgehen das Problem mit einem Filter, um den Header, z.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper((HttpServletRequest) request) { 

     @Override 
     public Enumeration<String> getHeaderNames() { 
      List<String> hdrs = Collections.list(super.getHeaderNames()) 
        .stream() 
        .filter(h -> !h.equals(IF_MODIFIED_SINCE)) 
        .collect(Collectors.toList()); 

      return Collections.enumeration(hdrs); 
     } 
    }; 
    chain.doFilter(wrapper, response); 
} 
3

begegnet das gleiche Problem, Frühling mit - 4.2.5. aktualisiert auf 4.2.6 -> Problem gelöst.

Verwandte Themen