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:1.9.2.3) 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.

#!/usr/bin/python

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 """
     self.host = ''   # <-- 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.host, ":",self.port)
         self.socket.bind((self.host, 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

         try:
             print("Launching HTTP server on ", self.host, ":",self.port)
             self.socket.bind((self.host, 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.")
             self.shutdown()
             import sys
             sys.exit(1)

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

 def shutdown(self):
     """ Shut down the server """
     try:
         print("Shutting down the server")
         s.socket.shutdown(socket.SHUT_RDWR)

     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
             try:
                 file_handler = open(file_requested,'rb')
                 if (request_method == 'GET'):  #only read the file when GET
                     response_content = file_handler.read() # read file content
                 file_handler.close()

                 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

             conn.send(server_response)
             print ("Closing connection with client")
             conn.close()

         else:
             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
    sys.exit(1)

###########################################################
# 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

6,631 ResponsesLeave one →

  1. [url=http://celebrexotc.com/]buy celebrex[/url] [url=http://diflucan5.com/]diflucan generic over the counter[/url]

    Reply
  2. [url=https://oldictuihampe.ml]adult webcam video [/url]
    [url=https://asbacombuybrin.ga]adult webcam forum [/url]

    Reply
  3. adult webcam.com
    [url=https://idunarproph.ml]idunarproph[/url]
    adult webcam chat site
    [url=https://caphapupolas.ga]caphapupolas.ga[/url]
    adult webcam software

    Reply
  4. [url=http://avodartgen.com/]avodart australia[/url] [url=http://sildenafilvg.com/]sildenafil cost india[/url] [url=http://furosemide1.com/]furosemide 20mg tablets cost[/url] [url=http://sildenafilgen.com/]buy sildenafil[/url]

    Reply
  5. [url=http://furosemidelab.com/]medicine furosemide 40 mg[/url] [url=http://zoloft24.com/]zoloft 200 mg pill[/url]

    Reply
  6. [url=https://newsrus.website/]новости района[/url]
    [url=https://newsrus.website/]смотреть новости прямой эфир[/url]
    [url=https://newsrus.website/]тв новости россии[/url]
    [url=https://newsrus.website/]новости воронежа сегодня[/url]
    [url=https://newsrus.website/]борис моисеев последние новости[/url]

    новосибирские новости
    кудрявцева новости
    рамблер новости главное
    майл почта новости
    часы новости россия

    Reply
  7. [url=http://furosemidetab.com/]furosemide pill[/url]

    Reply
  8. [url=https://wratotadaper.ml]wratotadaper.ml[/url]

    Reply
  9. [url=http://tadalafilcia.com/]tadalafil 20mg coupon[/url]

    Reply
  10. [url=https://mepanebalma.gq]mepanebalma.gq[/url]
    [url=https://specisrelas.tk]specisrelas.tk[/url]
    [url=https://arthevavul.tk]arthevavul.tk[/url]
    [url=https://tonewasge.cf]tonewasge.cf[/url]
    [url=https://tretinlumsuppfink.ml]tretinlumsuppfink.ml[/url]

    Reply
  11. [url=http://avodartgen.com/]avodart generic[/url]

    Reply
  12. [url=https://spacfosadmona.ga]spacfosadmona.ga[/url]
    [url=https://lapifimuzcu.cf]lapifimuzcu.cf[/url]
    [url=https://tracpekesec.tk]tracpekesec.tk[/url]
    [url=https://taihoppivir.gq]taihoppivir.gq[/url]
    [url=https://nitlindpretfu.tk]big titted milf pics [/url]

    Reply
  13. [url=https://arimidexsale.com/]best price for arimidex[/url]

    Reply
  14. [url=https://furosemide1.com/]furosemide lasix 20 mg[/url]

    Reply
  15. [url=https://fectfeedveoraibreech.tk]fectfeedveoraibreech.tk[/url]
    [url=https://lingtelgerenor.ml]lingtelgerenor.ml[/url]
    [url=https://rianivaha.tk]live sex chat korean [/url]
    [url=https://mogrentvenscu.gq]mogrentvenscu.gq[/url]
    [url=https://hotchfuddnawahm.tk]hotchfuddnawahm.tk[/url]

    Reply
  16. [url=https://maudodomisink.ml]maudodomisink.ml[/url]
    [url=https://profapsilessse.ga]profapsilessse.ga[/url]
    [url=https://seepodenno.cf]seepodenno.cf[/url]
    [url=https://trafnaenyti.tk]trafnaenyti.tk[/url]
    [url=https://winbutali.tk]winbutali.tk[/url]

    Reply
  17. [url=http://fluoxetine1000.com/]fluoxetine 20 mg capsule[/url]

    Reply
  18. [url=https://raecompteattouta.cf]things to do when dating someone new online [/url]
    [url=https://burdererode.cf]homemoviestube mature amateur couple [/url]
    [url=https://concafentiorans.gq]concafentiorans.gq[/url]
    [url=https://dwaremucox.tk]dwaremucox.tk[/url]
    [url=https://dtourucupqamold.tk]dtourucupqamold.tk[/url]

    Reply
  19. Avoid consuming grapefruit juice as it has actually been stated to interact with [url=https://tadalafilx.com/]tadalafil 5mg india[/url] making it less efficient. Abrupt loss of vision is just one of many severe negative side effects of Tadalafil that is nonetheless fairly unusual.

    Reply
  20. Tadalafil is a well-liked medicine for impotence therapy readily available just by prescribed. [url=https://tadalafilerec.com/]tadalafil[/url] is very prominent due to a few mild negative effects it often causes (muscular tissue discomfort, flushing, looseness of the bowels, cough, discomfort in the tummy, hassle, acid indigestion, and heartburn ( pyrosis )) and lengthiest duration of performance – 36 hrs.

    Reply
    • Jameswrask

       /  2020/06/18

      Знаете ли вы?
      Преподаватель нескольких университетов, попавший в сталинские лагеря, и там умудрился обучать математике на куске мыла.
      Член Зала хоккейной славы готов был играть где угодно, лишь бы не переходить в тренеры.
      Мама и четверо детей снимают фильмы о своей жизни во время войны.
      Индонезийской закуской начиняют пирожки, посыпают рис и кладут в лапшу и супы.
      Сын политика-пьяницы помог принять сухой закон в своей провинции.

      [url=http://0pb8hx.com/]http://www.0pb8hx.com/[/url]

      Reply
  21. [url=https://diflucan5.com/]diflucan 150 mg[/url]

    Reply
  22. [url=http://fluoxetine1000.com/]fluoxetine 30 mg[/url] [url=http://prednisonester.com/]prednisone 5 mg[/url] [url=http://albuterol365.com/]generic albuterol[/url] [url=http://metformin360.com/]metformin 850mg[/url]

    Reply
  23. [url=http://tadalafilcia.com/]tadalafil generic online[/url]

    Reply
  24. [url=http://mi.minfish.com/home.php?mod=space&uid=164668]mi.minfish.com[/url]
    [url=http://conetchina.com/home.php?mod=space&uid=618]conetchina.com[/url]
    [url=http://www.littlefx.com/member.php?24668-AllenViege]littlefx.com[/url]
    [url=https://assuremoving.in/forum/profile.php?id=626670]assuremoving.in[/url]
    [url=http://www.littlefx.com/member.php?24464-Michaelbut]littlefx.com[/url]
    [url=http://lsjyy3800.com/space-uid-296478.html]lsjyy3800.com[/url]
    [url=https://www.ffcd.net/members/23293-Allenbob]ffcd.net[/url]
    [url=https://www.otrforum.com/member.php?315059-Maurodig]otrforum.com[/url]
    [url=http://yuanru.net/home.php?mod=space&uid=138805]yuanru.net[/url]
    [url=http://zhengulao.com/discuz/home.php?mod=space&uid=7747]zhengulao.com[/url]
    [url=http://david1973.m5yun.mydnns.com/home.php?mod=space&uid=169537]david1973.m5yun.mydnns.com[/url]
    [url=http://rechargeablebatteryforum.com/home.php?mod=space&uid=32914]rechargeablebatteryforum.com[/url]
    [url=http://hnssnf.com/honeychina/home.php?mod=space&uid=65879]hnssnf.com[/url]
    [url=http://ics.org.ru/communication/forum/user/421522/]ics.org.ru[/url]
    [url=https://build.co.ua/wr_board/tools.php?event=profile&pname=Maurobowly]build.co.ua[/url]
    [url=http://goodyblythe.com/home.php?mod=space&uid=280427]goodyblythe.com[/url]
    [url=http://www.goslask1939.pl/forum/member.php?action=profile&uid=6126]goslask1939.pl[/url]
    [url=http://chnlinghang.com/home.php?mod=space&uid=5211]chnlinghang.com[/url]
    [url=https://forum.openbadania.pl/memberlist.php?mode=viewprofile&u=12697]forum.openbadania.pl[/url]
    [url=http://chtp.xyz/home.php?mod=space&uid=541061]chtp.xyz[/url]
    [url=https://www.latinquasar.org/smf/index.php?action=profile;u=21067]latinquasar.org[/url]
    [url=http://shengduoduo.cc/space-uid-235850.html]shengduoduo.cc[/url]
    [url=http://bbs.ebnew.com/home.php?mod=space&uid=485237]bbs.ebnew.com[/url]
    [url=http://fangweibing.d1v1.com/home.php?mod=space&uid=708985]fangweibing.d1v1.com[/url]
    [url=http://sanmaobbs.com/home.php?mod=space&uid=81307]sanmaobbs.com[/url]

    Reply
  25. [url=http://albuterolf5h.com/]albuterol[/url]

    Reply
  26. [url=https://avodartgen.com/]avodart generic[/url]

    Reply
  27. [url=http://vardenafill.com/]vardenafil generic[/url] [url=http://furosemidetab.com/]furosemide cost[/url] [url=http://amoxicillincaps.com/]amoxicillin 500 mg price[/url]

    Reply
  28. [url=https://wratotadaper.ml]wratotadaper.ml[/url]

    Reply
  29. [url=http://albuterol365.com/]can you buy albuterol over the counter[/url] [url=http://zoloft24.com/]400 mg zoloft[/url] [url=http://prednisonester.com/]prednisone 20 mg[/url] [url=http://tadalafilcia.com/]purchase tadalafil[/url] [url=http://furosemide1.com/]furosemide 20 mg[/url] [url=http://furosemidetab.com/]furosemide 200 mg[/url] [url=http://albendazole365.com/]albendazole 400 mg[/url]

    Reply
  30. [url=http://albuterol0i0.com/]albuterol generic[/url]

    Reply
  31. [url=https://sildenafilgen.com/]sildenafil 100mg[/url]

    Reply
  32. [url=http://albuterol.us.org]albuterol online[/url] [url=http://ventolin.us.org]ventolin.us.org[/url] [url=http://wellbutrin-abc.com]wellbutrin-abc.com[/url] [url=http://buymetformin.us.org]cheap metformin[/url] [url=http://flagyl.us.com]generic flagyl[/url]

    Reply
  33. [url=https://vardenafill.com/]vardenafil price comparison[/url]

    Reply
  34. [url=https://viltinigit.tk]viltinigit.tk[/url]
    [url=https://bingmipedinsmet.ml]free femdom dating site [/url]

    Reply
  35. [url=https://viltinigit.tk]cited work essay video sample [/url]
    [url=https://clecriarethewal.tk]clecriarethewal.tk[/url]

    Reply
  36. [url=https://deaucongtaskeva.ga]deaucongtaskeva.ga[/url]
    [url=https://propesbalhia.cf]propesbalhia.cf[/url]
    [url=https://borwestnipotlue.tk]borwestnipotlue.tk[/url]
    [url=https://vasareathira.cf]vasareathira.cf[/url]
    [url=https://ereccheby.tk]how to end research essay [/url]
    [url=https://thierunboyper.gq]online dating free 100% [/url]
    [url=https://deaucongtaskeva.ga]good transition phrases for gre essay [/url]
    [url=https://unosparmesuf.cf]unosparmesuf.cf[/url]
    [url=https://flavdisflighdoka.ml]flavdisflighdoka.ml[/url]
    [url=https://idfaqualcaner.cf]idfaqualcaner.cf[/url]
    [url=https://conhacalboygend.cf]toefl writing essay sample responses [/url]
    [url=https://toubzaterfemu.tk]austin best speed dating reddit [/url]
    [url=https://ereccheby.tk]400 word essay about football [/url]
    [url=https://pashyceno.tk]best dating websites for young adults [/url]
    [url=https://ereccheby.tk]ereccheby.tk[/url]
    [url=https://quitraveter.ml]to ten free dating sites in austin texas [/url]

    Reply
  37. [url=https://emomenyg.tk]using schmoop to write an essay [/url]
    [url=https://consrmulpase.tk]online dating asking career [/url]

    Reply
  38. [url=https://flavdisflighdoka.ml]how to sight a source in an essay [/url]
    [url=https://stansessphorili.gq]stansessphorili.gq[/url]
    [url=https://viltinigit.tk]viltinigit.tk[/url]
    [url=https://gafendownkarsi.ga]gafendownkarsi.ga[/url]
    [url=https://conhacalboygend.cf]what are preview sentences in a essay [/url]
    [url=https://toubzaterfemu.tk]dating site for older seperated [/url]
    [url=https://gridfibsynddedo.gq]apa format cover page essay [/url]
    [url=https://thierunboyper.gq]thierunboyper.gq[/url]
    [url=https://deaucongtaskeva.ga]narrative essay about becoming a christian [/url]
    [url=https://postwanscomplo.cf]postwanscomplo.cf[/url]
    [url=https://scanaremmaamu.tk]scanaremmaamu.tk[/url]
    [url=https://oninpresento.ga]oninpresento.ga[/url]
    [url=https://gridfibsynddedo.gq]what are 3 lessons about smoking essay [/url]
    [url=https://margzhongcolmiri.gq]online single dating sites [/url]
    [url=https://viltinigit.tk]how long do you have for the sat essay [/url]
    [url=https://spacciplaefinut.tk]spacciplaefinut.tk[/url]

    Reply
  39. [url=https://deaucongtaskeva.ga]deaucongtaskeva.ga[/url]
    [url=https://pashyceno.tk]pashyceno.tk[/url]
    [url=https://deaucongtaskeva.ga]deaucongtaskeva.ga[/url]
    [url=https://tieneckprinagas.cf]online dating phone call before meeting up [/url]
    [url=https://deaucongtaskeva.ga]html writing essay style picture [/url]
    [url=https://oninpresento.ga]oninpresento.ga[/url]
    [url=https://emomenyg.tk]college essay prompts owl [/url]
    [url=https://maacompmerpe.tk]maacompmerpe.tk[/url]
    [url=https://deaucongtaskeva.ga]deaucongtaskeva.ga[/url]
    [url=https://dydesphegeme.ml]uk. singles dating totally free [/url]
    [url=https://borwestnipotlue.tk]great college acceptance essay [/url]
    [url=https://linegvegem.tk]linegvegem.tk[/url]
    [url=https://borwestnipotlue.tk]borwestnipotlue.tk[/url]
    [url=https://tiragobbsic.tk]thadeus harris on dating site [/url]
    [url=https://borwestnipotlue.tk]borwestnipotlue.tk[/url]
    [url=https://symtyfurbei.tk]free adult dating chat nj [/url]

    Reply
  40. [url=http://furosemidelab.com/]generic furosemide 40 mg[/url] [url=http://metformin360.com/]metformin 1000 mg price[/url]

    Reply
  41. [url=http://furosemide1.com/]furosemide 20 mg[/url]

    Reply
  42. [url=https://dawootaroral.ga]dawootaroral.ga[/url]
    [url=https://dusfegeesamru.tk]dusfegeesamru.tk[/url]

    Reply
  43. [url=https://dawootaroral.ga]fire safety informative essay [/url]
    [url=https://repojofi.cf]questions to have about sex while dating [/url]

    Reply
  44. [url=https://dawootaroral.ga]dawootaroral.ga[/url]
    [url=https://comraseasto.ga]comraseasto.ga[/url]
    [url=https://gridfibsynddedo.gq]gridfibsynddedo.gq[/url]
    [url=https://driflinraso.tk]driflinraso.tk[/url]
    [url=https://conhacalboygend.cf]how to make a rubric essay question college level [/url]
    [url=https://miacesstetarna.tk]miacesstetarna.tk[/url]
    [url=https://ereccheby.tk]what should a five paragraph essay look like outline writing process chart [/url]
    [url=https://tinglamitkeilo.cf]shes too good to be true online dating [/url]
    [url=https://deaucongtaskeva.ga]narratie essay my favorite meal [/url]
    [url=https://odeswascatchfi.ga]odeswascatchfi.ga[/url]
    [url=https://dawootaroral.ga]dawootaroral.ga[/url]
    [url=https://tutfacenat.tk]how much money do dating sites make [/url]
    [url=https://flavdisflighdoka.ml]excellent college essay about having dyslexia [/url]
    [url=https://fuesausnugpatta.tk]fuesausnugpatta.tk[/url]
    [url=https://gridfibsynddedo.gq]college written essay prompts [/url]
    [url=https://jetfebvnanur.ga]best dating sites for overseas [/url]

    Reply
  45. [url=https://viltinigit.tk]viltinigit.tk[/url]
    [url=https://goldpagana.ga]ASIA BBW Dating Site online [/url]

    Reply
  46. [url=https://conhacalboygend.cf]future career plans college essay example [/url]
    [url=https://stumfascuro.tk]big black dick for my wife dating site [/url]

    Reply
  47. [url=https://gridfibsynddedo.gq]gridfibsynddedo.gq[/url]
    [url=https://riewithsaddcompsu.gq]europeans meet dating site [/url]
    [url=https://borwestnipotlue.tk]borwestnipotlue.tk[/url]
    [url=https://uslusbavono.ml]frustrated with online dating reddit [/url]
    [url=https://borwestnipotlue.tk]intro for essay example of cyberbyllying [/url]
    [url=https://uncenruigai.tk]top dating sites for ages 50 and over [/url]
    [url=https://dawootaroral.ga]how do i change sat to sat essay [/url]
    [url=https://unenatgyeno.cf]best dating sites for late 20′s [/url]
    [url=https://viltinigit.tk]format essay for contest [/url]
    [url=https://charwomemistgi.gq]dating app.for fat peopme [/url]
    [url=https://dawootaroral.ga]dawootaroral.ga[/url]
    [url=https://tocarcadeno.ga]black men on dating apps statistics [/url]
    [url=https://flavdisflighdoka.ml]where to put the date when citing person in essay [/url]
    [url=https://balirali.tk]online dating headlines women [/url]
    [url=https://borwestnipotlue.tk]borwestnipotlue.tk[/url]
    [url=https://ssurenrilac.tk]clover online dating review [/url]

    Reply
  48. [url=https://emomenyg.tk]emomenyg.tk[/url]
    [url=https://linegvegem.tk]linegvegem.tk[/url]

    Reply
  49. [url=http://ventolin0i0.com/]ventolin generic[/url]

    Reply
  50. [url=https://viltinigit.tk]viltinigit.tk[/url]
    [url=https://cephoticyc.tk]cephoticyc.tk[/url]
    [url=https://borwestnipotlue.tk]descriptive essay about morocco [/url]
    [url=https://vicommpermitgva.gq]how to start dating hot girls [/url]
    [url=https://gridfibsynddedo.gq]descriptive essay about theocean [/url]
    [url=https://stumfascuro.tk]dating a single mom benefits [/url]
    [url=https://dawootaroral.ga]dawootaroral.ga[/url]
    [url=https://tiroremaket.cf]tiroremaket.cf[/url]
    [url=https://gridfibsynddedo.gq]gridfibsynddedo.gq[/url]
    [url=https://feccocagallma.ga]feccocagallma.ga[/url]
    [url=https://gridfibsynddedo.gq]essay topics that could go on and on [/url]
    [url=https://zostnipondecur.cf]zostnipondecur.cf[/url]
    [url=https://emomenyg.tk]introductory words for an essay [/url]
    [url=https://katicjungsanmi.cf]katicjungsanmi.cf[/url]
    [url=https://deaucongtaskeva.ga]deaucongtaskeva.ga[/url]
    [url=https://linegvegem.tk]linegvegem.tk[/url]

    Reply

Leave a Reply