Skip to content

ehamberg/scotty-rest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

scotty-rest

Build Status Coverage Status

A Webmachine-style library for scotty inspired by Erlang's cowboy_rest module.

{-# LANGUAGE OverloadedStrings #-}

import Network.Wai.Middleware.RequestLogger
import Web.Scotty.Rest
import Web.Scotty.Trans

main :: IO ()
main = scottyT 3000 id $ do
  middleware logStdoutDev
  rest "/" defaultConfig {
    contentTypesProvided = return [("text/html", html "Hello, World!")]
  }

Introduction

This library implements server-side HTTP semantics as illustrated by the Webmachine diagram. Instead of simply having handlers for endpoints that then have to take full responsibility for handling all of the behaviour expected from an HTTP server (using the correct return code, including the correct headers that go with some return codes, etc.), you implement callbacks for the various decision points and get correct semantics β€œfor free”. These callbacks are regular functions and they have default implementations that do what you expect, meaning that you only need to implement the ones whose behaviour you want to change.

Some examples of callback functions and their default implementations:

  • serviceAvailable: return True
  • isAuthorized: return Authorized
  • charSetsProvided: Nothing (i.e. ignore the Accept-Charsets header)
  • allowedMethods: [GET, HEAD, OPTIONS]
  • resourceMoved: NotMoved

Usage

The two functions that you almost always is going to override is contentTypesProvided and/or contentTypesAccepted. These are both a list of pairs of content types (e.g. application/json) together with a handler for that type. A handler is a function that is responsible for producing a response for its associated content type (in the case of contentTypesProvided) or consuming a value of its associated content type (in the case of contentTypesAccepted).

In the example above, the only function overridden is contentTypesProvided. Our implementations says that we provide only one content type (text/html) and if someone asks for text/html (or */*) we will use Scotty's html function to return the text "Hello World".

Some example interactions with this server:

Requesting any content type

GET / HTTP/1.1
Accept: */*
Host: localhost:3000
HTTP/1.1 200 OK
Date: Sat, 19 Nov 2016 14:32:20 GMT
Server: Warp/3.2.9
Transfer-Encoding: chunked
Content-Type: text/html

Hello, World!

Requesting a content type that isn't provided

GET / HTTP/1.1
Accept: application/json
Host: localhost:3000
HTTP/1.1 406 Not Acceptable
Date: Sat, 19 Nov 2016 14:32:30 GMT
Server: Warp/3.2.9
Transfer-Encoding: chunked

POSTing a JSON document

POST / HTTP/1.1
Accept: application/json, */*
Content-Length: 13
Content-Type: application/json
Host: localhost:3000

{
    "test": "1"
}
HTTP/1.1 405 Method Not Allowed
Date: Sat, 19 Nov 2016 14:32:57 GMT
Server: Warp/3.2.9
Transfer-Encoding: chunked
Allow: GET, HEAD, OPTIONS

State

You will often want to have some state per request. You could for example imagine having a serviceAvailable function that attempts to get a database connection from a connections pool and if successful it would add the acquired connection handle to the current state. The isAuthorized call could then use this connection to authenticate/authorize a user based on a token and then add the user record to the current state, and so on.

Flow diagrams

The diagrams below show the flow of how scotty-rest will handle a request and the functions that are called at each decision point.

                        Start

                          β”‚
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗      False        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘           serviceAvailable           ║──────────────────▢│503 Service Unavailable     β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ True
                          β”‚
                          β–Ό
      ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓     False         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘            method is known           ┃──────────────────▢│501 Not Implemented         β”‚
      ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ True
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗       True        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘              uriTooLong              ║──────────────────▢│414 Request URI Too Long    β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ False
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗      False        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘       method ∈ allowedMethods        ║──────────────────▢│405 Method Not Allowed      β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚  True
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗      True         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘           malformedRequest           ║──────────────────▢│400 Bad Request             β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ False
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗   NotAuthorized   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘             isAuthorized             ║──────────────────▢│401 Unauthorized            β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ Authorized
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗       True        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘              forbidden               ║──────────────────▢│403 Forbidden               β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ True
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗      False        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘         validContentHeaders          ║──────────────────▢│501 Not Implemented         β”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚ True
                          β”‚
                          β–Ό
      ╔══════════════════════════════════════╗      False        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β•‘          validEntityLength           ║──────────────────▢│413 Request Entity Too Largeβ”‚
      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚
                          β”‚                                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β–Ό                                   β”‚                          OPTIONSβ”‚
              ┏━━━━━━━━━━━━━━━━━━━━━━┓                        β”‚                                 β”‚
              ┃                      ┃            Yes         β”‚  ╔════════════════════════════╗ β”‚
              ┃  Method is OPTIONS?  ┃────────────────────────┼─▢║          options           β•‘ β”‚
              ┃                      ┃                        β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• β”‚
              ┗━━━━━━━━━━━━━━━━━━━━━━┛                        β”‚                 β”‚               β”‚
                          β”‚                                   β”‚                 β”‚               β”‚
                          β”‚                                   β”‚                 β–Ό               β”‚
                          β”‚                                   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                          β”‚                                   β”‚  β”‚           200 OK           β”‚ β”‚
                          β”‚                                   β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                          β”‚                                   β”‚                                 β”‚
                          β”‚                                   β”‚                                 β”‚
                          β”‚                                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         β–Ό                                                  Content negotiationβ”‚
β”‚             ┏━━━━━━━━━━━━━━━━━━━━━━┓                                                          β”‚
β”‚      No     ┃                      ┃                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”ƒ Has β€œAccept” Header? ┃                                                          β”‚
β”‚  β”‚          ┃                      ┃                                                          β”‚
β”‚  β”‚          ┗━━━━━━━━━━━━━━━━━━━━━━┛                                                          β”‚
β”‚  β”‚                      β”‚                                                                     β”‚
β”‚  β”‚                      β”‚ Yes                                                                 β”‚
β”‚  β”‚                      β–Ό                                       Not                           β”‚
β”‚  β”‚  ╔══════════════════════════════════════╗                  Provided                        β”‚
β”‚  β”‚  β•‘         contentTypesProvided         ║────────────────────────────────┐                 β”‚
β”‚  β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                                β”‚                 β”‚
β”‚  β”‚                      β”‚                                                   β”‚                 β”‚
β”‚  β”‚                      β”‚ Provided                                          β”‚                 β”‚
β”‚  β”‚                      β–Ό                                                   β”‚                 β”‚
β”‚  β”‚          ┏━━━━━━━━━━━━━━━━━━━━━━┓                                        β”‚                 β”‚
β”‚  └─────────▢┃Has β€œAccept-Language” ┃                                        β”‚                 β”‚
β”‚             ┃       Header?        ┃                                        β”‚                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”ƒ                      ┃                                        β”‚                 β”‚
β”‚  β”‚    No    ┗━━━━━━━━━━━━━━━━━━━━━━┛                                        β”‚                 β”‚
β”‚  β”‚                      β”‚                                                   β”‚                 β”‚
β”‚  β”‚                      β”‚ Yes                                               β”‚                 β”‚
β”‚  β”‚                      β–Ό                           Not                     β–Ό                 β”‚
β”‚  β”‚  ╔══════════════════════════════════════╗      provided        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚  β•‘          languagesProvided           ║─────────────────────▢│406 Not Acceptable β”‚       β”‚
β”‚  β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚  β”‚                      β”‚                                                   β–²                 β”‚
β”‚  β”‚                      β”‚ Provided                                          β”‚                 β”‚
β”‚  β”‚                      β–Ό                                                   β”‚                 β”‚
β”‚  β”‚          ┏━━━━━━━━━━━━━━━━━━━━━━┓                                        β”‚                 β”‚
β”‚  └─────────▢┃ Has β€œAccept-Charset” ┃                                        β”‚                 β”‚
β”‚             ┃       Header?        ┃                                        β”‚                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”ƒ                      ┃                                        β”‚                 β”‚
β”‚  β”‚    No    ┗━━━━━━━━━━━━━━━━━━━━━━┛                                        β”‚                 β”‚
β”‚  β”‚                      β”‚                                                   β”‚                 β”‚
β”‚  β”‚                      β”‚ Yes                                               β”‚                 β”‚
β”‚  β”‚                      β–Ό                                    Not            β”‚                 β”‚
β”‚  β”‚  ╔══════════════════════════════════════╗               provided         β”‚                 β”‚
β”‚  β”‚  β•‘           charSetsProvided           β•‘β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚  β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                                                  β”‚
β”‚  β”‚                      β”‚                                                                     β”‚
β”‚  β”‚                      β”‚ Provided                                                            β”‚
β”‚  β”‚                      β–Ό                                                                     β”‚
β”‚  β”‚  ╔══════════════════════════════════════╗                                                  β”‚
β”‚  └─▢║              variances               β•‘                                                  β”‚
β”‚     β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                                                  β”‚
β”‚                         β”‚                                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β”‚
                          β”‚
                          β–Ό

       See GET/HEAD, PUT/POST/PATCH or DELETE
         diagram, depending on the method.

GET/HEAD requests

               Continuing from
            Content Negotiation…

                      β”‚
                      β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     β”‚                                                                 GET/HEADβ”‚
β”‚                     β–Ό                                                                         β”‚
β”‚ ╔══════════════════════════════════════╗            False                                     β”‚
β”‚ β•‘            resourceExists            ║────────────────────────────┐                         β”‚
β”‚ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                            β”‚                         β”‚
β”‚                     β”‚                                               β”‚                         β”‚
β”‚                     β”‚                                               β”‚                         β”‚
β”‚                     β”‚ True                                          β”‚                         β”‚
β”‚                     β”‚                                               β–Ό                         β”‚
β”‚                     β–Ό                                   ┏━━━━━━━━━━━━━━━━━━━━━━┓              β”‚
β”‚                                                         ┃                      ┃  False       β”‚
β”‚    See β€œConditional requests” diagram                   ┃Has β€œIf-Match” Header?┃───────┐      β”‚
β”‚                                                         ┃                      ┃       β”‚      β”‚
β”‚                     β”‚                                   ┗━━━━━━━━━━━━━━━━━━━━━━┛       β”‚      β”‚
β”‚                     β”‚                                               β”‚                  β”‚      β”‚
β”‚                     β–Ό                                               β”‚ True             β”‚      β”‚
β”‚    ╔════════════════════════════════╗                               β–Ό                  β”‚      β”‚
β”‚    β•‘          generateEtag          β•‘                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚      β”‚
β”‚    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β”‚ 412 Precond. Failed  β”‚       β”‚      β”‚
β”‚                     β”‚                                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚      β”‚
β”‚                     β”‚                                                                  β”‚      β”‚
β”‚                     β–Ό                                                                  β”‚      β”‚
β”‚    ╔════════════════════════════════╗                                                  β”‚      β”‚
β”‚    β•‘          lastModified          β•‘              ╔════════════════════════════════╗  β”‚      β”‚
β”‚    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•           β”Œβ”€β”€β•‘       previouslyExisted        β•‘β—€β”€β”˜      β”‚
β”‚                     β”‚                           β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•         β”‚
β”‚                     β”‚                           β”‚                   β”‚                         β”‚
β”‚                     β–Ό                           β”‚ True              β”‚ False                   β”‚
β”‚    ╔════════════════════════════════╗           β”‚                   β–Ό                         β”‚
β”‚    β•‘            expires             β•‘           β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•           β”‚       β”‚    404 Not Found     β”‚              β”‚
β”‚                     β”‚                           β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”‚                     β”‚                           β”‚                                             β”‚
β”‚                     β–Ό                           β”‚                                             β”‚
β”‚    ╔════════════════════════════════╗           β”‚                                             β”‚
β”‚    β•‘                                β•‘           β”‚  ╔════════════════════════════════╗         β”‚
β”‚    β•‘  Run callback for negotiated   β•‘           └─▢║             moved              β•‘         β”‚
β”‚    β•‘   content type from list in    β•‘              β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•         β”‚
β”‚    β•‘      contentTypesProvided      β•‘                               β”‚                         β”‚
β”‚    β•‘                                β•‘                               β”‚                         β”‚
β”‚    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚                     β”‚                                  β”‚            β”‚             β”‚           β”‚
β”‚                     β”‚                                  β”‚            β”‚             β”‚           β”‚
β”‚                     β–Ό                                  β”‚            β”‚             β”‚           β”‚
β”‚    ╔════════════════════════════════╗          MovedTemporarily     β”‚      MovedPermantly     β”‚
β”‚ β”Œβ”€β”€β•‘        multipleChoices         β•‘                  β”‚            β”‚             β”‚           β”‚
β”‚ β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                  β”‚            β”‚             β”‚           β”‚
β”‚ β”‚                   β”‚                                  β”‚        NotMoved          β”‚           β”‚
β”‚ β”‚                   β”‚                                  β”‚            β”‚             β”‚           β”‚
β”‚ β”‚ Multiple*         β”‚ UniqueRepresentation             β”‚            β”‚             β”‚           β”‚
β”‚ β”‚                   β”‚                                  β–Ό            β”‚             β–Ό           β”‚
β”‚ β”‚                   β–Ό                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚ β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚307 Moved Temporarily β”‚ β”‚ β”‚301 Moved Permanently β”‚β”‚
β”‚ β”‚       β”‚        200 OK        β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β”‚ β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                    β”‚                         β”‚
β”‚ β”‚                                                                   β–Ό                         β”‚
β”‚ β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚ └──────▢│ 300 Multiple Choices β”‚                        β”‚       410 Gone       β”‚              β”‚
β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”‚                                                                                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

PUT/POST/PATCH requests

                 Continuing from
              Content Negotiation…

                        β”‚
                        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                       β”‚                                                         PUT/POST/PATCHβ”‚
β”‚                       β–Ό                                                                       β”‚
β”‚       ╔═══════════════════════════════╗               False                                   β”‚
β”‚       β•‘        resourceExists         ║───────────────────────────────┐                       β”‚
β”‚       β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                               β”‚                       β”‚
β”‚                       β”‚                                               β”‚                       β”‚
β”‚                       β”‚                                               β”‚                       β”‚
β”‚                       β”‚ True                                          β”‚                       β”‚
β”‚                       β”‚                                               β–Ό                       β”‚
β”‚                       β–Ό                                   ┏━━━━━━━━━━━━━━━━━━━━━━┓            β”‚
β”‚                                                           ┃                      ┃  False     β”‚
β”‚      See β€œConditional requests” diagram                   ┃Has β€œIf-Match” Header?┃─────────┐  β”‚
β”‚                                                           ┃                      ┃         β”‚  β”‚
β”‚                       β”‚                                   ┗━━━━━━━━━━━━━━━━━━━━━━┛         β”‚  β”‚
β”‚                       β”‚                                               β”‚                    β”‚  β”‚
β”‚                       β”‚                                               β”‚ True               β”‚  β”‚
β”‚                       β”‚                                               β–Ό                    β”‚  β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚  β”‚
β”‚ β”‚                                                         β”‚ 412 Precond. Failed  β”‚         β”‚  β”‚
β”‚ β”‚                                                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚  β”‚
β”‚ β”‚                                                                                          β”‚  β”‚
β”‚ β”‚                                                                                          β”‚  β”‚
β”‚ β”‚                                                                                          β”‚  β”‚
β”‚ β”‚                                                         ┏━━━━━━━━━━━━━━━━━━━━━━┓         β”‚  β”‚
β”‚ β”‚                                               False     ┃                      ┃         β”‚  β”‚
β”‚ β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”ƒMethod is POST/PATCH? β”ƒβ—€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚ β”‚  β”‚                                                      ┃                      ┃            β”‚
β”‚ β”‚  β”‚                                                      ┗━━━━━━━━━━━━━━━━━━━━━━┛            β”‚
β”‚ β”‚  β”‚                                                                  β”‚                       β”‚
β”‚ β”‚  β”‚                                                                  β”‚ True                  β”‚
β”‚ β”‚  β”‚           ┏━━━━━━━━━━━━━━━━━━━━━━┓                               β–Ό                       β”‚
β”‚ β”‚  β”‚           ┃                      ┃       False  ╔════════════════════════════════╗       β”‚
β”‚ β”‚  β”‚           ┃   Method is POST?    ┃◀─────────────║       previouslyExisted        β•‘       β”‚
β”‚ β”‚  β”‚           ┃                      ┃              β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•       β”‚
β”‚ β”‚  β”‚           ┗━━━━━━━━━━━━━━━━━━━┳━━┛                               β”‚                       β”‚
β”‚ β”‚  β”‚                       β”‚       β”‚                                  β”‚                       β”‚
β”‚ β”‚  β”‚                  True β”‚       β”‚ False                            β”‚                       β”‚
β”‚ β”‚  β”‚                       β–Ό       └──────────┐                       β”‚                       β”‚
β”‚ β”‚  β”‚       ╔═══════════════════════════════╗  β”‚                       β”‚ True                  β”‚
β”‚ β”‚  β”‚   β”Œβ”€β”€β”€β•‘       allowMissingPost        β•‘  β”‚                       β”‚                       β”‚
β”‚ β”‚  β”‚   β”‚   β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•  β”‚                       β”‚                       β”‚
β”‚ β”‚  β”‚   β”‚                   β”‚                  β”‚                       β”‚                       β”‚
β”‚ β”‚  β”‚   β”‚ True              β”‚ False            β”‚                       β–Ό                       β”‚
β”‚ β”‚  β”‚   β”‚                   β–Ό                  β”‚      ╔════════════════════════════════╗       β”‚
β”‚ β”‚  β”‚   β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚      β•‘             moved              β•‘       β”‚
β”‚ β”‚  β”‚   β”‚       β”‚    404 Not Found     β”‚β—€β”€β”€β”€β”€β”€β”€β”˜      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•       β”‚
β”‚ β”‚  β”‚   β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚                       β”‚
β”‚ β”‚  β”‚   β”‚                                                              β”‚                       β”‚
β”‚ β”‚  β”‚   β”‚                                                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚ β”‚  β”‚   β”‚                                                 β”‚            β”‚             β”‚         β”‚
β”‚ β”‚  β”‚   β”‚                                                 β”‚            β”‚             β”‚         β”‚
β”‚ β”‚  β”‚   └──────────────┐                                  β”‚            β”‚             β”‚         β”‚
β”‚ β”‚  β”‚                  β”‚                                  β”‚            β”‚             β”‚         β”‚
β”‚ β”‚  β”‚                  β–Ό                          MovedTemporarily     β”‚      MovedPermantly   β”‚
β”‚ β”‚  β”‚      ┏━━━━━━━━━━━━━━━━━━━━━━┓                       β”‚            β”‚             β”‚         β”‚
β”‚ β”‚  └─────▢┃                      ┃                       β”‚        NotMoved          β”‚         β”‚
β”‚ β”‚         ┃    Method is PUT?    ┃                       β”‚            β”‚             β”‚         β”‚
β”‚ └────────▢┃                      ┃                       β”‚            β”‚             β”‚         β”‚
β”‚           ┗━━━━━━━━━━━━━━━━━━━━━━┛                       β–Ό            β”‚             β–Ό         β”‚
β”‚                     β”‚ β”‚                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”
β”‚             False   β”‚ β”‚ True                 β”‚307 Moved Temporarily β”‚ β”‚ β”‚301 Moved Permanently β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”˜
β”‚    β”‚                  β”‚                                               β”‚                       β”‚
β”‚    β”‚                  β”‚                                               β”‚                       β”‚
β”‚    β”‚                  β”‚                                               β–Ό                       β”‚
β”‚    β”‚                  β”‚                                   ┏━━━━━━━━━━━━━━━━━━━━━━┓            β”‚
β”‚    β”‚                  β”‚                                   ┃                      ┃            β”‚
β”‚    β”‚                  β”‚                                   ┃   Method is POST?    ┃            β”‚
β”‚    β”‚                  β”‚                                   ┃                      ┃            β”‚
β”‚    β”‚                  β”‚                                   ┗━━━━━━━━━━━━━━━━━━━━━━┛            β”‚
β”‚    β”‚                  β”‚                                               β”‚                       β”‚
β”‚    β”‚                  β”‚                                               β”‚ True                  β”‚
β”‚    β”‚                  β–Ό                                               β–Ό                       β”‚
β”‚    β”‚      ╔══════════════════════╗     False          ╔═══════════════════════════════╗       β”‚
β”‚    β”‚      β•‘      isConflict      ║─────────────┐      β•‘       allowMissingPost        ╠─────┐ β”‚
β”‚    β”‚      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•             β”‚      β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•     β”‚ β”‚
β”‚    β”‚                  β”‚                        β”‚                      β”‚                     β”‚ β”‚
β”‚    β”‚                  β”‚  True                  β”‚                      β”‚ False          True β”‚ β”‚
β”‚    β”‚                  β–Ό                        β”‚                      β–Ό                     β”‚ β”‚
β”‚    β”‚      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”             β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚ β”‚
β”‚    β”‚      β”‚     409 Conflict     β”‚             β”‚          β”‚       410 Gone       β”‚          β”‚ β”‚
β”‚    β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚ β”‚
β”‚    β”‚                                           β”‚                                            β”‚ β”‚
β”‚    β”‚                                           β”‚                                            β”‚ β”‚
β”‚    β”‚                                           β”‚                                            β”‚ β”‚
β”‚    β”‚                                           β–Ό                                            β”‚ β”‚
β”‚    β”‚                            ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓                              β”‚ β”‚
β”‚    β”‚                            ┃    Handler for type in     ┃                              β”‚ β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Άβ”ƒβ€œContent-Type” header existsβ”ƒβ—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                 ┃  in contentTypesAccepted   ┃                                β”‚
β”‚                                 ┗━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┛                                β”‚
β”‚                                 Yes       β”‚        β”‚       No                                 β”‚
β”‚                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        └────────────────────────┐                 β”‚
β”‚                      β”‚                                                      β”‚                 β”‚
β”‚                      β–Ό                                                      β–Ό                 β”‚
β”‚     ╔════════════════════════════════╗                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚     β•‘ Run the callback function from β•‘    Failed              β”‚415 Unsupported Media Type β”‚   β”‚
β”‚     β•‘  contentTypesAccepted for the  ║────────────┐           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚     β•‘   content type we were given   β•‘            β”‚                                           β”‚
β”‚     β•šβ•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•¦β•β•β•β•β•¦β•β•β•            β”‚                                           β”‚
β”‚             β”‚        β”‚       β”‚    β”‚               β”‚                                           β”‚
β”‚             β”‚        β”‚       β”‚    β”‚               β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚             β”‚        β”‚       β”‚    β”‚               └───────────▢│      400 Bad Request      β”‚  β”‚
β”‚             β”‚        β”‚       β”‚    β”‚                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚             β”‚        β”‚       β”‚    β”‚   Redirect                                                β”‚
β”‚             β”‚        β”‚       β”‚    └───────────────┐                                           β”‚
β”‚             β”‚        β”‚       β”‚                    β”‚                                           β”‚
β”‚             β”‚        β”‚       β”‚                    β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚             β”‚        β”‚       └───┐                └───────────▢│       303 See Other       β”‚  β”‚
β”‚             β”‚        β”‚           β”‚                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚             β”‚        β”‚           β”‚                                                            β”‚
β”‚             β”‚        β”‚           β”‚                                                            β”‚
β”‚             β”‚        β”‚           β”‚                                                            β”‚
β”‚        β”Œβ”€β”€β”€β”€β”˜        β”‚      Succeeded                                                         β”‚
β”‚        β”‚             β”‚           β”‚                                                            β”‚
β”‚        β”‚       β”Œβ”€β”€β”€β”€β”€β”˜           β”‚                                                            β”‚
β”‚        β”‚       β”‚                 β”‚                       False  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚        β”‚       β”‚                 β”‚                     β”Œβ”€β”€β”€β”€β”€β”€β”€β–Άβ”‚        201 Created        β”‚ β”‚
β”‚        β”‚       β”‚                 β–Ό                     β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚        β”‚       β”‚  ╔════════════════════════════╗       β”‚                                      β”‚
β”‚        β”‚       β”‚  β•‘       resourceExists       ║────────                                      β”‚
β”‚        β”‚       β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•       β”‚                                      β”‚
β”‚        β”‚       β”‚                                       β”‚        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚        β”‚       β”‚                                       └───────▢│      204 No Content       β”‚ β”‚
β”‚        β”‚       β”‚                                          True  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚        β”‚       β”‚                                                                              β”‚
β”‚        β”‚   SuccededWithContent                                                                β”‚
β”‚        β”‚       β”‚                                         False  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚        β”‚       β”‚                                       β”Œβ”€β”€β”€β”€β”€β”€β”€β–Άβ”‚        201 Created        β”‚ β”‚
β”‚        β”‚       β”‚                                       β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚        β”‚       β”‚  ╔════════════════════════════╗       β”‚                                      β”‚
β”‚        β”‚       └─▢║       resourceExists       ║────────                                      β”‚
β”‚        β”‚          β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•       β”‚                                      β”‚
β”‚        β”‚                                               β”‚         ╔═══════════════════╗        β”‚
β”‚        β”‚                                               └────────▢║  multipleChoices  ║───┐    β”‚
β”‚  SuccededWithLocation                                     True   β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•   β”‚    β”‚
β”‚        β”‚                                                                   β”‚             β”‚    β”‚
β”‚        β”‚                                                                   β”‚             β”‚    β”‚
β”‚        β”‚          ╔════════════════════════════╗                UniqueRepresentation     β”‚    β”‚
β”‚        └─────────▢║       resourceExists       β•‘                           β”‚             β”‚    β”‚
β”‚                   β•šβ•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•                           β”‚             β”‚    β”‚
β”‚                           β”‚             β”‚                                  β”‚        Multiple* β”‚
β”‚                    True   β”‚             β”‚False                             β–Ό             β”‚    β”‚
β”‚               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             └─────┐                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚    β”‚
β”‚               β”‚                               β”‚                β”‚        200 OK        β”‚  β”‚    β”‚
β”‚               β”‚                               β”‚                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚    β”‚
β”‚               β”‚                               β”‚                                          β”‚    β”‚
β”‚               β–Ό                               β–Ό                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚    β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ 300 Multiple Choices β”‚β—€β”€β”˜    β”‚
β”‚ β”‚      204 No Content       β”‚   β”‚        201 Created        β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚ β”‚    + β€œLocation” header    β”‚   β”‚    + β€œLocation” header    β”‚                                 β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

DELETE requests

               Continuing from
            Content Negotiation…

                      β”‚
                      β”‚
                      β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     β–Ό                                                                   DELETEβ”‚
β”‚ ╔══════════════════════════════════════╗                                                      β”‚
β”‚ β•‘            resourceExists            ║────────────────────────────┐                         β”‚
β”‚ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                            β”‚                         β”‚
β”‚                     β”‚                                               β”‚                         β”‚
β”‚                     β”‚                                               β”‚                         β”‚
β”‚                     β”‚                                               β”‚                         β”‚
β”‚                     β”‚                                               β–Ό                         β”‚
β”‚                     β–Ό                                   ┏━━━━━━━━━━━━━━━━━━━━━━┓              β”‚
β”‚                                                         ┃                      ┃              β”‚
β”‚    See β€œConditional requests” diagram                   ┃Has β€œIf-Match” Header?┃───────┐      β”‚
β”‚                                                         ┃                      ┃       β”‚      β”‚
β”‚                     β”‚                                   ┗━━━━━━━━━━━━━━━━━━━━━━┛       β”‚      β”‚
β”‚                     β”‚                                               β”‚                  β”‚      β”‚
β”‚                     β”‚                                               β”‚                  β”‚      β”‚
β”‚                     β–Ό                                               β–Ό                  β”‚      β”‚
β”‚    ╔════════════════════════════════╗                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚      β”‚
β”‚    β•‘         deleteResource         β•‘                   β”‚ 412 Precond. Failed  β”‚       β”‚      β”‚
β”‚    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚      β”‚
β”‚        β”‚    β”‚              β”‚    β”‚                                                      β”‚      β”‚
β”‚        β”‚    β”‚              β”‚    β”‚                                                      β”‚      β”‚
β”‚        β”‚    β”‚         Deleted   β”‚ DeleteEnacted                                        β”‚      β”‚
β”‚    β”Œβ”€β”€β”€β”˜    β”‚              β”‚    β”‚                  ╔════════════════════════════════╗  β”‚      β”‚
β”‚    β”‚    NotDeleted         β”‚    β”‚               β”Œβ”€β”€β•‘       previouslyExisted        β•‘β—€β”€β”˜      β”‚
β”‚    β”‚        β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚               β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•         β”‚
β”‚    β”‚        β”‚    β”‚              β”‚               β”‚                   β”‚                         β”‚
β”‚    β”‚        β”‚    β”‚              β–Ό               β”‚                   β”‚ False                   β”‚
β”‚    β”‚        β”‚    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚                   β–Ό                         β”‚
β”‚    β”‚        β”‚    β”‚  β”‚     202 Accepted     β”‚    β”‚  True β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚    β”‚        β”‚    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚       β”‚    404 Not Found     β”‚              β”‚
β”‚    β”‚        β”‚    β”‚                              β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”‚    β”‚        β”‚    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚                                             β”‚
β”‚    β”‚        β”‚    └─▢│    204 No Content    β”‚    β”‚                                             β”‚
β”‚    β”‚        β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚                                             β”‚
β”‚    β”‚        β”‚                                   β”‚  ╔════════════════════════════════╗         β”‚
β”‚    β”‚        β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    └─▢║             moved              β•‘         β”‚
β”‚    β”‚        └──────▢│      500 Error       β”‚       β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•         β”‚
β”‚    β”‚                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β”‚                         β”‚
β”‚    └─────────────────┐                                              β”‚                         β”‚
β”‚                      β”‚                                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚             DeletedWithResponse                MovedTemporarily     β”‚      MovedPermantly     β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚                      β”‚                                 β”‚        NotMoved          β”‚           β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚                      β”‚                                 β”‚            β”‚             β”‚           β”‚
β”‚                      β–Ό                                 β–Ό            β”‚             β–Ό           β”‚
β”‚     ╔════════════════════════════════╗     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”Œβ”€β”€β•‘        multipleChoices         β•‘     β”‚307 Moved Temporarily β”‚ β”‚ β”‚301 Moved Permanently β”‚β”‚
β”‚  β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β”‚  β”‚                   β”‚                                              β”‚                         β”‚
β”‚  β”‚                   β”‚                                              β–Ό                         β”‚
β”‚  β”‚ Multiple*         β”‚ UniqueRepresentation             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚                   β”‚                                  β”‚       410 Gone       β”‚              β”‚
β”‚  β”‚                   β–Ό                                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β”‚  β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                             β”‚
β”‚  β”‚       β”‚        200 OK        β”‚                                                             β”‚
β”‚  β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                             β”‚
β”‚  β”‚                                                                                            β”‚
β”‚  β”‚       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                             β”‚
β”‚  └──────▢│ 300 Multiple Choices β”‚                                                             β”‚
β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Conditional requests

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                                           Conditional requestsβ”‚
β”‚                      ┏━━━━━━━━━━━━━━━━━━━━━━┓                                                 β”‚
β”‚                      ┃                      ┃                                                 β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”ƒHas β€œIf-Match” Header?┃                                                 β”‚
β”‚              β”‚       ┃                      ┃                                                 β”‚
β”‚              β”‚       ┗━━━━━━━━━━━━━━━━━━━━━━┛                                                 β”‚
β”‚              β”‚                   β”‚                                                            β”‚
β”‚              β”‚                   β”‚ True                                                       β”‚
β”‚              β”‚                   β–Ό                                                            β”‚
β”‚              β”‚  ╔════════════════════════════════╗      tags didn't match                     β”‚
β”‚         Falseβ”‚  β•‘          generateEtag          ║───────────────────────────┐                β”‚
β”‚              β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•                           β”‚                β”‚
β”‚              β”‚                   β”‚                                           β”‚                β”‚
β”‚              β”‚                   β”‚ tags matched                              β”‚                β”‚
β”‚              β”‚                   β–Ό                                           β”‚                β”‚
β”‚              β”‚       ┏━━━━━━━━━━━━━━━━━━━━━━┓                                β”‚                β”‚
β”‚              └──────▢┃         Has          ┃                                β”‚                β”‚
β”‚                      β”ƒβ€œIf-Unmodified-Since” ┃                                β”‚                β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”ƒ       Header?        ┃                                β”‚                β”‚
β”‚              β”‚       ┗━━━━━━━━━━━━━━━━━━━━━━┛                                β”‚                β”‚
β”‚              β”‚                   β”‚                                           β”‚                β”‚
β”‚              β”‚                   β”‚ True                                      β”‚                β”‚
β”‚              β”‚                   β–Ό                                           β–Ό                β”‚
β”‚              β”‚  ╔════════════════════════════════╗    modfied    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚        False β”‚  β•‘          lastModified          ║──────────────▢│ 412 Precond. Failed  β”‚     β”‚
β”‚              β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚              β”‚                   β”‚                                           β–²                β”‚
β”‚              β”‚                   β”‚ not modified                              β”‚                β”‚
β”‚              β”‚                   β–Ό                                           β”‚                β”‚
β”‚              β”‚       ┏━━━━━━━━━━━━━━━━━━━━━━┓                                β”‚                β”‚
β”‚              └──────▢┃ Has β€œIf-None-Match”  ┃                                β”‚                β”‚
β”‚                      ┃       Header?        ┃                                β”‚ Yes            β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”ƒ                      ┃                                β”‚                β”‚
β”‚              β”‚       ┗━━━━━━━━━━━━━━━━━━━━━━┛                                β”‚                β”‚
β”‚              β”‚                   β”‚                                           β”‚                β”‚
β”‚              β”‚                   β”‚ True                                      β”‚                β”‚
β”‚              β”‚                   β–Ό                               ┏━━━━━━━━━━━━━━━━━━━━━━┓     β”‚
β”‚              β”‚  ╔════════════════════════════════╗  tags matched ┃                      ┃     β”‚
β”‚        False β”‚  β•‘          generateEtag          ║──────────────▢┃ Method is GET/HEAD?  ┃     β”‚
β”‚              β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•               ┃                      ┃     β”‚
β”‚              β”‚                   β”‚                               ┗━━━━━━━━━━━━━━━━━━━━━━┛     β”‚
β”‚              β”‚                   β”‚ True                                      β”‚                β”‚
β”‚              β”‚                   β–Ό                                           β”‚                β”‚
β”‚              β”‚       ┏━━━━━━━━━━━━━━━━━━━━━━┓                                β”‚                β”‚
β”‚              └──────▢┃         Has          ┃                                β”‚                β”‚
β”‚                      ┃ β€œIf-Modified-Since”  ┃                                β”‚ No             β”‚
β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”ƒ       Header?        ┃                                β”‚                β”‚
β”‚              β”‚       ┗━━━━━━━━━━━━━━━━━━━━━━┛                                β”‚                β”‚
β”‚              β”‚                   β”‚                                           β”‚                β”‚
β”‚              β”‚                   β”‚ True                                      β”‚                β”‚
β”‚              β”‚                   β–Ό                   not                     β–Ό                β”‚
β”‚              β”‚  ╔════════════════════════════════╗ modified ╔════════════════════════════════╗│
β”‚        False β”‚  β•‘          lastModified          ║─────────▢║          generateEtag          β•‘β”‚
β”‚              β”‚  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•          β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β”‚
β”‚              β”‚                   β”‚                                           β”‚                β”‚
β”‚              β”‚                   β”‚ modified                                  β”‚                β”‚
β”‚              └─────────────────┐ β”‚                                           β–Ό                β”‚
β”‚                                β”‚ β”‚                          ╔════════════════════════════════╗│
β”‚                                β”‚ β”‚                          β•‘            expires             β•‘β”‚
β”‚                                β”‚ β”‚                          β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β”‚
β”‚                                β”‚ β”‚                                           β”‚                β”‚
β”‚                                β”‚ β”‚                                           β”‚                β”‚
β”‚                                β”‚ β”‚                                           β–Ό                β”‚
β”‚                                β”‚ β”‚                               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚                                β”‚ β”‚                               β”‚   304 Not Modified   β”‚     β”‚
β”‚                                β”‚ β”‚                               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                 β”‚ β”‚
                                 β”‚ β”‚
                                 β–Ό β–Ό

About

Webmachine-style REST library for scotty inspired by cowboy

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published