# $Id: http_abnf.txt,v 1.2 2001/04/21 02:37:26 icahoon Exp $
#
#   
====================================================================

Http::Message
{
    HTTP-message    =   Request | Response          ; HTTP/1.1 messages

    Request         =   Request-Line                ; Section 5.1
                        *(( general-header          ; Section 4.5
                        | request-header            ; Section 5.3
                        | entity-header ) CRLF)     ; Section 7.1
                        CRLF
                        [ message-body ]            ; Section 4.3
    
    Response        =   Status-Line                 ; Section 6.1
                        *(( general-header          ; Section 4.5
                        | response-header           ; Section 6.2
                        | entity-header ) CRLF)     ; Section 7.1
                        CRLF
                        [ message-body ]            ; Section 7.2
    
    
    Request-Line    =   Method SP Request-URI SP HTTP-Version CRLF
    
    Status-Line     =   HTTP-Version SP Status-Code SP Reason-Phrase CRLF
}

====================================================================

Http::Method
{

    Method          =   "OPTIONS"                   ; Section 9.2
                    |   "GET"                       ; Section 9.3
                    |   "HEAD"                      ; Section 9.4
                    |   "POST"                      ; Section 9.5
                    |   "PUT"                       ; Section 9.6
                    |   "DELETE"                    ; Section 9.7
                    |   "TRACE"                     ; Section 9.8
                    |   "CONNECT"                   ; Section 9.9
                    |   extension-method

    extension-method    = token
}

====================================================================

Http::Version
{
    HTTP-Version    = "HTTP" "/" 1*DIGIT "." 1*DIGIT
}

====================================================================

Http::Url - TODO
{
    Request-URI     =   "*" | absoluteURI | abs_path | authority
}

====================================================================

Http::Status
{
    Status-Code     =   "100"                       ; Section 10.1.1: Continue
                    |   "101"                       ; Section 10.1.2: Switching Protocols
                    |   "200"                       ; Section 10.2.1: OK
                    |   "201"                       ; Section 10.2.2: Created
                    |   "202"                       ; Section 10.2.3: Accepted
                    |   "203"                       ; Section 10.2.4: Non-Authoritative Information
                    |   "204"                       ; Section 10.2.5: No Content
                    |   "205"                       ; Section 10.2.6: Reset Content
                    |   "206"                       ; Section 10.2.7: Partial Content
                    |   "300"                       ; Section 10.3.1: Multiple Choices
                    |   "301"                       ; Section 10.3.2: Moved Permanently
                    |   "302"                       ; Section 10.3.3: Found
                    |   "303"                       ; Section 10.3.4: See Other
                    |   "304"                       ; Section 10.3.5: Not Modified
                    |   "305"                       ; Section 10.3.6: Use Proxy
                    |   "307"                       ; Section 10.3.8: Temporary Redirect
                    |   "400"                       ; Section 10.4.1: Bad Request
                    |   "401"                       ; Section 10.4.2: Unauthorized
                    |   "402"                       ; Section 10.4.3: Payment Required
                    |   "403"                       ; Section 10.4.4: Forbidden
                    |   "404"                       ; Section 10.4.5: Not Found
                    |   "405"                       ; Section 10.4.6: Method Not Allowed
                    |   "406"                       ; Section 10.4.7: Not Acceptable
                    |   "407"                       ; Section 10.4.8: Proxy Authentication Required
                    |   "408"                       ; Section 10.4.9: Request Time-out
                    |   "409"                       ; Section 10.4.10: Conflict
                    |   "410"                       ; Section 10.4.11: Gone
                    |   "411"                       ; Section 10.4.12: Length Required
                    |   "412"                       ; Section 10.4.13: Precondition Failed
                    |   "413"                       ; Section 10.4.14: Request Entity Too Large
                    |   "414"                       ; Section 10.4.15: Request-URI Too Large
                    |   "415"                       ; Section 10.4.16: Unsupported Media Type
                    |   "416"                       ; Section 10.4.17: Requested range not satisfiable
                    |   "417"                       ; Section 10.4.18: Expectation Failed
                    |   "500"                       ; Section 10.5.1: Internal Server Error
                    |   "501"                       ; Section 10.5.2: Not Implemented
                    |   "502"                       ; Section 10.5.3: Bad Gateway
                    |   "503"                       ; Section 10.5.4: Service Unavailable
                    |   "504"                       ; Section 10.5.5: Gateway Time-out
                    |   "505"                       ; Section 10.5.6: HTTP Version not supported
                    |   extension-code

    extension-code  =   3DIGIT
    Reason-Phrase   =   *<TEXT, excluding CR, LF>
}


====================================================================

Http::Header
{
    general-header  =   Cache-Control               ; Section 14.9
                    |   Connection                  ; Section 14.10
                    |   Date                        ; Section 14.18
                    |   Pragma                      ; Section 14.32
                    |   Trailer                     ; Section 14.40
                    |   Transfer-Encoding           ; Section 14.41
                    |   Upgrade                     ; Section 14.42
                    |   Via                         ; Section 14.45
                    |   Warning                     ; Section 14.46

    TODO ...


   HTTP/1.1 header field values can be folded onto multiple lines if the
   continuation line begins with a space or horizontal tab. All linear
   white space, including folding, has the same semantics as SP. A
   recipient MAY replace any linear white space with a single SP before
   interpreting the field value or forwarding the message downstream.

       LWS            = [CRLF] 1*( SP | HT )

   ...
   
}

====================================================================

Http::Message
{
    comment         = "(" *( ctext | quoted-pair | comment ) ")"
    ctext           = <any TEXT excluding "(" and ")">

    quoted-string   = ( <"> *(qdtext | quoted-pair ) <"> )
    qdtext          = <any TEXT except <">>
    quoted-pair     = "\" CHAR

    token           = 1*<any CHAR except CTLs or separators>

    TEXT            = <any OCTET except CTLs, but including LWS>

    HEX             = "A" | "B" | "C" | "D" | "E" | "F"
                    | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT


    separators      = "(" | ")" | "<" | ">" | "@"
                    | "," | ";" | ":" | "\" | <">
                    | "/" | "[" | "]" | "?" | "="
                    | "{" | "}" | SP | HT

    LWS             = [CRLF] 1*( SP | HT )

    CRLF            = CR LF

    OCTET           = <any 8-bit sequence of data>
    CHAR            = <any US-ASCII character (octets 0 - 127)>
    UPALPHA         = <any US-ASCII uppercase letter "A".."Z">
    LOALPHA         = <any US-ASCII lowercase letter "a".."z">
    ALPHA           = UPALPHA | LOALPHA
    DIGIT           = <any US-ASCII digit "0".."9">
    CTL             = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
    CR              = <US-ASCII CR, carriage return (13)>
    LF              = <US-ASCII LF, linefeed (10)>
    SP              = <US-ASCII SP, space (32)>
    HT              = <US-ASCII HT, horizontal-tab (9)>
    <">             = <US-ASCII double-quote mark (34)>
}

