Comparison of CGI libraries in C
This is a comparison of publicly available libraries in the C programming language which help to program with CGI, the "common gateway interface" for the world wide web. For more information on the common gateway interface, please see A simple guide to the common gateway interface.
Some of the fields in the following tables are marked as "unknown", "maybe", or given a question mark because I have not had time to evaluate whether the library provides that particular feature. I apologise for the incompleteness of this list and hope that the incomplete list still has some value.
Libraries
The following list of CGI libraries written in C is ordered by the date of the most recent release.
Library name (host) (Links open in a new window) |
Last update | Last version | Licence | Authors | Download |
---|---|---|---|---|---|
cgic (github.com) | 2020-05-27 | 2.07 | Advertising (see site for details) | Thomas Boutrell | Download URL unknown |
kcgi (kristaps.bsd.lv) | 2017-03-12 | 0.9.4 | BSD-like | Kristaps Dzonsons | Download |
qDecoder (wolkykim.github.io) | 2017-01-23 | 12.0.6 | Public domain | Seungyoung Kim | Download |
Lightweight CGI Library (www.infodrom.org) | 2009-02-08 | 0.7 | GNU GPL | Martin Schulze | Download |
cgi-util (www.newbreedsoftware.com) | 2005 | 2.2.1 | GNU Library GPL |
Bill Kendrick Mike Simons |
Download |
CGI-LIB (www.joeldare.com) | 2004 | 2.0 | GNU GPL |
Noel V Aguilar Joel Dare |
Download |
Un-CGI (www.midwinter.com) | 2003-11-01 | 1.11 | Gnu-like, see source code. | Steven Grimm | Download |
cgihtml (www.eekim.com) | 2001-05-25 | 1.69 | Unspecified | Eric E. Kim |
Download (Not working) |
A CGI Library for C (sourceforge.net) | 1999 | 1.0 | GNU GPL or GNU Library GPL | William L. Chatfield | Download |
Features
Basics
C version | Documentation | Automated tests | |
---|---|---|---|
cgic |
ANSI
|
yes (web page) | Maybe |
kcgi | Unknown | yes (manual pages, web pages) | Maybe |
qDecoder | Unknown | yes (web page/doxygen) | no |
Lightweight CGI Library |
GNU C
|
yes (man files) | Maybe |
cgi-util | Unknown | yes (README.txt) | Maybe |
CGI-LIB | Unknown | Maybe | Maybe |
Un-CGI | Unknown | Maybe | Maybe |
cgihtml | Unknown | yes | Maybe |
A CGI Library for C | Unknown | no | Maybe |
HTTP headers
Set content type | Set charset | Set status | Set error message | Add arbitrary HTTP headers | Print header | |
---|---|---|---|---|---|---|
cgic |
cgiHeaderContentType
|
no |
cgiHeaderStatus
|
cgiHeaderStatus
|
no | no |
kcgi | Maybe | Maybe | Maybe | Maybe |
khttp_head
|
Maybe |
qDecoder |
qcgires_SetContentType
|
no | no | no | no | no |
Lightweight CGI Library |
cgiSetType
|
no | no | no |
cgiSetHeader
|
cgiHeader
|
cgi-util | no | no | no | no | no | no |
CGI-LIB | Maybe | Maybe | Maybe | Maybe | Maybe | Maybe |
Un-CGI | Maybe | Maybe | Maybe | Maybe | Maybe | Maybe |
cgihtml |
mime_header
|
no |
status
|
status
|
no |
http_header
|
A CGI Library for C | no | no | no | no | no | no |
Form parsing
process query string | application/x-url-formencoded | multipart/form-data (file upload) | Multiple values for one key | uri escape | uri unescape | |
---|---|---|---|---|---|---|
cgic | yes | yes | yes |
cgiFormStringMultiple
|
no | no |
kcgi | Maybe | Maybe | Maybe | Maybe |
kutil_urlencode
|
Maybe |
qDecoder | yes | yes | yes | Maybe | yes (in qLibc) | yes (in qLibc) |
Lightweight CGI Library | yes | yes | yes |
separated by \n
|
no | no |
cgi-util | yes | yes | yes | no | no |
unescape_url
|
CGI-LIB | Maybe | Maybe | Maybe | Maybe | Maybe | Maybe |
Un-CGI | Maybe | Maybe | Maybe | Maybe | Maybe | Maybe |
cgihtml | yes | yes | yes |
cgi_name_multi
|
no |
unescape_url
|
A CGI Library for C | yes | yes | yes | no | no | no |
Cookies
Read cookies | Set cookies | Create cookie time strings | Delete cookies | |
---|---|---|---|---|
cgic | yes | yes | yes | no |
kcgi | Maybe | Maybe | Maybe | Maybe |
qDecoder | yes |
qcgires_setcookie
|
Maybe |
qcgires_removecookie
|
Lightweight CGI Library | yes | no | no | no |
cgi-util |
cgi_getcookie
|
no | no | no |
CGI-LIB | Maybe | Maybe | Maybe | Maybe |
Un-CGI | Maybe | Maybe | Maybe | Maybe |
cgihtml | yes | yes | no | no |
A CGI Library for C | no | no | no | no |
Extras
html generation | compression | save environment | Redirects | |
---|---|---|---|---|
cgic | no | no |
cgiWriteEnvironment
|
cgiHeaderLocation
|
kcgi | yes |
khttp_body_compress
|
Maybe | Maybe |
qDecoder | no | no | no |
qcgires_redirect
|
Lightweight CGI Library | no | no | no |
cgiRedirect
|
cgi-util | no | no | no | no |
CGI-LIB | Maybe | Maybe | Maybe | Maybe |
Un-CGI | Maybe | Maybe | Maybe | Maybe |
cgihtml | yes | no |
print_cgi_env
|
no |
A CGI Library for C | no | no | no | no |
Key to the tables
No | Does not have this feature |
Maybe | Unknown or not tested |
Yes | Has this feature |
Reviews
These reviews are meant to supplement the tabular information listed above. Most of the CGI libraries listed on this page suffer from very similar problems; none of them has an automated test, almost all of them don't handle HTTP headers fully, and none of them except kcgi handles compression at all.
"cgic" by Thomas Boutrell
★★★☆☆
This library has been around since the 1990s. It is carefully programmed to avoid problems such as memory leaks. It has a lot of documentation for each function. It also comes with example code and a debugging helper to capture the CGI environment.
Its licence requires users to either pay a fee or include
advertising for it in output. The library provides its own
main
function, and users must use something called
cgiMain
instead.
The C programming is a bit questionable. The first thing the library does is to read every possible environment variable into global variables, but most of these it goes on to completely ignore.
"kcgi" by Kristaps Dzonsons
Has documentation including tutorials. Also supports FastCGI protocol. Supports compression. Also has base 64 encoding and MD5 checksums built in.
There are some files called "test*" in the distribution but it's not clear how the tests are run.
The author, Kristaps Dzonsons, has strong opinions about various topics, and using this system involves buying in to the author's opinions.
"qDecoder" by Seungyoung Kim
Has basic CGI library features including parsing forms and setting and deleting cookies. The examples on the web page are written in C++ but the code itself is C. Lacks ways to set the HTTP status or the character set of the page.
One unusual feature is a way to force a download using a
Content-Disposition:
header.
"Lightweight CGI Library" by Martin Schulze
This library appears to be quite difficult to use. The use of C string functions in parsing multipart/form-data is likely to cause problems in the case of binary file uploads with bytes equal to zero.
The web page for this library claims that it supports writing cookies, but I could not see where this was implemented.
"cgi-util" by Bill Kendrick
Mike Simons
This library is not clearly documented, and seems to be somewhat incomplete. For example, it provides nothing to deal with HTTP headers or cookies. On the bright side, it contains a lot of error status checking. It also contains odd-bod functions like an email address validation routine.
"cgihtml" by Eric E. Kim
This library is no longer updated by its author. Its internals refer to ancient bugs of Netscape Navigator and uses cludges to do things like detect whether the browser can accept images. The download no longer works.
"A CGI Library for C" by William L. Chatfield
This library has no documentation. From looking at the code, the main ability seems to be to parse HTML form data. It does not seem to have any output parts.
Web links
-
RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
The specification for the Hypertext Transfer Protocol (HTTP).
- WWW Consortium - Processing form data