The server compares the validator with the current resource row.

highlighted = computed this step

The server has a current resource row

The row pins the same path, the current tag, and the full body length.

resource row checked\text{resource row checked}
Cached resource rowThe request, resource, decision, and response rows are recomputed from pinned bytes.Cached resource row - /logo.png validator "v7" -> 304 Not Modified, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linepath/logo.pngparsedrequest lineversionHTTP/1.1parsedheaderHoststatic.exampleexactheaderIf-None-Match"v7"validatorresourcepath/logo.pngpinnedresourcecurrent ETag"v7"pinnedresourcebody bytes1280would send if changeddecisionvalidator"v7"from requestdecisioncurrent ETag"v7"from resourcedecisionmatchyessame tagdecisionresponse304 Not Modifiedskip bodydecisionsent body bytes0not sentstatusversionHTTP/1.1parsedstatusstatus304 Not Modifiednot modifiedheaderETag"v7"current tagheaderCache-Controlmax-age=60pinnedbodysent body bytes0skipped

The body would be large enough to skip

If the resource changed, the body length would be 1280 bytes in this toy example.

body bytes=1280\text{body bytes}=1280
Cached resource rowThe request, resource, decision, and response rows are recomputed from pinned bytes.Cached resource row - /logo.png validator "v7" -> 304 Not Modified, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linepath/logo.pngparsedrequest lineversionHTTP/1.1parsedheaderHoststatic.exampleexactheaderIf-None-Match"v7"validatorresourcepath/logo.pngpinnedresourcecurrent ETag"v7"pinnedresourcebody bytes1280would send if changeddecisionvalidator"v7"from requestdecisioncurrent ETag"v7"from resourcedecisionmatchyessame tagdecisionresponse304 Not Modifiedskip bodydecisionsent body bytes0not sentstatusversionHTTP/1.1parsedstatusstatus304 Not Modifiednot modifiedheaderETag"v7"current tagheaderCache-Controlmax-age=60pinnedbodysent body bytes0skipped

The current tag is compared later

The next chapter compares the client's validator with the current resource tag.

compare tags next\text{compare tags next}
Cached resource rowThe request, resource, decision, and response rows are recomputed from pinned bytes.Cached resource row - /logo.png validator "v7" -> 304 Not Modified, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linepath/logo.pngparsedrequest lineversionHTTP/1.1parsedheaderHoststatic.exampleexactheaderIf-None-Match"v7"validatorresourcepath/logo.pngpinnedresourcecurrent ETag"v7"pinnedresourcebody bytes1280would send if changeddecisionvalidator"v7"from requestdecisioncurrent ETag"v7"from resourcedecisionmatchyessame tagdecisionresponse304 Not Modifiedskip bodydecisionsent body bytes0not sentstatusversionHTTP/1.1parsedstatusstatus304 Not Modifiednot modifiedheaderETag"v7"current tagheaderCache-Controlmax-age=60pinnedbodysent body bytes0skipped

Summary

A validator only helps because the server has a current tag to compare with it.

cached copy ready\text{cached copy ready}
Cached resource rowThe request, resource, decision, and response rows are recomputed from pinned bytes.Cached resource row - /logo.png validator "v7" -> 304 Not Modified, body 0 bytessectionnamevaluecheckrequest linemethodGETparsedrequest linepath/logo.pngparsedrequest lineversionHTTP/1.1parsedheaderHoststatic.exampleexactheaderIf-None-Match"v7"validatorresourcepath/logo.pngpinnedresourcecurrent ETag"v7"pinnedresourcebody bytes1280would send if changeddecisionvalidator"v7"from requestdecisioncurrent ETag"v7"from resourcedecisionmatchyessame tagdecisionresponse304 Not Modifiedskip bodydecisionsent body bytes0not sentstatusversionHTTP/1.1parsedstatusstatus304 Not Modifiednot modifiedheaderETag"v7"current tagheaderCache-Controlmax-age=60pinnedbodysent body bytes0skipped