Bug 224933 - [LayoutTests] http/tests/misc/last-modified-parsing.html handles non-standard dates differently in PHP than Python
Summary: [LayoutTests] http/tests/misc/last-modified-parsing.html handles non-standard...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Tools / Tests (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Chris Gambrell
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2021-04-22 08:34 PDT by Chris Gambrell
Modified: 2021-05-12 16:24 PDT (History)
7 users (show)

See Also:


Attachments
Patch (4.40 KB, patch)
2021-04-22 12:30 PDT, Chris Gambrell
no flags Details | Formatted Diff | Diff
Patch (11.55 KB, patch)
2021-05-11 11:13 PDT, Chris Gambrell
no flags Details | Formatted Diff | Diff
Patch (9.86 KB, patch)
2021-05-12 13:42 PDT, Chris Gambrell
no flags Details | Formatted Diff | Diff
Patch for landing (9.95 KB, patch)
2021-05-12 15:57 PDT, Chris Gambrell
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Chris Gambrell 2021-04-22 08:34:14 PDT
In PHP, the Last-Modified header will send with any format of date, even if the date-string is blank it will send a blank Last-Modified header.

When Python encounters a non-standard/blank date-string, it will not send the Last-Modified header. 

This test tests expectations with standard and non-standard dates. We need to change the test to match the expectations from Python with how it handles non-standard dates in the header.
Comment 1 Radar WebKit Bug Importer 2021-04-22 08:35:20 PDT
<rdar://problem/77020039>
Comment 2 Chris Gambrell 2021-04-22 12:30:20 PDT
Created attachment 426837 [details]
Patch
Comment 3 Chris Gambrell 2021-04-22 12:32:53 PDT
Comment on attachment 426837 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=426837&action=review

> LayoutTests/http/tests/misc/last-modified-parsing-expected.txt:11
>  Fri, 21 Nov 2008 01:03:33 GMT

Removed untested dates

> LayoutTests/http/tests/misc/last-modified-parsing.html:12
>  test('Tuesday, 21 Nov 2008 01:03:33 GMT');

Removed non-standard dates
Comment 4 Darin Adler 2021-04-25 13:31:43 PDT
We want to test how WebKit software (the whole stack, including CFNetwork) handles these date formats. I understand that the Python library we are using makes it difficult to test this, but that doesn’t remove the need to do the testing. How will we do this testing, now?
Comment 5 Jonathan Bedard 2021-04-26 07:06:41 PDT
(In reply to Darin Adler from comment #4)
> We want to test how WebKit software (the whole stack, including CFNetwork)
> handles these date formats. I understand that the Python library we are
> using makes it difficult to test this, but that doesn’t remove the need to
> do the testing. How will we do this testing, now?

This actually isn't a limitation of Python. It's a limitation of Apache, which refuses to serve what it considers invalid date formats coming from CGI scripts. Short of building our own webserver, I'm not sure what can be done. Apache could end up taking away this ability from PHP in a future update as well. As reflected in Chris's EWS run, Apache  on Windows looks like it has a more strict set of rules than on other platforms.
Comment 6 Darin Adler 2021-04-26 13:09:26 PDT
(In reply to Jonathan Bedard from comment #5)
> (In reply to Darin Adler from comment #4)
> > We want to test how WebKit software (the whole stack, including CFNetwork)
> > handles these date formats. I understand that the Python library we are
> > using makes it difficult to test this, but that doesn’t remove the need to
> > do the testing. How will we do this testing, now?
> 
> This actually isn't a limitation of Python. It's a limitation of Apache,
> which refuses to serve what it considers invalid date formats coming from
> CGI scripts. Short of building our own webserver, I'm not sure what can be
> done. Apache could end up taking away this ability from PHP in a future
> update as well. As reflected in Chris's EWS run, Apache  on Windows looks
> like it has a more strict set of rules than on other platforms.

OK. So we can’t use Apache for this.

How can we test this aspect of WebKit networking behavior?
Comment 7 Jonathan Bedard 2021-04-26 13:25:05 PDT
(In reply to Darin Adler from comment #6)
> (In reply to Jonathan Bedard from comment #5)
> > (In reply to Darin Adler from comment #4)
> > > We want to test how WebKit software (the whole stack, including CFNetwork)
> > > handles these date formats. I understand that the Python library we are
> > > using makes it difficult to test this, but that doesn’t remove the need to
> > > do the testing. How will we do this testing, now?
> > 
> > This actually isn't a limitation of Python. It's a limitation of Apache,
> > which refuses to serve what it considers invalid date formats coming from
> > CGI scripts. Short of building our own webserver, I'm not sure what can be
> > done. Apache could end up taking away this ability from PHP in a future
> > update as well. As reflected in Chris's EWS run, Apache  on Windows looks
> > like it has a more strict set of rules than on other platforms.
> 
> OK. So we can’t use Apache for this.
> 
> How can we test this aspect of WebKit networking behavior?

Alexey pointed out there is an Apache setting, `send-as-is`, which may let us work-around this.

If that fails, the next step would be looking at the wpt webserver and see if that lets us test what we're looking to.
Comment 8 Alexey Proskuryakov 2021-04-26 13:33:45 PDT
https://httpd.apache.org/docs/current/mod/mod_asis.html

This cannot perform any processing of course, it's just a fixed response.
Comment 9 Jonathan Bedard 2021-04-26 14:08:08 PDT
AsIs still changes these dates.
Comment 10 Sam Sneddon [:gsnedders] 2021-04-27 00:17:09 PDT
(In reply to Jonathan Bedard from comment #7)
> If that fails, the next step would be looking at the wpt webserver and see
> if that lets us test what we're looking to.

This definitely works with wptserve.

Note that the server has a bunch of built-in support for things like varying headers: https://web-platform-tests.org/writing-tests/server-pipes.html#headers, so we can just replace last-modified.php with an HTML file.

(Ideally we'd rewrite this to use testharness.js with moving it to http/wpt, but that's a larger change!)
Comment 11 Chris Gambrell 2021-05-11 11:13:00 PDT
Created attachment 428297 [details]
Patch
Comment 12 Jonathan Bedard 2021-05-11 12:09:33 PDT
Comment on attachment 428297 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=428297&action=review

> LayoutTests/http/wpt/misc/last-modified-parsing.js:6
> +}

Any reason we didn't put this inside http/wpt/misc/no-last-modified.html?

> LayoutTests/http/wpt/misc/no-last-modified.js:4
> +}, "Last-Modified sent with no date");

Any reason we didn't put this inside http/wpt/misc/no-last-modified.html?

> LayoutTests/platform/win/TestExpectations:-4410
> -webkit.org/b/209455 http/tests/misc/last-modified-parsing.html [ Failure ]

Pretty sure Windows will still struggle with this, although I suppose it's possible that is was actually Apache that was the problem, and not the engine, I guess EWS will let us know
Comment 13 Sam Sneddon [:gsnedders] 2021-05-12 05:41:24 PDT
Comment on attachment 428297 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=428297&action=review

> LayoutTests/http/wpt/misc/last-modified-parsing.js:1
> +function test(date) {

Let's not call this function test, as that redefines the test function defined in testharness.js; maybe test_last_modified or something?

> LayoutTests/http/wpt/misc/no-last-modified.js:3
> +    assert_greater_than((new Date(Date.parse(actual))).getTime(), (new Date()).getTime() - (24+1)*60*60*1000);

We probably want `assert_approx_equals` with an epsilon of maybe 1 minute?

>> LayoutTests/http/wpt/misc/no-last-modified.js:4
>> +}, "Last-Modified sent with no date");
> 
> Any reason we didn't put this inside http/wpt/misc/no-last-modified.html?

Additionally, is there any reason why we don't just put this into last-modified-parsing.html? It leads to us having last-modified-utilities.sub.js as a separate file, and it's not clear what the benefit here is? It's still about parsing a header value, just an empty one.

> LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:1
> +function observeResources(n) {

This function is dead code.

> LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:24
> +            iframe.addEventListener('error', reject);

We don't want the error event here (there's no error event ever fired on an iframe, far as I can tell)

> LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:26
> +        iframe.src = "/common/blank.html?pipe=header(Last-Modified," + header_value.replace(' ', '%20').replace(',', '\\,') + ")";

What's the reason for the header_value.replace(' ', '%20') (which the browser's URL parsing will do anyway), versus something broader like encodeURI/encodeURIComponent?

> LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:32
> +}

This file doesn't need .sub. in its name. (See also above about merging no-last-modified and last-modified-parsing, which would mean this file could then be merged into last-modified-parsing.)
Comment 14 Chris Gambrell 2021-05-12 13:42:01 PDT
Created attachment 428413 [details]
Patch
Comment 15 Chris Gambrell 2021-05-12 13:43:03 PDT
(In reply to Sam Sneddon [:gsnedders] from comment #13)
> Comment on attachment 428297 [details]
> Patch
> 
> View in context:
> https://bugs.webkit.org/attachment.cgi?id=428297&action=review
> 
> > LayoutTests/http/wpt/misc/last-modified-parsing.js:1
> > +function test(date) {
> 
> Let's not call this function test, as that redefines the test function
> defined in testharness.js; maybe test_last_modified or something?
> 
> > LayoutTests/http/wpt/misc/no-last-modified.js:3
> > +    assert_greater_than((new Date(Date.parse(actual))).getTime(), (new Date()).getTime() - (24+1)*60*60*1000);
> 
> We probably want `assert_approx_equals` with an epsilon of maybe 1 minute?
> 
> >> LayoutTests/http/wpt/misc/no-last-modified.js:4
> >> +}, "Last-Modified sent with no date");
> > 
> > Any reason we didn't put this inside http/wpt/misc/no-last-modified.html?
> 
> Additionally, is there any reason why we don't just put this into
> last-modified-parsing.html? It leads to us having
> last-modified-utilities.sub.js as a separate file, and it's not clear what
> the benefit here is? It's still about parsing a header value, just an empty
> one.
> 
> > LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:1
> > +function observeResources(n) {
> 
> This function is dead code.
> 
> > LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:24
> > +            iframe.addEventListener('error', reject);
> 
> We don't want the error event here (there's no error event ever fired on an
> iframe, far as I can tell)
> 
> > LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:26
> > +        iframe.src = "/common/blank.html?pipe=header(Last-Modified," + header_value.replace(' ', '%20').replace(',', '\\,') + ")";
> 
> What's the reason for the header_value.replace(' ', '%20') (which the
> browser's URL parsing will do anyway), versus something broader like
> encodeURI/encodeURIComponent?
> 
> > LayoutTests/http/wpt/misc/resources/last-modified-utilities.sub.js:32
> > +}
> 
> This file doesn't need .sub. in its name. (See also above about merging
> no-last-modified and last-modified-parsing, which would mean this file could
> then be merged into last-modified-parsing.)

These as well as comment 12's comments addressed and fixed in comment 14
Comment 16 Jonathan Bedard 2021-05-12 15:31:48 PDT
Comment on attachment 428413 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=428413&action=review

> LayoutTests/platform/win/TestExpectations:4410
> +webkit.org/b/209455 http/wpt/misc/last-modified-parsing.html [ Failure ]

Looks like the test failure on Windows EWS sees is this same bug
Comment 17 Chris Gambrell 2021-05-12 15:57:08 PDT
Created attachment 428424 [details]
Patch for landing
Comment 18 EWS 2021-05-12 16:24:29 PDT
Committed r277408 (237658@main): <https://commits.webkit.org/237658@main>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 428424 [details].