In web development, for both client and server testing, it’s often very useful to have a local web server running in order to serve test cases. This post outlines a few quick and easy ways to run a local web server that don’t involve installing Apache or nginx and all their dependencies.
The simplest way I know of to get a local web server is with netcat:
brandon@dexter:~$ nc -l 8000
Then, when you hit the URL http://localhost:8000 in your browser, you will see the request show up on the terminal where netcat is running:
GET / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:6.0a1) Gecko/20110513 Firefox/6.0a1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0
You can then type an arbitrary response back to the browser, terminating the stream with Ctrl+C:
HTTP/1.1 200 OK
Content-Type: text/html
Hello <b>world</b>
^C
The hello world HTML page shows up in your browser as you would expect. You could just as easily use an existing file on your filesystem as input for the response:
brandon@dexter:~$ nc -l 8000 < http_response_file.txt
Another option to consider, especially if you already have test cases or other static content ready to serve, is Python’s SimpleHTTPServer class. You don’t even need to write a script to run one of these servers locally:
brandon@dexter:~$ python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...d
This time, hitting http://localhost:8000 in your browser will bring up a directory listing with your current working directory as the document root. Your requests are also logged on your Python terminal:
localhost - - [16/May/2011 14:55:36] "GET / HTTP/1.1" 200 -
On a separate but related note, you can get a local SMTP testing server, which only logs to the console and doesn’t actually send mail, by running:
$ sudo python -m smtpd -c DebuggingServer -n localhost:25
Password:
---------- MESSAGE FOLLOWS ----------
Content-Type: multipart/alternative;
boundary="===============5376655522220276269=="
MIME-Version: 1.0
Subject: Veracode report for 2013-10-24
From: python.script@example.com
To: recipient@example.org
X-Peer: 127.0.0.1
--===============5376655522220276269==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
= Plain text version =
Hello world!
--===============5376655522220276269==
Content-Type: text/html; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
<html><body>
<h1>HTML Version</h1>
<p>Hello <b>world</b>!</p>
</body></html>
--===============5376655522220276269==--
------------ END MESSAGE ------------