Chris Alexander

On Engineering

A Webserver in 50 lines of code

15th April, 2010

I’ve been playing with python over the past few days, and have grown quite attached to it.

A number of features, such as ranges and the separation of lists and dictionaries, have endeared the language and it makes a lot of sense.

I thought I would have a bit of fun with it, and see how hard it was to write a web server. This may seem like a big step, but when you consider that reading from a URL is as simple as reading from a file in python, it is not a daunting task.

I managed to find a tutorial online, and after a bit of tinkering I got out a web server that responds to HTTP GET requests and serves files (not dynamically!) in just 50 lines of code (including my somewhat liberal whitespace - this indentation thing is taking a bit of getting used to).

Here’s my server in 50 lines of code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/python

#
# A simple web server
#

import sys, string, cgi, time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class MyServer(BaseHTTPRequestHandler):

def ca_serve_file(self):
try:
f = open(curdir + sep + self.path, 'r')

self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(f.read())
f.close()

except IOError:
self.send_error(404, 'File not found: %s' % self.path)

def do_GET(self):
try:
if self.path == '/':
self.path = 'index.html'

self.ca_serve_file()

return

except IOError:
self.send_error(404, 'File not found: %s' % self.path)

def main():
try:
server = HTTPServer(('',8080), MyServer)
print 'Started HTTP server'
server.serve_forever()
except KeyboardInterrupt:
print 'Shutting down...'
server.socket.close()

if __name__ == '__main__':
main()