Hi Paul,

> On 11 Sep 2018, at 06:02, PAUL DEBRUICKER <pdebr...@gmail.com> wrote:
> 
> Hi Sven - 
> 
> This is in Pharo 6.1.
> 
> There is an API I'm using which sometimes returns a string only containing a 
> single instance of the number 0 in the "Expires" field, so the 
> #expiresTimeStamp method sends that to #parseHttpDate: and since it can't be 
> parsed into a date an error is thrown.  Seems like Zinc should be able to 
> handle that based on the spec here: 
> https://tools.ietf.org/html/rfc7234#section-5.3
> 
> 
> Would you rather I changed the implementation of parseHttpDate: to add an 
> empty check on the parsed tokens e.g.

IIRC some months ago, there were some changes to this area, but I forgot the 
details and the before state.

Anyway, reading RFC7234's section that you reference, maybe we do need to make 
another change, but I am not sure.

Let's start by explaining what there is today and why it is like that: 
#parseHttpDate: and #expiresTimestamp do indeed throw exceptions (by design), 
while #isExpired is the more high level access method.

Consider:

(ZnCookie name: 'foo' value: '100') isExpired. 

 => false

ZnUtils parseHttpDate: '0'.

 => Boom

(ZnCookie name: 'foo' value: '100') expires: '0'; expiresTimeStamp.

 => Boom

(ZnCookie name: 'foo' value: '100') expires: '0'; isExpired.

 => false

Could you use #isExpired and does it do what you want/expect ?

Reading the spec again, I am not 100% sure about the error case (existing but 
zero or wrong Expires header), maybe that should be true instead of false.

isExpired
        | expirationTimeStamp |
        (self hasAttribute: 'expire') ifFalse: [ ^ false ].
        [ expirationTimeStamp := self expiresTimeStamp ] on: Error do: [ ^ 
false ].
        "note that max-age (#maxage) is not used"
        ^ expirationTimeStamp asUTC < DateAndTime now asUTC

What do you think ?
Anyone else with an opinion ?

Sven

> parseHttpDate: string
>       "self parseHttpDate: 'Tue, 13 Sep 2011 08:04:49 GMT'."
>       "self parseHttpDate: 'Tue, 13-Sep-2011 08:04:51 GMT'."
>       "self parseHttpDate: 'Tue Jan 01 00:00:01 2036 GMT'."
>       
>       | tokens day month year hour minute second months map yearToken |
>       string size = 1 ifTrue:[ ^DateAndTime epoch ].
>       tokens := (string findTokens: #( $ $- $: $, )) allButFirst.
>       
>       ...
> 
> 
> Or add a string size guard check in #expiresTimeStamp ? e.g.
> 
> expiresTimeStamp
>       self expires
>               ifNil: [ ^ DateAndTime now + 1 day ]
>               ifNotNil: [ :exp | 
>                       exp size = 1
>                               ifTrue: [ ^ DateAndTime epoch ].
>                       ^ ZnUtils parseHttpDate: exp ]
> 
> 
> Thanks
> 
> Paul


Reply via email to