Programming Memoirs

Simple Python HTTP server using sockets

I brewed a simple Python-based http server using sockets today and I wanted to share the code, along with some comments. Sure, there is the http.server class, but why not have some fun? :-) Building a fully-fledged HTTP server is a big undertaking. I focused on building a small server, supporting only the basic functionality of the Hyper Text Transfer Protocol (namely the GET and HEAD request methods).

Some basic info

In short, HTTP is a request-response protocol. The web browser attempts to connects to the http server, HTTP server (usually) accepts the connection requests and goes into receiving mode. The client (e.g. web browser) sends one of the nine request methods to the server, along with the methods arguments. Server then processes the request and issues appropriate response. An example request looks like this:

As I have already mentioned, my server support only a GET and HEAD request method. the GET request method request specific a resource from the server. The server responds with headers and the resource body. The HEAD method is similar to GET, it differs in that the server responds only with the headers. This can be useful when a client wants to determine whether e.g. a time stamp on a resource has changed, and whether it has to be re-requested.

I designed by server class to expect a port number on which it is to listen for connection, with a default value of 80.  However you might need to run the server script in a privileged mode in order to successfully acquire this (or any other low) port from your system. Thus, in case the script fails to acquire the default or user provided port, it will attempt to acquire port 8080 as a last resort.

When the client requests a resource, the server attempts to open it from the local www/ folder. If the resource is present, server serves it, accompanied with appropriate headers (status 200 OK). If the resource is not present, the server then serves a error 404 web page, along with a slightly different header set describing the encountered problem.

Notice, that web server does parse in any way the GET arguments if they are provided in the URL (URL encoded arguments, in the form of index.html?arg1=val1&arg2=val2). It does, however, strip them from the URL, if they are present and servers the resource. Also note that this server runs only a single thread, thus serving one user at a time. The server is not meant to be fast nor secure. I must say that coding this server made for fun-filled afternoon. If I will have some free time in the future maybe I will extend it’s functionality a bit.

Example request-reply

Sample HEAD request to my server issued by Firefox

HEAD /index.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3
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
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

The most important is the first line. It specifies the request method (HEAD) and it’s arguments, most notably the file which is being requested. The second lines specifies the internet host and port of the resource requested. Lack of port following the local host implies port 80. More on the following lines can be found here. Response

Sample response headers sent from the server to the client:

HTTP/1.1 200 OK
Date: Sat, 19 Mar 2011 16:42:17
Server: Simple-Python-HTTP-Server
Connection: close

Notice, that it’s only basic response, containing only some basic information — most notably the first line, confirming that the requested resource exists. For the contrast, here is a sample response header from the server after the client had requested a non-existing resource:

HTTP/1.1 404 Not Found
Date: Sat, 19 Mar 2011 16:44:53
Server: Simple-Python-HTTP-Server
Connection: close

Final HTTP server code

And now for the code. Oh, and here’s the code along with some simple html/css/jpg files for testing: python-http-server.tar.gz. Also, you might want to check out some kind of a browser plugin which allows to issue custom HTTP request methods and view the response, such as this one.


import socket  # Networking support
import signal  # Signal support (server shutdown on signal receive)
import time    # Current time

