An OCaml webserver, but the allocating version (vs httpz which doesnt)
at main 1571 lines 57 kB view raw
1 2 3 4 5 6 7Internet Engineering Task Force (IETF) R. Fielding, Ed. 8Request for Comments: 7232 Adobe 9Obsoletes: 2616 J. Reschke, Ed. 10Category: Standards Track greenbytes 11ISSN: 2070-1721 June 2014 12 13 14 Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests 15 16Abstract 17 18 The Hypertext Transfer Protocol (HTTP) is a stateless application- 19 level protocol for distributed, collaborative, hypertext information 20 systems. This document defines HTTP/1.1 conditional requests, 21 including metadata header fields for indicating state changes, 22 request header fields for making preconditions on such state, and 23 rules for constructing the responses to a conditional request when 24 one or more preconditions evaluate to false. 25 26Status of This Memo 27 28 This is an Internet Standards Track document. 29 30 This document is a product of the Internet Engineering Task Force 31 (IETF). It represents the consensus of the IETF community. It has 32 received public review and has been approved for publication by the 33 Internet Engineering Steering Group (IESG). Further information on 34 Internet Standards is available in Section 2 of RFC 5741. 35 36 Information about the current status of this document, any errata, 37 and how to provide feedback on it may be obtained at 38 http://www.rfc-editor.org/info/rfc7232. 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58Fielding & Reschke Standards Track [Page 1] 59 60RFC 7232 HTTP/1.1 Conditional Requests June 2014 61 62 63Copyright Notice 64 65 Copyright (c) 2014 IETF Trust and the persons identified as the 66 document authors. All rights reserved. 67 68 This document is subject to BCP 78 and the IETF Trust's Legal 69 Provisions Relating to IETF Documents 70 (http://trustee.ietf.org/license-info) in effect on the date of 71 publication of this document. Please review these documents 72 carefully, as they describe your rights and restrictions with respect 73 to this document. Code Components extracted from this document must 74 include Simplified BSD License text as described in Section 4.e of 75 the Trust Legal Provisions and are provided without warranty as 76 described in the Simplified BSD License. 77 78 This document may contain material from IETF Documents or IETF 79 Contributions published or made publicly available before November 80 10, 2008. The person(s) controlling the copyright in some of this 81 material may not have granted the IETF Trust the right to allow 82 modifications of such material outside the IETF Standards Process. 83 Without obtaining an adequate license from the person(s) controlling 84 the copyright in such materials, this document may not be modified 85 outside the IETF Standards Process, and derivative works of it may 86 not be created outside the IETF Standards Process, except to format 87 it for publication as an RFC or to translate it into languages other 88 than English. 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114Fielding & Reschke Standards Track [Page 2] 115 116RFC 7232 HTTP/1.1 Conditional Requests June 2014 117 118 119Table of Contents 120 121 1. Introduction ....................................................4 122 1.1. Conformance and Error Handling .............................4 123 1.2. Syntax Notation ............................................4 124 2. Validators ......................................................5 125 2.1. Weak versus Strong .........................................5 126 2.2. Last-Modified ..............................................7 127 2.2.1. Generation ..........................................7 128 2.2.2. Comparison ..........................................8 129 2.3. ETag .......................................................9 130 2.3.1. Generation .........................................10 131 2.3.2. Comparison .........................................10 132 2.3.3. Example: Entity-Tags Varying on 133 Content-Negotiated Resources .......................11 134 2.4. When to Use Entity-Tags and Last-Modified Dates ...........12 135 3. Precondition Header Fields .....................................13 136 3.1. If-Match ..................................................13 137 3.2. If-None-Match .............................................14 138 3.3. If-Modified-Since .........................................16 139 3.4. If-Unmodified-Since .......................................17 140 3.5. If-Range ..................................................18 141 4. Status Code Definitions ........................................18 142 4.1. 304 Not Modified ..........................................18 143 4.2. 412 Precondition Failed ...................................19 144 5. Evaluation .....................................................19 145 6. Precedence .....................................................20 146 7. IANA Considerations ............................................22 147 7.1. Status Code Registration ..................................22 148 7.2. Header Field Registration .................................22 149 8. Security Considerations ........................................22 150 9. Acknowledgments ................................................23 151 10. References ....................................................24 152 10.1. Normative References .....................................24 153 10.2. Informative References ...................................24 154 Appendix A. Changes from RFC 2616 .................................25 155 Appendix B. Imported ABNF .........................................25 156 Appendix C. Collected ABNF ........................................26 157 Index .............................................................27 158 159 160 161 162 163 164 165 166 167 168 169 170Fielding & Reschke Standards Track [Page 3] 171 172RFC 7232 HTTP/1.1 Conditional Requests June 2014 173 174 1751. Introduction 176 177 Conditional requests are HTTP requests [RFC7231] that include one or 178 more header fields indicating a precondition to be tested before 179 applying the method semantics to the target resource. This document 180 defines the HTTP/1.1 conditional request mechanisms in terms of the 181 architecture, syntax notation, and conformance criteria defined in 182 [RFC7230]. 183 184 Conditional GET requests are the most efficient mechanism for HTTP 185 cache updates [RFC7234]. Conditionals can also be applied to 186 state-changing methods, such as PUT and DELETE, to prevent the "lost 187 update" problem: one client accidentally overwriting the work of 188 another client that has been acting in parallel. 189 190 Conditional request preconditions are based on the state of the 191 target resource as a whole (its current value set) or the state as 192 observed in a previously obtained representation (one value in that 193 set). A resource might have multiple current representations, each 194 with its own observable state. The conditional request mechanisms 195 assume that the mapping of requests to a "selected representation" 196 (Section 3 of [RFC7231]) will be consistent over time if the server 197 intends to take advantage of conditionals. Regardless, if the 198 mapping is inconsistent and the server is unable to select the 199 appropriate representation, then no harm will result when the 200 precondition evaluates to false. 201 202 The conditional request preconditions defined by this specification 203 (Section 3) are evaluated when applicable to the recipient 204 (Section 5) according to their order of precedence (Section 6). 205 2061.1. Conformance and Error Handling 207 208 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 209 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 210 document are to be interpreted as described in [RFC2119]. 211 212 Conformance criteria and considerations regarding error handling are 213 defined in Section 2.5 of [RFC7230]. 214 2151.2. Syntax Notation 216 217 This specification uses the Augmented Backus-Naur Form (ABNF) 218 notation of [RFC5234] with a list extension, defined in Section 7 of 219 [RFC7230], that allows for compact definition of comma-separated 220 lists using a '#' operator (similar to how the '*' operator indicates 221 222 223 224 225 226Fielding & Reschke Standards Track [Page 4] 227 228RFC 7232 HTTP/1.1 Conditional Requests June 2014 229 230 231 repetition). Appendix B describes rules imported from other 232 documents. Appendix C shows the collected grammar with all list 233 operators expanded to standard ABNF notation. 234 2352. Validators 236 237 This specification defines two forms of metadata that are commonly 238 used to observe resource state and test for preconditions: 239 modification dates (Section 2.2) and opaque entity tags 240 (Section 2.3). Additional metadata that reflects resource state has 241 been defined by various extensions of HTTP, such as Web Distributed 242 Authoring and Versioning (WebDAV, [RFC4918]), that are beyond the 243 scope of this specification. A resource metadata value is referred 244 to as a "validator" when it is used within a precondition. 245 2462.1. Weak versus Strong 247 248 Validators come in two flavors: strong or weak. Weak validators are 249 easy to generate but are far less useful for comparisons. Strong 250 validators are ideal for comparisons but can be very difficult (and 251 occasionally impossible) to generate efficiently. Rather than impose 252 that all forms of resource adhere to the same strength of validator, 253 HTTP exposes the type of validator in use and imposes restrictions on 254 when weak validators can be used as preconditions. 255 256 A "strong validator" is representation metadata that changes value 257 whenever a change occurs to the representation data that would be 258 observable in the payload body of a 200 (OK) response to GET. 259 260 A strong validator might change for reasons other than a change to 261 the representation data, such as when a semantically significant part 262 of the representation metadata is changed (e.g., Content-Type), but 263 it is in the best interests of the origin server to only change the 264 value when it is necessary to invalidate the stored responses held by 265 remote caches and authoring tools. 266 267 Cache entries might persist for arbitrarily long periods, regardless 268 of expiration times. Thus, a cache might attempt to validate an 269 entry using a validator that it obtained in the distant past. A 270 strong validator is unique across all versions of all representations 271 associated with a particular resource over time. However, there is 272 no implication of uniqueness across representations of different 273 resources (i.e., the same strong validator might be in use for 274 representations of multiple resources at the same time and does not 275 imply that those representations are equivalent). 276 277 278 279 280 281 282Fielding & Reschke Standards Track [Page 5] 283 284RFC 7232 HTTP/1.1 Conditional Requests June 2014 285 286 287 There are a variety of strong validators used in practice. The best 288 are based on strict revision control, wherein each change to a 289 representation always results in a unique node name and revision 290 identifier being assigned before the representation is made 291 accessible to GET. A collision-resistant hash function applied to 292 the representation data is also sufficient if the data is available 293 prior to the response header fields being sent and the digest does 294 not need to be recalculated every time a validation request is 295 received. However, if a resource has distinct representations that 296 differ only in their metadata, such as might occur with content 297 negotiation over media types that happen to share the same data 298 format, then the origin server needs to incorporate additional 299 information in the validator to distinguish those representations. 300 301 In contrast, a "weak validator" is representation metadata that might 302 not change for every change to the representation data. This 303 weakness might be due to limitations in how the value is calculated, 304 such as clock resolution, an inability to ensure uniqueness for all 305 possible representations of the resource, or a desire of the resource 306 owner to group representations by some self-determined set of 307 equivalency rather than unique sequences of data. An origin server 308 SHOULD change a weak entity-tag whenever it considers prior 309 representations to be unacceptable as a substitute for the current 310 representation. In other words, a weak entity-tag ought to change 311 whenever the origin server wants caches to invalidate old responses. 312 313 For example, the representation of a weather report that changes in 314 content every second, based on dynamic measurements, might be grouped 315 into sets of equivalent representations (from the origin server's 316 perspective) with the same weak validator in order to allow cached 317 representations to be valid for a reasonable period of time (perhaps 318 adjusted dynamically based on server load or weather quality). 319 Likewise, a representation's modification time, if defined with only 320 one-second resolution, might be a weak validator if it is possible 321 for the representation to be modified twice during a single second 322 and retrieved between those modifications. 323 324 Likewise, a validator is weak if it is shared by two or more 325 representations of a given resource at the same time, unless those 326 representations have identical representation data. For example, if 327 the origin server sends the same validator for a representation with 328 a gzip content coding applied as it does for a representation with no 329 content coding, then that validator is weak. However, two 330 simultaneous representations might share the same strong validator if 331 they differ only in the representation metadata, such as when two 332 different media types are available for the same representation data. 333 334 335 336 337 338Fielding & Reschke Standards Track [Page 6] 339 340RFC 7232 HTTP/1.1 Conditional Requests June 2014 341 342 343 Strong validators are usable for all conditional requests, including 344 cache validation, partial content ranges, and "lost update" 345 avoidance. Weak validators are only usable when the client does not 346 require exact equality with previously obtained representation data, 347 such as when validating a cache entry or limiting a web traversal to 348 recent changes. 349 3502.2. Last-Modified 351 352 The "Last-Modified" header field in a response provides a timestamp 353 indicating the date and time at which the origin server believes the 354 selected representation was last modified, as determined at the 355 conclusion of handling the request. 356 357 Last-Modified = HTTP-date 358 359 An example of its use is 360 361 Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT 362 3632.2.1. Generation 364 365 An origin server SHOULD send Last-Modified for any selected 366 representation for which a last modification date can be reasonably 367 and consistently determined, since its use in conditional requests 368 and evaluating cache freshness ([RFC7234]) results in a substantial 369 reduction of HTTP traffic on the Internet and can be a significant 370 factor in improving service scalability and reliability. 371 372 A representation is typically the sum of many parts behind the 373 resource interface. The last-modified time would usually be the most 374 recent time that any of those parts were changed. How that value is 375 determined for any given resource is an implementation detail beyond 376 the scope of this specification. What matters to HTTP is how 377 recipients of the Last-Modified header field can use its value to 378 make conditional requests and test the validity of locally cached 379 responses. 380 381 An origin server SHOULD obtain the Last-Modified value of the 382 representation as close as possible to the time that it generates the 383 Date field value for its response. This allows a recipient to make 384 an accurate assessment of the representation's modification time, 385 especially if the representation changes near the time that the 386 response is generated. 387 388 An origin server with a clock MUST NOT send a Last-Modified date that 389 is later than the server's time of message origination (Date). If 390 the last modification time is derived from implementation-specific 391 392 393 394Fielding & Reschke Standards Track [Page 7] 395 396RFC 7232 HTTP/1.1 Conditional Requests June 2014 397 398 399 metadata that evaluates to some time in the future, according to the 400 origin server's clock, then the origin server MUST replace that value 401 with the message origination date. This prevents a future 402 modification date from having an adverse impact on cache validation. 403 404 An origin server without a clock MUST NOT assign Last-Modified values 405 to a response unless these values were associated with the resource 406 by some other system or user with a reliable clock. 407 4082.2.2. Comparison 409 410 A Last-Modified time, when used as a validator in a request, is 411 implicitly weak unless it is possible to deduce that it is strong, 412 using the following rules: 413 414 o The validator is being compared by an origin server to the actual 415 current validator for the representation and, 416 417 o That origin server reliably knows that the associated 418 representation did not change twice during the second covered by 419 the presented validator. 420 421 or 422 423 o The validator is about to be used by a client in an 424 If-Modified-Since, If-Unmodified-Since, or If-Range header field, 425 because the client has a cache entry for the associated 426 representation, and 427 428 o That cache entry includes a Date value, which gives the time when 429 the origin server sent the original response, and 430 431 o The presented Last-Modified time is at least 60 seconds before the 432 Date value. 433 434 or 435 436 o The validator is being compared by an intermediate cache to the 437 validator stored in its cache entry for the representation, and 438 439 o That cache entry includes a Date value, which gives the time when 440 the origin server sent the original response, and 441 442 o The presented Last-Modified time is at least 60 seconds before the 443 Date value. 444 445 446 447 448 449 450Fielding & Reschke Standards Track [Page 8] 451 452RFC 7232 HTTP/1.1 Conditional Requests June 2014 453 454 455 This method relies on the fact that if two different responses were 456 sent by the origin server during the same second, but both had the 457 same Last-Modified time, then at least one of those responses would 458 have a Date value equal to its Last-Modified time. The arbitrary 459 60-second limit guards against the possibility that the Date and 460 Last-Modified values are generated from different clocks or at 461 somewhat different times during the preparation of the response. An 462 implementation MAY use a value larger than 60 seconds, if it is 463 believed that 60 seconds is too short. 464 4652.3. ETag 466 467 The "ETag" header field in a response provides the current entity-tag 468 for the selected representation, as determined at the conclusion of 469 handling the request. An entity-tag is an opaque validator for 470 differentiating between multiple representations of the same 471 resource, regardless of whether those multiple representations are 472 due to resource state changes over time, content negotiation 473 resulting in multiple representations being valid at the same time, 474 or both. An entity-tag consists of an opaque quoted string, possibly 475 prefixed by a weakness indicator. 476 477 ETag = entity-tag 478 479 entity-tag = [ weak ] opaque-tag 480 weak = %x57.2F ; "W/", case-sensitive 481 opaque-tag = DQUOTE *etagc DQUOTE 482 etagc = %x21 / %x23-7E / obs-text 483 ; VCHAR except double quotes, plus obs-text 484 485 Note: Previously, opaque-tag was defined to be a quoted-string 486 ([RFC2616], Section 3.11); thus, some recipients might perform 487 backslash unescaping. Servers therefore ought to avoid backslash 488 characters in entity tags. 489 490 An entity-tag can be more reliable for validation than a modification 491 date in situations where it is inconvenient to store modification 492 dates, where the one-second resolution of HTTP date values is not 493 sufficient, or where modification dates are not consistently 494 maintained. 495 496 Examples: 497 498 ETag: "xyzzy" 499 ETag: W/"xyzzy" 500 ETag: "" 501 502 503 504 505 506Fielding & Reschke Standards Track [Page 9] 507 508RFC 7232 HTTP/1.1 Conditional Requests June 2014 509 510 511 An entity-tag can be either a weak or strong validator, with strong 512 being the default. If an origin server provides an entity-tag for a 513 representation and the generation of that entity-tag does not satisfy 514 all of the characteristics of a strong validator (Section 2.1), then 515 the origin server MUST mark the entity-tag as weak by prefixing its 516 opaque value with "W/" (case-sensitive). 517 5182.3.1. Generation 519 520 The principle behind entity-tags is that only the service author 521 knows the implementation of a resource well enough to select the most 522 accurate and efficient validation mechanism for that resource, and 523 that any such mechanism can be mapped to a simple sequence of octets 524 for easy comparison. Since the value is opaque, there is no need for 525 the client to be aware of how each entity-tag is constructed. 526 527 For example, a resource that has implementation-specific versioning 528 applied to all changes might use an internal revision number, perhaps 529 combined with a variance identifier for content negotiation, to 530 accurately differentiate between representations. Other 531 implementations might use a collision-resistant hash of 532 representation content, a combination of various file attributes, or 533 a modification timestamp that has sub-second resolution. 534 535 An origin server SHOULD send an ETag for any selected representation 536 for which detection of changes can be reasonably and consistently 537 determined, since the entity-tag's use in conditional requests and 538 evaluating cache freshness ([RFC7234]) can result in a substantial 539 reduction of HTTP network traffic and can be a significant factor in 540 improving service scalability and reliability. 541 5422.3.2. Comparison 543 544 There are two entity-tag comparison functions, depending on whether 545 or not the comparison context allows the use of weak validators: 546 547 o Strong comparison: two entity-tags are equivalent if both are not 548 weak and their opaque-tags match character-by-character. 549 550 o Weak comparison: two entity-tags are equivalent if their 551 opaque-tags match character-by-character, regardless of either or 552 both being tagged as "weak". 553 554 555 556 557 558 559 560 561 562Fielding & Reschke Standards Track [Page 10] 563 564RFC 7232 HTTP/1.1 Conditional Requests June 2014 565 566 567 The example below shows the results for a set of entity-tag pairs and 568 both the weak and strong comparison function results: 569 570 +--------+--------+-------------------+-----------------+ 571 | ETag 1 | ETag 2 | Strong Comparison | Weak Comparison | 572 +--------+--------+-------------------+-----------------+ 573 | W/"1" | W/"1" | no match | match | 574 | W/"1" | W/"2" | no match | no match | 575 | W/"1" | "1" | no match | match | 576 | "1" | "1" | match | match | 577 +--------+--------+-------------------+-----------------+ 578 5792.3.3. Example: Entity-Tags Varying on Content-Negotiated Resources 580 581 Consider a resource that is subject to content negotiation (Section 582 3.4 of [RFC7231]), and where the representations sent in response to 583 a GET request vary based on the Accept-Encoding request header field 584 (Section 5.3.4 of [RFC7231]): 585 586 >> Request: 587 588 GET /index HTTP/1.1 589 Host: www.example.com 590 Accept-Encoding: gzip 591 592 593 In this case, the response might or might not use the gzip content 594 coding. If it does not, the response might look like: 595 596 >> Response: 597 598 HTTP/1.1 200 OK 599 Date: Fri, 26 Mar 2010 00:05:00 GMT 600 ETag: "123-a" 601 Content-Length: 70 602 Vary: Accept-Encoding 603 Content-Type: text/plain 604 605 Hello World! 606 Hello World! 607 Hello World! 608 Hello World! 609 Hello World! 610 611 612 613 614 615 616 617 618Fielding & Reschke Standards Track [Page 11] 619 620RFC 7232 HTTP/1.1 Conditional Requests June 2014 621 622 623 An alternative representation that does use gzip content coding would 624 be: 625 626 >> Response: 627 628 HTTP/1.1 200 OK 629 Date: Fri, 26 Mar 2010 00:05:00 GMT 630 ETag: "123-b" 631 Content-Length: 43 632 Vary: Accept-Encoding 633 Content-Type: text/plain 634 Content-Encoding: gzip 635 636 ...binary data... 637 638 Note: Content codings are a property of the representation data, 639 so a strong entity-tag for a content-encoded representation has to 640 be distinct from the entity tag of an unencoded representation to 641 prevent potential conflicts during cache updates and range 642 requests. In contrast, transfer codings (Section 4 of [RFC7230]) 643 apply only during message transfer and do not result in distinct 644 entity-tags. 645 6462.4. When to Use Entity-Tags and Last-Modified Dates 647 648 In 200 (OK) responses to GET or HEAD, an origin server: 649 650 o SHOULD send an entity-tag validator unless it is not feasible to 651 generate one. 652 653 o MAY send a weak entity-tag instead of a strong entity-tag, if 654 performance considerations support the use of weak entity-tags, or 655 if it is unfeasible to send a strong entity-tag. 656 657 o SHOULD send a Last-Modified value if it is feasible to send one. 658 659 In other words, the preferred behavior for an origin server is to 660 send both a strong entity-tag and a Last-Modified value in successful 661 responses to a retrieval request. 662 663 A client: 664 665 o MUST send that entity-tag in any cache validation request (using 666 If-Match or If-None-Match) if an entity-tag has been provided by 667 the origin server. 668 669 670 671 672 673 674Fielding & Reschke Standards Track [Page 12] 675 676RFC 7232 HTTP/1.1 Conditional Requests June 2014 677 678 679 o SHOULD send the Last-Modified value in non-subrange cache 680 validation requests (using If-Modified-Since) if only a 681 Last-Modified value has been provided by the origin server. 682 683 o MAY send the Last-Modified value in subrange cache validation 684 requests (using If-Unmodified-Since) if only a Last-Modified value 685 has been provided by an HTTP/1.0 origin server. The user agent 686 SHOULD provide a way to disable this, in case of difficulty. 687 688 o SHOULD send both validators in cache validation requests if both 689 an entity-tag and a Last-Modified value have been provided by the 690 origin server. This allows both HTTP/1.0 and HTTP/1.1 caches to 691 respond appropriately. 692 6933. Precondition Header Fields 694 695 This section defines the syntax and semantics of HTTP/1.1 header 696 fields for applying preconditions on requests. Section 5 defines 697 when the preconditions are applied. Section 6 defines the order of 698 evaluation when more than one precondition is present. 699 7003.1. If-Match 701 702 The "If-Match" header field makes the request method conditional on 703 the recipient origin server either having at least one current 704 representation of the target resource, when the field-value is "*", 705 or having a current representation of the target resource that has an 706 entity-tag matching a member of the list of entity-tags provided in 707 the field-value. 708 709 An origin server MUST use the strong comparison function when 710 comparing entity-tags for If-Match (Section 2.3.2), since the client 711 intends this precondition to prevent the method from being applied if 712 there have been any changes to the representation data. 713 714 If-Match = "*" / 1#entity-tag 715 716 Examples: 717 718 If-Match: "xyzzy" 719 If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" 720 If-Match: * 721 722 If-Match is most often used with state-changing methods (e.g., POST, 723 PUT, DELETE) to prevent accidental overwrites when multiple user 724 agents might be acting in parallel on the same resource (i.e., to 725 726 727 728 729 730Fielding & Reschke Standards Track [Page 13] 731 732RFC 7232 HTTP/1.1 Conditional Requests June 2014 733 734 735 prevent the "lost update" problem). It can also be used with safe 736 methods to abort a request if the selected representation does not 737 match one already stored (or partially stored) from a prior request. 738 739 An origin server that receives an If-Match header field MUST evaluate 740 the condition prior to performing the method (Section 5). If the 741 field-value is "*", the condition is false if the origin server does 742 not have a current representation for the target resource. If the 743 field-value is a list of entity-tags, the condition is false if none 744 of the listed tags match the entity-tag of the selected 745 representation. 746 747 An origin server MUST NOT perform the requested method if a received 748 If-Match condition evaluates to false; instead, the origin server 749 MUST respond with either a) the 412 (Precondition Failed) status code 750 or b) one of the 2xx (Successful) status codes if the origin server 751 has verified that a state change is being requested and the final 752 state is already reflected in the current state of the target 753 resource (i.e., the change requested by the user agent has already 754 succeeded, but the user agent might not be aware of it, perhaps 755 because the prior response was lost or a compatible change was made 756 by some other user agent). In the latter case, the origin server 757 MUST NOT send a validator header field in the response unless it can 758 verify that the request is a duplicate of an immediately prior change 759 made by the same user agent. 760 761 The If-Match header field can be ignored by caches and intermediaries 762 because it is not applicable to a stored response. 763 7643.2. If-None-Match 765 766 The "If-None-Match" header field makes the request method conditional 767 on a recipient cache or origin server either not having any current 768 representation of the target resource, when the field-value is "*", 769 or having a selected representation with an entity-tag that does not 770 match any of those listed in the field-value. 771 772 A recipient MUST use the weak comparison function when comparing 773 entity-tags for If-None-Match (Section 2.3.2), since weak entity-tags 774 can be used for cache validation even if there have been changes to 775 the representation data. 776 777 If-None-Match = "*" / 1#entity-tag 778 779 780 781 782 783 784 785 786Fielding & Reschke Standards Track [Page 14] 787 788RFC 7232 HTTP/1.1 Conditional Requests June 2014 789 790 791 Examples: 792 793 If-None-Match: "xyzzy" 794 If-None-Match: W/"xyzzy" 795 If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" 796 If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz" 797 If-None-Match: * 798 799 If-None-Match is primarily used in conditional GET requests to enable 800 efficient updates of cached information with a minimum amount of 801 transaction overhead. When a client desires to update one or more 802 stored responses that have entity-tags, the client SHOULD generate an 803 If-None-Match header field containing a list of those entity-tags 804 when making a GET request; this allows recipient servers to send a 805 304 (Not Modified) response to indicate when one of those stored 806 responses matches the selected representation. 807 808 If-None-Match can also be used with a value of "*" to prevent an 809 unsafe request method (e.g., PUT) from inadvertently modifying an 810 existing representation of the target resource when the client 811 believes that the resource does not have a current representation 812 (Section 4.2.1 of [RFC7231]). This is a variation on the "lost 813 update" problem that might arise if more than one client attempts to 814 create an initial representation for the target resource. 815 816 An origin server that receives an If-None-Match header field MUST 817 evaluate the condition prior to performing the method (Section 5). 818 If the field-value is "*", the condition is false if the origin 819 server has a current representation for the target resource. If the 820 field-value is a list of entity-tags, the condition is false if one 821 of the listed tags match the entity-tag of the selected 822 representation. 823 824 An origin server MUST NOT perform the requested method if the 825 condition evaluates to false; instead, the origin server MUST respond 826 with either a) the 304 (Not Modified) status code if the request 827 method is GET or HEAD or b) the 412 (Precondition Failed) status code 828 for all other request methods. 829 830 Requirements on cache handling of a received If-None-Match header 831 field are defined in Section 4.3.2 of [RFC7234]. 832 833 834 835 836 837 838 839 840 841 842Fielding & Reschke Standards Track [Page 15] 843 844RFC 7232 HTTP/1.1 Conditional Requests June 2014 845 846 8473.3. If-Modified-Since 848 849 The "If-Modified-Since" header field makes a GET or HEAD request 850 method conditional on the selected representation's modification date 851 being more recent than the date provided in the field-value. 852 Transfer of the selected representation's data is avoided if that 853 data has not changed. 854 855 If-Modified-Since = HTTP-date 856 857 An example of the field is: 858 859 If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT 860 861 A recipient MUST ignore If-Modified-Since if the request contains an 862 If-None-Match header field; the condition in If-None-Match is 863 considered to be a more accurate replacement for the condition in 864 If-Modified-Since, and the two are only combined for the sake of 865 interoperating with older intermediaries that might not implement 866 If-None-Match. 867 868 A recipient MUST ignore the If-Modified-Since header field if the 869 received field-value is not a valid HTTP-date, or if the request 870 method is neither GET nor HEAD. 871 872 A recipient MUST interpret an If-Modified-Since field-value's 873 timestamp in terms of the origin server's clock. 874 875 If-Modified-Since is typically used for two distinct purposes: 1) to 876 allow efficient updates of a cached representation that does not have 877 an entity-tag and 2) to limit the scope of a web traversal to 878 resources that have recently changed. 879 880 When used for cache updates, a cache will typically use the value of 881 the cached message's Last-Modified field to generate the field value 882 of If-Modified-Since. This behavior is most interoperable for cases 883 where clocks are poorly synchronized or when the server has chosen to 884 only honor exact timestamp matches (due to a problem with 885 Last-Modified dates that appear to go "back in time" when the origin 886 server's clock is corrected or a representation is restored from an 887 archived backup). However, caches occasionally generate the field 888 value based on other data, such as the Date header field of the 889 cached message or the local clock time that the message was received, 890 particularly when the cached message does not contain a Last-Modified 891 field. 892 893 894 895 896 897 898Fielding & Reschke Standards Track [Page 16] 899 900RFC 7232 HTTP/1.1 Conditional Requests June 2014 901 902 903 When used for limiting the scope of retrieval to a recent time 904 window, a user agent will generate an If-Modified-Since field value 905 based on either its own local clock or a Date header field received 906 from the server in a prior response. Origin servers that choose an 907 exact timestamp match based on the selected representation's 908 Last-Modified field will not be able to help the user agent limit its 909 data transfers to only those changed during the specified window. 910 911 An origin server that receives an If-Modified-Since header field 912 SHOULD evaluate the condition prior to performing the method 913 (Section 5). The origin server SHOULD NOT perform the requested 914 method if the selected representation's last modification date is 915 earlier than or equal to the date provided in the field-value; 916 instead, the origin server SHOULD generate a 304 (Not Modified) 917 response, including only those metadata that are useful for 918 identifying or updating a previously cached response. 919 920 Requirements on cache handling of a received If-Modified-Since header 921 field are defined in Section 4.3.2 of [RFC7234]. 922 9233.4. If-Unmodified-Since 924 925 The "If-Unmodified-Since" header field makes the request method 926 conditional on the selected representation's last modification date 927 being earlier than or equal to the date provided in the field-value. 928 This field accomplishes the same purpose as If-Match for cases where 929 the user agent does not have an entity-tag for the representation. 930 931 If-Unmodified-Since = HTTP-date 932 933 An example of the field is: 934 935 If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT 936 937 A recipient MUST ignore If-Unmodified-Since if the request contains 938 an If-Match header field; the condition in If-Match is considered to 939 be a more accurate replacement for the condition in 940 If-Unmodified-Since, and the two are only combined for the sake of 941 interoperating with older intermediaries that might not implement 942 If-Match. 943 944 A recipient MUST ignore the If-Unmodified-Since header field if the 945 received field-value is not a valid HTTP-date. 946 947 A recipient MUST interpret an If-Unmodified-Since field-value's 948 timestamp in terms of the origin server's clock. 949 950 951 952 953 954Fielding & Reschke Standards Track [Page 17] 955 956RFC 7232 HTTP/1.1 Conditional Requests June 2014 957 958 959 If-Unmodified-Since is most often used with state-changing methods 960 (e.g., POST, PUT, DELETE) to prevent accidental overwrites when 961 multiple user agents might be acting in parallel on a resource that 962 does not supply entity-tags with its representations (i.e., to 963 prevent the "lost update" problem). It can also be used with safe 964 methods to abort a request if the selected representation does not 965 match one already stored (or partially stored) from a prior request. 966 967 An origin server that receives an If-Unmodified-Since header field 968 MUST evaluate the condition prior to performing the method 969 (Section 5). The origin server MUST NOT perform the requested method 970 if the selected representation's last modification date is more 971 recent than the date provided in the field-value; instead the origin 972 server MUST respond with either a) the 412 (Precondition Failed) 973 status code or b) one of the 2xx (Successful) status codes if the 974 origin server has verified that a state change is being requested and 975 the final state is already reflected in the current state of the 976 target resource (i.e., the change requested by the user agent has 977 already succeeded, but the user agent might not be aware of that 978 because the prior response message was lost or a compatible change 979 was made by some other user agent). In the latter case, the origin 980 server MUST NOT send a validator header field in the response unless 981 it can verify that the request is a duplicate of an immediately prior 982 change made by the same user agent. 983 984 The If-Unmodified-Since header field can be ignored by caches and 985 intermediaries because it is not applicable to a stored response. 986 9873.5. If-Range 988 989 The "If-Range" header field provides a special conditional request 990 mechanism that is similar to the If-Match and If-Unmodified-Since 991 header fields but that instructs the recipient to ignore the Range 992 header field if the validator doesn't match, resulting in transfer of 993 the new selected representation instead of a 412 (Precondition 994 Failed) response. If-Range is defined in Section 3.2 of [RFC7233]. 995 9964. Status Code Definitions 997 9984.1. 304 Not Modified 999 1000 The 304 (Not Modified) status code indicates that a conditional GET 1001 or HEAD request has been received and would have resulted in a 200 1002 (OK) response if it were not for the fact that the condition 1003 evaluated to false. In other words, there is no need for the server 1004 to transfer a representation of the target resource because the 1005 request indicates that the client, which made the request 1006 1007 1008 1009 1010Fielding & Reschke Standards Track [Page 18] 1011 1012RFC 7232 HTTP/1.1 Conditional Requests June 2014 1013 1014 1015 conditional, already has a valid representation; the server is 1016 therefore redirecting the client to make use of that stored 1017 representation as if it were the payload of a 200 (OK) response. 1018 1019 The server generating a 304 response MUST generate any of the 1020 following header fields that would have been sent in a 200 (OK) 1021 response to the same request: Cache-Control, Content-Location, Date, 1022 ETag, Expires, and Vary. 1023 1024 Since the goal of a 304 response is to minimize information transfer 1025 when the recipient already has one or more cached representations, a 1026 sender SHOULD NOT generate representation metadata other than the 1027 above listed fields unless said metadata exists for the purpose of 1028 guiding cache updates (e.g., Last-Modified might be useful if the 1029 response does not have an ETag field). 1030 1031 Requirements on a cache that receives a 304 response are defined in 1032 Section 4.3.4 of [RFC7234]. If the conditional request originated 1033 with an outbound client, such as a user agent with its own cache 1034 sending a conditional GET to a shared proxy, then the proxy SHOULD 1035 forward the 304 response to that client. 1036 1037 A 304 response cannot contain a message-body; it is always terminated 1038 by the first empty line after the header fields. 1039 10404.2. 412 Precondition Failed 1041 1042 The 412 (Precondition Failed) status code indicates that one or more 1043 conditions given in the request header fields evaluated to false when 1044 tested on the server. This response code allows the client to place 1045 preconditions on the current resource state (its current 1046 representations and metadata) and, thus, prevent the request method 1047 from being applied if the target resource is in an unexpected state. 1048 10495. Evaluation 1050 1051 Except when excluded below, a recipient cache or origin server MUST 1052 evaluate received request preconditions after it has successfully 1053 performed its normal request checks and just before it would perform 1054 the action associated with the request method. A server MUST ignore 1055 all received preconditions if its response to the same request 1056 without those conditions would have been a status code other than a 1057 2xx (Successful) or 412 (Precondition Failed). In other words, 1058 redirects and failures take precedence over the evaluation of 1059 preconditions in conditional requests. 1060 1061 1062 1063 1064 1065 1066Fielding & Reschke Standards Track [Page 19] 1067 1068RFC 7232 HTTP/1.1 Conditional Requests June 2014 1069 1070 1071 A server that is not the origin server for the target resource and 1072 cannot act as a cache for requests on the target resource MUST NOT 1073 evaluate the conditional request header fields defined by this 1074 specification, and it MUST forward them if the request is forwarded, 1075 since the generating client intends that they be evaluated by a 1076 server that can provide a current representation. Likewise, a server 1077 MUST ignore the conditional request header fields defined by this 1078 specification when received with a request method that does not 1079 involve the selection or modification of a selected representation, 1080 such as CONNECT, OPTIONS, or TRACE. 1081 1082 Conditional request header fields that are defined by extensions to 1083 HTTP might place conditions on all recipients, on the state of the 1084 target resource in general, or on a group of resources. For 1085 instance, the "If" header field in WebDAV can make a request 1086 conditional on various aspects of multiple resources, such as locks, 1087 if the recipient understands and implements that field ([RFC4918], 1088 Section 10.4). 1089 1090 Although conditional request header fields are defined as being 1091 usable with the HEAD method (to keep HEAD's semantics consistent with 1092 those of GET), there is no point in sending a conditional HEAD 1093 because a successful response is around the same size as a 304 (Not 1094 Modified) response and more useful than a 412 (Precondition Failed) 1095 response. 1096 10976. Precedence 1098 1099 When more than one conditional request header field is present in a 1100 request, the order in which the fields are evaluated becomes 1101 important. In practice, the fields defined in this document are 1102 consistently implemented in a single, logical order, since "lost 1103 update" preconditions have more strict requirements than cache 1104 validation, a validated cache is more efficient than a partial 1105 response, and entity tags are presumed to be more accurate than date 1106 validators. 1107 1108 A recipient cache or origin server MUST evaluate the request 1109 preconditions defined by this specification in the following order: 1110 1111 1. When recipient is the origin server and If-Match is present, 1112 evaluate the If-Match precondition: 1113 1114 * if true, continue to step 3 1115 1116 * if false, respond 412 (Precondition Failed) unless it can be 1117 determined that the state-changing request has already 1118 succeeded (see Section 3.1) 1119 1120 1121 1122Fielding & Reschke Standards Track [Page 20] 1123 1124RFC 7232 HTTP/1.1 Conditional Requests June 2014 1125 1126 1127 2. When recipient is the origin server, If-Match is not present, and 1128 If-Unmodified-Since is present, evaluate the If-Unmodified-Since 1129 precondition: 1130 1131 * if true, continue to step 3 1132 1133 * if false, respond 412 (Precondition Failed) unless it can be 1134 determined that the state-changing request has already 1135 succeeded (see Section 3.4) 1136 1137 3. When If-None-Match is present, evaluate the If-None-Match 1138 precondition: 1139 1140 * if true, continue to step 5 1141 1142 * if false for GET/HEAD, respond 304 (Not Modified) 1143 1144 * if false for other methods, respond 412 (Precondition Failed) 1145 1146 4. When the method is GET or HEAD, If-None-Match is not present, and 1147 If-Modified-Since is present, evaluate the If-Modified-Since 1148 precondition: 1149 1150 * if true, continue to step 5 1151 1152 * if false, respond 304 (Not Modified) 1153 1154 5. When the method is GET and both Range and If-Range are present, 1155 evaluate the If-Range precondition: 1156 1157 * if the validator matches and the Range specification is 1158 applicable to the selected representation, respond 206 1159 (Partial Content) [RFC7233] 1160 1161 6. Otherwise, 1162 1163 * all conditions are met, so perform the requested action and 1164 respond according to its success or failure. 1165 1166 Any extension to HTTP/1.1 that defines additional conditional request 1167 header fields ought to define its own expectations regarding the 1168 order for evaluating such fields in relation to those defined in this 1169 document and other conditionals that might be found in practice. 1170 1171 1172 1173 1174 1175 1176 1177 1178Fielding & Reschke Standards Track [Page 21] 1179 1180RFC 7232 HTTP/1.1 Conditional Requests June 2014 1181 1182 11837. IANA Considerations 1184 11857.1. Status Code Registration 1186 1187 The "Hypertext Transfer Protocol (HTTP) Status Code Registry" located 1188 at <http://www.iana.org/assignments/http-status-codes> has been 1189 updated with the registrations below: 1190 1191 +-------+---------------------+-------------+ 1192 | Value | Description | Reference | 1193 +-------+---------------------+-------------+ 1194 | 304 | Not Modified | Section 4.1 | 1195 | 412 | Precondition Failed | Section 4.2 | 1196 +-------+---------------------+-------------+ 1197 11987.2. Header Field Registration 1199 1200 HTTP header fields are registered within the "Message Headers" 1201 registry maintained at 1202 <http://www.iana.org/assignments/message-headers/>. 1203 1204 This document defines the following HTTP header fields, so their 1205 associated registry entries have been updated according to the 1206 permanent registrations below (see [BCP90]): 1207 1208 +---------------------+----------+----------+-------------+ 1209 | Header Field Name | Protocol | Status | Reference | 1210 +---------------------+----------+----------+-------------+ 1211 | ETag | http | standard | Section 2.3 | 1212 | If-Match | http | standard | Section 3.1 | 1213 | If-Modified-Since | http | standard | Section 3.3 | 1214 | If-None-Match | http | standard | Section 3.2 | 1215 | If-Unmodified-Since | http | standard | Section 3.4 | 1216 | Last-Modified | http | standard | Section 2.2 | 1217 +---------------------+----------+----------+-------------+ 1218 1219 The change controller is: "IETF (iesg@ietf.org) - Internet 1220 Engineering Task Force". 1221 12228. Security Considerations 1223 1224 This section is meant to inform developers, information providers, 1225 and users of known security concerns specific to the HTTP conditional 1226 request mechanisms. More general security considerations are 1227 addressed in HTTP "Message Syntax and Routing" [RFC7230] and 1228 "Semantics and Content" [RFC7231]. 1229 1230 1231 1232 1233 1234Fielding & Reschke Standards Track [Page 22] 1235 1236RFC 7232 HTTP/1.1 Conditional Requests June 2014 1237 1238 1239 The validators defined by this specification are not intended to 1240 ensure the validity of a representation, guard against malicious 1241 changes, or detect man-in-the-middle attacks. At best, they enable 1242 more efficient cache updates and optimistic concurrent writes when 1243 all participants are behaving nicely. At worst, the conditions will 1244 fail and the client will receive a response that is no more harmful 1245 than an HTTP exchange without conditional requests. 1246 1247 An entity-tag can be abused in ways that create privacy risks. For 1248 example, a site might deliberately construct a semantically invalid 1249 entity-tag that is unique to the user or user agent, send it in a 1250 cacheable response with a long freshness time, and then read that 1251 entity-tag in later conditional requests as a means of re-identifying 1252 that user or user agent. Such an identifying tag would become a 1253 persistent identifier for as long as the user agent retained the 1254 original cache entry. User agents that cache representations ought 1255 to ensure that the cache is cleared or replaced whenever the user 1256 performs privacy-maintaining actions, such as clearing stored cookies 1257 or changing to a private browsing mode. 1258 12599. Acknowledgments 1260 1261 See Section 10 of [RFC7230]. 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290Fielding & Reschke Standards Track [Page 23] 1291 1292RFC 7232 HTTP/1.1 Conditional Requests June 2014 1293 1294 129510. References 1296 129710.1. Normative References 1298 1299 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 1300 Requirement Levels", BCP 14, RFC 2119, March 1997. 1301 1302 [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax 1303 Specifications: ABNF", STD 68, RFC 5234, January 2008. 1304 1305 [RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer 1306 Protocol (HTTP/1.1): Message Syntax and Routing", 1307 RFC 7230, June 2014. 1308 1309 [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer 1310 Protocol (HTTP/1.1): Semantics and Content", RFC 7231, 1311 June 2014. 1312 1313 [RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed., 1314 "Hypertext Transfer Protocol (HTTP/1.1): Range Requests", 1315 RFC 7233, June 2014. 1316 1317 [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, 1318 Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", 1319 RFC 7234, June 2014. 1320 132110.2. Informative References 1322 1323 [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration 1324 Procedures for Message Header Fields", BCP 90, RFC 3864, 1325 September 2004. 1326 1327 [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., 1328 Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext 1329 Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. 1330 1331 [RFC4918] Dusseault, L., Ed., "HTTP Extensions for Web Distributed 1332 Authoring and Versioning (WebDAV)", RFC 4918, June 2007. 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346Fielding & Reschke Standards Track [Page 24] 1347 1348RFC 7232 HTTP/1.1 Conditional Requests June 2014 1349 1350 1351Appendix A. Changes from RFC 2616 1352 1353 The definition of validator weakness has been expanded and clarified. 1354 (Section 2.1) 1355 1356 Weak entity-tags are now allowed in all requests except range 1357 requests. (Sections 2.1 and 3.2) 1358 1359 The ETag header field ABNF has been changed to not use quoted-string, 1360 thus avoiding escaping issues. (Section 2.3) 1361 1362 ETag is defined to provide an entity tag for the selected 1363 representation, thereby clarifying what it applies to in various 1364 situations (such as a PUT response). (Section 2.3) 1365 1366 The precedence for evaluation of conditional requests has been 1367 defined. (Section 6) 1368 1369Appendix B. Imported ABNF 1370 1371 The following core rules are included by reference, as defined in 1372 Appendix B.1 of [RFC5234]: ALPHA (letters), CR (carriage return), 1373 CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double 1374 quote), HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 1375 8-bit sequence of data), SP (space), and VCHAR (any visible US-ASCII 1376 character). 1377 1378 The rules below are defined in [RFC7230]: 1379 1380 OWS = <OWS, see [RFC7230], Section 3.2.3> 1381 obs-text = <obs-text, see [RFC7230], Section 3.2.6> 1382 1383 The rules below are defined in other parts: 1384 1385 HTTP-date = <HTTP-date, see [RFC7231], Section 7.1.1.1> 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402Fielding & Reschke Standards Track [Page 25] 1403 1404RFC 7232 HTTP/1.1 Conditional Requests June 2014 1405 1406 1407Appendix C. Collected ABNF 1408 1409 In the collected ABNF below, list rules are expanded as per Section 1410 1.2 of [RFC7230]. 1411 1412 ETag = entity-tag 1413 1414 HTTP-date = <HTTP-date, see [RFC7231], Section 7.1.1.1> 1415 1416 If-Match = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS 1417 entity-tag ] ) ) 1418 If-Modified-Since = HTTP-date 1419 If-None-Match = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS 1420 entity-tag ] ) ) 1421 If-Unmodified-Since = HTTP-date 1422 1423 Last-Modified = HTTP-date 1424 1425 OWS = <OWS, see [RFC7230], Section 3.2.3> 1426 1427 entity-tag = [ weak ] opaque-tag 1428 etagc = "!" / %x23-7E ; '#'-'~' 1429 / obs-text 1430 1431 obs-text = <obs-text, see [RFC7230], Section 3.2.6> 1432 opaque-tag = DQUOTE *etagc DQUOTE 1433 1434 weak = %x57.2F ; W/ 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458Fielding & Reschke Standards Track [Page 26] 1459 1460RFC 7232 HTTP/1.1 Conditional Requests June 2014 1461 1462 1463Index 1464 1465 3 1466 304 Not Modified (status code) 19 1467 1468 4 1469 412 Precondition Failed (status code) 18 1470 1471 E 1472 ETag header field 9 1473 1474 G 1475 Grammar 1476 entity-tag 9 1477 ETag 9 1478 etagc 9 1479 If-Match 13 1480 If-Modified-Since 15 1481 If-None-Match 14 1482 If-Unmodified-Since 17 1483 Last-Modified 7 1484 opaque-tag 9 1485 weak 9 1486 1487 I 1488 If-Match header field 13 1489 If-Modified-Since header field 16 1490 If-None-Match header field 14 1491 If-Unmodified-Since header field 17 1492 1493 L 1494 Last-Modified header field 7 1495 1496 M 1497 metadata 5 1498 1499 S 1500 selected representation 4 1501 1502 V 1503 validator 5 1504 strong 5 1505 weak 5 1506 1507 1508 1509 1510 1511 1512 1513 1514Fielding & Reschke Standards Track [Page 27] 1515 1516RFC 7232 HTTP/1.1 Conditional Requests June 2014 1517 1518 1519Authors' Addresses 1520 1521 Roy T. Fielding (editor) 1522 Adobe Systems Incorporated 1523 345 Park Ave 1524 San Jose, CA 95110 1525 USA 1526 1527 EMail: fielding@gbiv.com 1528 URI: http://roy.gbiv.com/ 1529 1530 1531 Julian F. Reschke (editor) 1532 greenbytes GmbH 1533 Hafenweg 16 1534 Muenster, NW 48155 1535 Germany 1536 1537 EMail: julian.reschke@greenbytes.de 1538 URI: http://greenbytes.de/tech/webdav/ 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570Fielding & Reschke Standards Track [Page 28] 1571