Simple Common Gateway Interface
This article needs additional citations for verification. (October 2017) |
The Simple Common Gateway Interface (SCGI) is a protocol for applications to interface with HTTP servers, as an alternative to the CGI protocol. It is similar to FastCGI but is designed to be easier to parse. Unlike CGI, it permits a long-running service process to continue serving requests, thus avoiding delays in responding to requests due to setup overhead (such as connecting to a database).
SCGI is a protocol which defines communication between a web server and an application server. This is in contrast to CGI, which is an earlier application (gateway) interface designed to let the application programmer avoid the complexity of sockets and long-running service processes when poor scalability and high overhead are acceptable.
The SCGI protocol leverages the fact that the web server has already parsed and validated the HTTP request, and canonically communicates the request to the SCGI server while letting the application programmer avoid parsing ambiguities and protocol edge cases. This avoids the complicated header-parsing and header-combining rules from RFC 2616, saving significant complexity in the SCGI server process.
History
Neil Schemenauer published the original SCGI protocol specification dated October 2001.[1] He developed the first implementations of SCGI and initially published them in April 2002.[2]
Specification
The client connects to a SCGI server over a reliable stream protocol allowing transmission of 8-bit bytes. The client begins by sending a request. When the SCGI server sees the end of the request it sends back a response and closes the connection. The format of the response is not specifically specified by this protocol, although CGI-equivalent HTTP responses are generally used.[note 1]
Request format
A SCGI request is the concatenation of netstring-encoded headers and a body. A SCGI response is a normal HTTP response.
Each header consists of a name–value pair, where both the name and the value are null-terminated strings (C strings). The value can be an empty string, in which case the terminating null still remains. Neither name nor value can contain any embedded null bytes. These considerations are standard for C strings, but are often confusing for programmers used to other standards for string-handling.
All provided headers are concatenated to form a single byte sequence, then netstring-encoded. The raw body, if any, is then appended.
Duplicate names are not allowed in the request headers; RFC 2616-compliant header combining[note 2] must already have taken place. The first request header must have the name "CONTENT_LENGTH" and a value that is the length of the body in decimal. The "CONTENT_LENGTH" request header must always be present, even if its value is "0". There must also always be a request header with the name "SCGI" and a value of "1". Standard CGI environment variables should be provided in SCGI headers for compatibility when converting older CGI programs to SCGI. The body (if any) provided in the request follows the headers; its length is specified by the "CONTENT_LENGTH" request header.
While the SCGI protocol insulates the service programmer from some HTTP considerations, various details (such as interpreting the octets of the message body as per the Transfer-Encoding header, the CONTENT_LENGTH being the number of octets after the body has been encoded for transmission, etc.) still require knowledge of the HTTP protocol specification.
Example
The web server (a SCGI client) opens a connection and sends the concatenation of the following strings to the service process (a SCGI server):
"70:" "CONTENT_LENGTH" <00> "27" <00> "SCGI" <00> "1" <00> "REQUEST_METHOD" <00> "POST" <00> "REQUEST_URI" <00> "/deepthought" <00> "," "What is the answer to life?"
The SCGI server sends the following response back to the web server:
"Status: 200 OK" <0d 0a> "Content-Type: text/plain" <0d 0a> "" <0d 0a> "42"
The SCGI server closes the connection.
Web servers that implement SCGI
(this list is not complete)
- Apache HTTP Server
- Cherokee
- Lighttpd
- Microsoft Internet Information Services with ISAPI SCGI extension
- nginx
- Althttpd[3]
Language bindings for the SCGI API
SCGI can be implemented in any language that supports network sockets and netstrings. The following is a partial list of languages with known SCGI bindings:
- Cobra
- D, with the arsd.cgi library
- Emacs Lisp, with the url-scgi library
- Go, with the scgi package
- Haskell
- Java, with the SCGI connector or with the [1] library
- Lisp
- Perl, with the SCGI package or Plack framework
- PHP
- Python
- Racket, with the scgi library
- Ruby
- Rust, with the tokio-scgi crate
- Scheme
- Tcl
- Nim
See also
Application/Gateway protocols:
- Common Gateway Interface(CGI) - Launches a child process per request
- FastCGI - Attempts to increase scalability by supporting long-running CGI-like processes
- Apache JServ Protocol - A binary protocol intended to proxy requests between a web server and an application server.
Application hosts (language-specific):
- Rack - Ruby web server interface
- PSGI - Perl Web Server Gateway Interface
- WSGI - Python Web Server Gateway Interface
- JSGI – JavaScript web server gateway interface
Notes
- 1.^ The specification document was placed in the public domain by Neil Schemenauer on 12 January 2006.
- 2.^ For HTTP header combining, see RFC2616 section 4.2.
References
- ^ Schemenauer, Neil (October 30, 2001). "SCGI: A Simple Common Gateway Interface alternative". Archived from the original on 2002-04-03.
- ^ "scgi-0.1.tar.gz". Index of /software/files/scgi. MNX: MEMS and Nanotechnology Exchange. April 12, 2002. Archived from the original on 2002-10-20.
- ^ "Althttpd: The Althttpd Webserver". sqlite.org. Retrieved 19 May 2023.