1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-28 05:50:30 +02:00

web: Be less strict when parsing entity tags.

* module/web/http.scm (parse-entity-tag): Be less strict, accepting
  unquoted strings as well.

* test-suite/tests/web-http.test ("response headers"): Add a test for
  etag parsing.
This commit is contained in:
Andy Wingo 2016-01-07 10:53:57 +01:00
parent 4137c224e2
commit 6d7c09c8a9
2 changed files with 11 additions and 5 deletions

View file

@ -1,6 +1,6 @@
;;; HTTP messages ;;; HTTP messages
;; Copyright (C) 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. ;; Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc.
;; This library is free software; you can redistribute it and/or ;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public ;; modify it under the terms of the GNU Lesser General Public
@ -848,10 +848,15 @@ as an ordered alist."
(display-digits (date-second date) 2 port) (display-digits (date-second date) 2 port)
(display " GMT" port))) (display " GMT" port)))
;; Following https://tools.ietf.org/html/rfc7232#section-2.3, an entity
;; tag should really be a qstring. However there are a number of
;; servers that emit etags as unquoted strings. Assume that if the
;; value doesn't start with a quote, it's an unquoted strong etag.
(define (parse-entity-tag val) (define (parse-entity-tag val)
(if (string-prefix? "W/" val) (cond
(cons (parse-qstring val 2) #f) ((string-prefix? "W/" val) (cons (parse-qstring val 2) #f))
(cons (parse-qstring val) #t))) ((string-prefix? "\"" val) (cons (parse-qstring val) #t))
(else (cons val #t))))
(define (entity-tag? val) (define (entity-tag? val)
(and (pair? val) (and (pair? val)

View file

@ -1,6 +1,6 @@
;;;; web-uri.test --- URI library -*- mode: scheme; coding: utf-8; -*- ;;;; web-uri.test --- URI library -*- mode: scheme; coding: utf-8; -*-
;;;; ;;;;
;;;; Copyright (C) 2010, 2011, 2014 Free Software Foundation, Inc. ;;;; Copyright (C) 2010, 2011, 2014, 2016 Free Software Foundation, Inc.
;;;; ;;;;
;;;; This library is free software; you can redistribute it and/or ;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public ;;;; modify it under the terms of the GNU Lesser General Public
@ -343,6 +343,7 @@
(pass-if-parse age "30" 30) (pass-if-parse age "30" 30)
(pass-if-parse etag "\"foo\"" '("foo" . #t)) (pass-if-parse etag "\"foo\"" '("foo" . #t))
(pass-if-parse etag "W/\"foo\"" '("foo" . #f)) (pass-if-parse etag "W/\"foo\"" '("foo" . #f))
(pass-if-parse etag "foo" '("foo" . #t))
(pass-if-parse location "http://other-place" (pass-if-parse location "http://other-place"
(build-uri 'http #:host "other-place")) (build-uri 'http #:host "other-place"))
(pass-if-parse location "#foo" (pass-if-parse location "#foo"