library has some useful examples, and it supports just about everything including file uploads. It is also in the public domain, so you can use it in any project you like.
The Common Gateway Interface
itself is specified in RFC 3875, I believe, but all implementations (like Apache mod_cgi
) have their differences or extensions, and do behave a bit differently on Windows than on sane OSes, so you'd better rely on that documentation -- and experimentation.
A decade ago the libraries were chock full of fixes for browser bugs. Especially Internet Explorer POST data tended to be all kinds of wonky. I'm not up to date on this, but I'd guess things have stabilized a lot. To really find out, you'd have to dive into e.g. PHP sources, and look at the POST data parsing to see if there are still workarounds applied to browser bugs.
If you are thinking about using C for CGI programming, I'd recommend you pretty quickly move on to FastCGI
, perhaps using Apache mod_fcgid
. It can provide much higher performance in high-load cases. FastCGI is a separate protocol to CGI, and has some important differences. For example, each process can/should respond to multiple (unrelated) queries, instead of existing only to serve one request. The approach is different.
After a quick search, I only found fastcgi
C++ library (download
), plus the old devkit at fastcgi.com
(but check the license terms first
Currently, programming languages like Python tend to be fast enough to be used for very high volume sites, especially if using FastCGI, so C/C++ CGI/FastCGI programming is a rare thing. Personally, I've considered writing an efficient image upload tool that would use a dedicated user account and automatically generate thumbnail versions of the image -- but it turns out using Python or even PHP via mod_fcgid+SuEXEC makes more sense in the long term. One must consider the maintenance effort needed, too.
I might re-examine that if I ever work with an embedded device with say Nginx, and need a reliable, small-footprint uploader without a full scripting language installation -- but otherwise I think I'll use Python for something like this.
Hope this helps,