# Module scgi

This module implements helper procs for SCGI applications. Example:

    import strtabs, sockets, scgi

    var counter = 0
    proc handleRequest(client: TSocket, input: string,
                       headers: PStringTable): bool {.procvar.} =
      inc(counter)
      client.writeStatusOkTextContent()
      client.send("Hello for the $#th time." % $counter & "\c\L")
      return false # do not stop processing

    run(handleRequest)

# Imports

sockets, strutils, os, strtabs, asyncio

# Types

    EScgi* = object of EIO

  the exception that is raised, if a SCGI error occurs

    TScgiState* = object of TObject
      server: TSocket
      bufLen: int
      client*: TSocket            ## the client socket to send data to
      headers*: PStringTable      ## the parsed headers
      input*: string              ## the input buffer

  SCGI state object

    TAsyncScgiState* = object of TScgiState
      handleRequest: proc (server: var TAsyncScgiState; client: TSocket;
                           input: string; headers: PStringTable) {.closure.}
      asyncServer: PAsyncSocket

    PAsyncScgiState* = ref TAsyncScgiState

# Procs

    proc scgiError*(msg: string) {.noreturn.}

  raises an EScgi exception with message msg.

    proc open*(s: var TScgiState; port = TPort(4000); address = "127.0.0.1")

  opens a connection.

    proc close*(s: var TScgiState)

  closes the connection.

    proc next*(s: var TScgistate; timeout: int = - 1): bool

  proceed to the first/next request. Waits `timeout` miliseconds for a request, if `timeout` is -1 then this function will never time out. Returns True if a new request has been processed.

    proc writeStatusOkTextContent*(c: TSocket; contentType = "text/html")

  sends the following string to the socket c:

      Status: 200 OK\r\LContent-Type: text/html\r\L\r\L

  You should send this before sending your HTML page, for example.

    proc run*(handleRequest: proc (client: TSocket; input: string;
                                   headers: PStringTable): bool {.nimcall.};
              port = TPort(4000))

  encapsulates the SCGI object and main loop.

    proc open*(handleRequest: proc (server: var TAsyncScgiState; client: TSocket;
                                    input: string; headers: PStringTable) {.closure.};
               port = TPort(4000); address = "127.0.0.1"): PAsyncScgiState

  Alternative of `open` for asyncio compatible SCGI.

    proc register*(d: PDispatcher; s: PAsyncScgiState): PDelegate {.discardable.}

  Registers `s` with dispatcher `d`.

    proc close*(s: PAsyncScgiState)

  Closes the `PAsyncScgiState`.

Generated: 2012-09-23 21:47:54 UTC