Next: , Previous: big-dishing-loop, Up: Top


8 (www server-utils parse-request)

The (www server-utils parse-request) module provides procedures to read the first line, the headers and the body, of an HTTP message on the input port.

— Procedure: receive-request port [keyword value...]

          Keywords: s2s, style

Return a request object read from port. Use s2s (defaults to string-titlecase) to normalize the header names. With #:s2s string-downcase, for instance, you would see (host . "example.com") in the headers field of the request object.

Keyword arg style is an object specifying the syntax of the initial (non-body) portion. By default, parse expects a normal HTTP 1.1 request message as per RFC 2616.

— Type: request

A request object has five fields.

method
A symbol, such as GET.
upath
A string. You can use hqf<-upath and alist<-query to break this down further.
protocol-version
A pair of integers indicating the protocol version. For example, (1 . 1) corresponds to HTTP 1.1.
headers
A list of pairs (name . value), aka alist, where name is a symbol and value is a string. How name is normalized depends on which s2s was specified to receive-request.
body
Either #f or a procedure get-body. This should be called with one arg, flags, to retrieve the request body. See http, procedure receive-response, for flags documentation.

— Procedure: request? obj

Return #t if obj is a request object.

— Procedure: request-method req
— Procedure: request-upath req
— Procedure: request-protocol-version req
— Procedure: request-headers req
— Procedure: request-body req

Return the respective field of request object req.

— Procedure: hqf<-upath upath

Parse string upath and return three values representing its hierarchy, query and fragment components. If a component is missing, its value is #f.

          (hqf<-upath "/aa/bb/cc?def=xyz&hmm#frag")
          ⇒ "/aa/bb/cc"
          ⇒ "def=xyz&hmm"
          ⇒ "frag"
          
          (hqf<-upath "/aa/bb/cc#fr?ag")
          ⇒ "/aa/bb/cc"
          ⇒ #f
          ⇒ "fr?ag"
— Procedure: alist<-query query-string

Parse urlencoded query-string and return an alist. For each element (name . value) of the alist, name is a string and value is either #f or a string.

NB: The following four procedures will NO LONGER BE AVAILABLE after 2013-02-28. Better to use receive-request.

— Procedure: read-first-line port

Parse the first line of the HTTP message from input port and return a list of the method, URL path and HTTP version indicator, or #f if the line ends prematurely or is otherwise malformed. A successful parse consumes the trailing ‘CRLF’ of the line as well. The method is a symbol with its constituent characters upcased, such as GET; the other elements are strings. If the first line is missing the HTTP version, parse-first-line returns the default "HTTP/1.0".

— Procedure: read-headers port

Parse the headers of the HTTP message from input port and return a list of key/value pairs, or #f if the message ends prematurely or is otherwise malformed. Both keys and values are strings. Values are trimmed of leading and trailing whitespace and may be empty. Values that span more than one line have their "continuation whitespace" reduced to a single space. A successful parse consumes the trailing ‘CRLF’ of the header block as well.

Sometimes you are interested in the body of the message but not the headers. In this case, you can use skip-headers to quickly position the port.

— Procedure: skip-headers port

Scan without parsing the headers of the HTTP message from input port, and return the empty list, or #f if the message ends prematurely. A successful scan consumes the trailing ‘CRLF’ of the header block as well.

— Procedure: read-body len port

Return a new string of len bytes with contents read from input port.