One app, one web server
apache.c:
if (page == "/loginform.html") {
sendfile("templates/loginform.html");
} else if (page == "/profile.html") {
printf("Status: 200 OK\r\n");
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("<h1>Hello %s</h1>", user);
Generate responses with an external process
Web server does:
$ export REQUEST_URI="/loginform.asp"
$ ./mycgi.exe
Status: 200 OK
Content-Type: text/html
<h1>Please login</h1>
<form action="/dologin">
...
Requests are passed through envp and stdin
int main(int argc, char **argv, char **envp){
int len = atoi(getenv("CONTENT_LENGTH"));
char *req = malloc(len);
read(STDIN_FILENO, len, req);
{'u','s','e','r','=','m','i','k','e','6','9','&'
'p','a','s','s','=','t','h','r','i','l','l','7'}
HTTP GET query string
char *query = getenv("QUERY_STR");
Which page was requested?
char *uri = getenv("REQUEST_URI");
HTTP POST vars? File uploads?
fread(buf, count, 1, stdin);
Decouples web server from web app
No more embedded:
Spawn a new process for each request?
$ export REQUEST_URI="/loginform.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/login.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/profile.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/deleteprofile.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/redirect.asp"
$ ./mycgi.exe
Advantages:
Fast:
$ ./myfcgi.exe
Listening on 127.0.0.1:1337
For each request, web server:
127.0.0.1:1337
or
/tmp/myapp.sock
or
192.168.1.{90,91,92}:1337
SCGI - Simple Common Gateway Interface
WSGI - Web Server Gateway Interface
PSGI - Perl Server Gateway Interface
ISAPI - Internet Server Application Programming Interface
Simple
Simple protocol
New (2006)
Not widely used
Web Server Gateway Interface
Made for Python
They don’t care about everyone else
Perl Server Gateway Interface
Made for Perl
They don’t care about everyone else
Internet Server API
Made by Microsoft
They don’t care about everyone else
Uses DLLs and OS services, much tighter coupling
Every major webserver can forward requests over FastCGI
Every major language can respond to FastCGI requests
Any questions?