class Server:
 """ Class describing a simple HTTP server objects."""

 def __init__(self, port = 80):
     """ Constructor """ = ''   # <-- works on all avaivable network interfaces
     self.port = port
     self.www_dir = 'www' # Directory where webpage files are stored

 def activate_server(self):
     """ Attempts to aquire the socket and launch the server """
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     try: # user provided in the __init__() port may be unavaivable
         print("Launching HTTP server on ",, ":",self.port)
         self.socket.bind((, self.port))

     except Exception as e:
         print ("Warning: Could not aquite port:",self.port,"\n")
         print ("I will try a higher port")
         # store to user provideed port locally for later (in case 8080 fails)
         user_port = self.port
         self.port = 8080

             print("Launching HTTP server on ",, ":",self.port)
             self.socket.bind((, self.port))

         except Exception as e:
             print("ERROR: Failed to acquire sockets for ports ", user_port, " and 8080. ")
             print("Try running the Server in a privileged user mode.")
             import sys

     print ("Server successfully acquired the socket with port:", self.port)
     print ("Press Ctrl+C to shut down the server and exit.")

 def shutdown(self):
     """ Shut down the server """
         print("Shutting down the server")

     except Exception as e:
         print("Warning: could not shut down the socket. Maybe it was already closed?",e)

 def _gen_headers(self,  code):
     """ Generates HTTP response Headers. Ommits the first line! """

     # determine response code
     h = ''
     if (code == 200):
        h = 'HTTP/1.1 200 OK\n'
     elif(code == 404):
        h = 'HTTP/1.1 404 Not Found\n'

     # write further headers
     current_date = time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())
     h += 'Date: ' + current_date +'\n'
     h += 'Server: Simple-Python-HTTP-Server\n'
     h += 'Connection: close\n\n'  # signal that the conection wil be closed after complting the request

     return h

 def _wait_for_connections(self):
     """ Main loop awaiting connections """
     while True:
         print ("Awaiting New connection")
         self.socket.listen(3) # maximum number of queued connections

         conn, addr = self.socket.accept()
         # conn - socket to client
         # addr - clients address

         print("Got connection from:", addr)

         data = conn.recv(1024) #receive data from client
         string = bytes.decode(data) #decode it to string

         #determine request method  (HEAD and GET are supported)
         request_method = string.split(' ')[0]
         print ("Method: ", request_method)
         print ("Request body: ", string)

         #if string[0:3] == 'GET':
         if (request_method == 'GET') | (request_method == 'HEAD'):
             #file_requested = string[4:]

             # split on space "GET /file.html" -into-> ('GET','file.html',...)
             file_requested = string.split(' ')
             file_requested = file_requested[1] # get 2nd element

             #Check for URL arguments. Disregard them
             file_requested = file_requested.split('?')[0]  # disregard anything after '?'

             if (file_requested == '/'):  # in case no file is specified by the browser
                 file_requested = '/index.html' # load index.html by default

             file_requested = self.www_dir + file_requested
             print ("Serving web page [",file_requested,"]")

             ## Load file content
                 file_handler = open(file_requested,'rb')
                 if (request_method == 'GET'):  #only read the file when GET
                     response_content = # read file content

                 response_headers = self._gen_headers( 200)

             except Exception as e: #in case file was not found, generate 404 page
                 print ("Warning, file not found. Serving response code 404\n", e)
                 response_headers = self._gen_headers( 404)

                 if (request_method == 'GET'):
                    response_content = b"<html><body><p>Error 404: File not found</p><p>Python HTTP server</p></body></html>"

             server_response =  response_headers.encode() # return headers for GET and HEAD
             if (request_method == 'GET'):
                 server_response +=  response_content  # return additional conten for GET only

             print ("Closing connection with client")

             print("Unknown HTTP request method:", request_method)

def graceful_shutdown(sig, dummy):
    """ This function shuts down the server. It's triggered
    by SIGINT signal """
    s.shutdown() #shut down the server
    import sys

# shut down on ctrl+c
signal.signal(signal.SIGINT, graceful_shutdown)

print ("Starting web server")
s = Server(80)  # construct server object
s.activate_server() # aquire the socket

7,266 ResponsesLeave one →

  1. [url=]zovirax 15g[/url]

  2. Kosmalaflilecy

     /  2021/12/15


  3. [url=]ivermectin cream[/url]

  4. [url=]bouzine[/url]

  5. [url=]drug prices sildenafil[/url]

  6. gfdtkrfflilecy

     /  2021/12/12


  7. [url=]tadalafil over the counter usa[/url]

  8. [url=]trazodone hcl 50 mg[/url]

  9. [url=]best tadalafil generic[/url]

  10. [url=][/url]

  11. Приглашаем к сотрудничеству транспортные компании на совместную поставку грузовых шин 315 80 R22.5 премиального класса от производителя [url=]Shandong HAOHUA Tire Co., Ltd.[/url]

  12. [url=]таможенное оформление грузов[/url]

  13. If you would like hookup with a girl online, you’ll find that there are many different professional services offered [url=]this article[/url] that enable you to seek out and make contact with a female. You can get the sort of dating lover you’re seeking and commence searching user profiles for that perfect match. Some of the most well-known web sites are and These websites offer advice for men and women. Additionally they supply facts about how and where to meet a particular young lady.

    Some internet sites will likely allow you to chat with a lady that you’re thinking about. These totally free hookup websites allow users to look through a huge number of profiles and give close friend needs to those they’re considering. Using this method, you could make the choice based all on your own tastes. Some of these websites will even have video talk options that you can view their looks. These types of services are a fun way to hookup with women online.

    If you’re searching for a place to chitchat and hookup by using a lady, you can try websites offering cost-free superior accounts. The benefit of these internet websites is simply because they are anonymous and get substantial success costs. Most of them have are living cam features plus a 24-hour or so holding out period. They’re also ideal for getting a time inside your metropolis. If you’re looking for a lady in a hurry, you can pick a online dating website that is certainly convenient to suit your needs.

    There are several good reasons to hookup with females on-line. If you’re looking for a lover who offers the same sexual choices as you do, these internet sites are fantastic for you. Some of them even provide sexual intercourse ideas along with other info which will help you will be making your quest easier. Whether you’re looking for a partner or just to get fun, you’ll obtain the perfect partner online. It’s as elementary as that.

    There are a number of ways to satisfy ladies on the internet. Start by searching for single girls in the area who are interested in the identical stuff when you. These sites are simple to use and sometimes supply persona checks. If you’re a man, you should look at a free dating online internet site. Most free websites are merely frauds. There’s a wide range of various web sites where you may link up with other individuals. Once you find the right woman, it’s time for you to chitchat!

    Many men have found that meeting females online is increasingly simple. You can also talk to a lady who’s interested in your passions, without the need of risking your security. A lady may well be a excellent in shape for yourself if she’s thinking about guys using the same passions while you. An important feature about dating online is that you can fulfill females who are able to time you. It’s a terrific way to familiarize yourself with women that reveal a similar targets and ideals.

  14. [url=]sildenafil discount prices[/url]

  15. [url=]where to buy azithromycin over the counter[/url]

  16. [url=]dexamethasone 1.5 mg[/url]

  17. Nataliyaflilecy

     /  2021/12/03


  18. [url=]30 mg sildenafil chewable[/url]

  19. [url=]buy ivermectin for humans uk[/url]

  20. [url=]ivermectin gel[/url]

  21. [url=]ivermectin uk[/url]

  22. [url=][/url]

  23. [url=]buy ivermectin cream for humans[/url]

  24. [url=]sildenafil cost compare 100 mg[/url]

  25. [url=]sildenafil uk[/url]

  26. [url=]sildenafil usa[/url]

  27. pashataflilecy

     /  2021/11/21


  28. [url=]stromectol sales[/url]

  29. [url=]where to buy ivermectin pills[/url]

  30. Alessandraflilecy

     /  2021/11/18


  31. [url=]ivermectin over the counter[/url]

  32. [url=]vardenafil price[/url]

  33. [url=]скрытая дверь[/url]

  34. [url=]ivermectin australia[/url]

  35. [url=]ivermectin human[/url]

  36. [url=]erectafil 5[/url]

  37. [url=][img][/img][/url]

    Billie [url=]Eilish[/url] – No Time To Die (Live From The BRIT Awards, London)

  38. [url=]stromectol 3mg cost[/url]

  39. [url=]sildenafil citrate 50mg tab[/url]

  40. [url=]stromectol oral[/url]

  41. [url=]stromectol for humans[/url]

  42. nym121944tetcher

     /  2021/11/07

    mks121944uttjr L0Iq95S nbAo AM2i58Z

  43. [url=]Геленджик-Кабардинка[/url]

  44. [url=]tadalafil for sale online[/url]

  45. [url=]where to buy tadalafil 7.5mg[/url]

  46. [url=]generic for singulair[/url]

  47. [url=]sildenafil 100mg from india[/url]

  48. [url=]работа досуг спб[/url]

  49. [url=]generic advair online[/url]

  50. [url=]best sildenafil 20mg coupon[/url]


Leave a Reply