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,689 ResponsesLeave one →

  1. [url=https://kairostimegaming.gepost.info/new-gadget-best-build-for-penny-so-much-damage-gadget-star-power-tier-list/pHmAqGiWzHe8g5w][img]https://i.ytimg.com/vi/CIJv10hGZOg/hqdefault.jpg[/img][/url]

    NEW Gadget [url=https://kairostimegaming.gepost.info/new-gadget-best-build-for-penny-so-much-damage-gadget-star-power-tier-list/pHmAqGiWzHe8g5w]&[/url] BEST Build for PennySO Much DAMAGEGadget & Star Power Tier List

    Reply
  2. Gregoryastex

     /  2020/08/10

    В наше время, кальян является не просто модным девайсом, но и средством приятного времяпровождения с компании друзей.

    Однако для не опытного человека может возникнуть ряд трудностей при выборе как кальяна, так и табака, однако речь идет не только о разнообразии вкусов, но и крепости.

    Подобрать табак самостоятельно, Вам поможет данная статья. Она подскажет какую крепость выбрать и как подобрать качественный товар.

    В первую очередь, Вам нужно знать то, что все табачные смеси для забивания кальяна, изготовлены примерно из идентичных табачных листов.

    [url=https://hookah-magic.su/item/tabak-b3-lemon-drops-50-g/]купить табак без предоплаты[/url]

    В состав каждой смеси входят такие компоненты как :

    1. глицерин

    2. патока

    3. мед или сахарный сироп

    4. ароматизаторы

    5. и самое главный компонент – табачный лист.

    Именно различие последнего и самого важного компонента поможет Вам разобраться и ориентироваться в вариациях табака.

    Всего в мире насчитывается около 60 вариантов табака, однако при производстве кальянной смеси используют только 4 вида:

    1. Вирджиния голд – самый популярный вид табака. В то же время он является лучшим для людей, которые только начинают свое знакомство с кальяном. Данный табак не слишком крепкий и он имеет характерный сладковатый привкус, благодаря этим особенностям, при курении кальян будет легким, а смесь будет иметь более яркий и приятный вкус.

    2. Ориентал – Данный табак подойдет людям, которые хотят меньшее содержание никотина. Данный табак используют для приготовления самых мягких кальянов.

    3. Берли – данный табак не так популярен, как предыдущие и он так же реже встречается на прилавках магазина. Он не подойдет для новичка, однако для более опытных в самый раз. Этот табак имеет значительное преимущество над всеми разновидностями табака – он достаточно крепок и прекрасно впитывает и передает во время курения насыщенный аромат и вкус.

    4. Мэриленд – средний крепости табак американского производства. Имеет приятные вкусовые качества.

    Reply
  3. [url=https://malegra.us.org/]malegra 150 india[/url] [url=https://propranolol100.com/]propranolol over the counter canada[/url]

    Reply
  4. [url=https://estrace2.com/]buy estrace 2mg[/url] [url=https://colchicine5.com/]colchicine online canada[/url]

    Reply
  5. [url=http://stratterra.com/]strattera 25 mg discount[/url]

    Reply
  6. [url=http://avodart24.com/]avodart 0 5 mg[/url] [url=http://stromectol1.com/]generic stromectol[/url] [url=http://albendazoleotc.com/]albendazole in canada[/url]

    Reply
  7. [url=https://mahaubivaha.mnworlds.info/kak-polucit-novyj-komplekt-besplatno-novosti-obnovlenia-v-robloks-adopt-mi/frR4sXqdYqWgqrY][img]https://i.ytimg.com/vi/LNCMCk0pgwU/hqdefault.jpg[/img][/url]

    Как получить НОВЫЙ КОМПЛЕКТ БЕСПЛАТНО? Новости обновления [url=https://mahaubivaha.mnworlds.info/kak-polucit-novyj-komplekt-besplatno-novosti-obnovlenia-v-robloks-adopt-mi/frR4sXqdYqWgqrY]в[/url] Роблокс Адопт Ми

    Reply
  8. [url=https://primevideoin.plclip.info/dr5Z0luKVpM-nithya-menen-s-best-performance-breathe-into-the-shadows-nithya-menen-amazon-original.html][img]https://i.ytimg.com/vi/dr5Z0luKVpM/hqdefault.jpg[/img][/url]

    Nithya Menen’s Best [url=https://primevideoin.plclip.info/dr5Z0luKVpM-nithya-menen-s-best-performance-breathe-into-the-shadows-nithya-menen-amazon-original.html]PerformanceBreathe[/url] – Into The ShadowsNithya MenenAmazon Original

    Reply
  9. MiltonTus

     /  2020/08/08

    В наше время, кальян является не просто модным девайсом, но и средством приятного времяпровождения с компании друзей.

    Однако для не опытного человека может возникнуть ряд трудностей при выборе как кальяна, так и табака, однако речь идет не только о разнообразии вкусов, но и крепости.

    Подобрать табак самостоятельно, Вам поможет данная статья. Она подскажет какую крепость выбрать и как подобрать качественный товар.

    В первую очередь, Вам нужно знать то, что все табачные смеси для забивания кальяна, изготовлены примерно из идентичных табачных листов.

    [url=https://hookah-magic.su/item/tabak-inferno-fistashkovoe-morozhennoe-200gr/]где можно москве купить табак[/url]

    В состав каждой смеси входят такие компоненты как :

    1. глицерин

    2. патока

    3. мед или сахарный сироп

    4. ароматизаторы

    5. и самое главный компонент – табачный лист.

    Именно различие последнего и самого важного компонента поможет Вам разобраться и ориентироваться в вариациях табака.

    Всего в мире насчитывается около 60 вариантов табака, однако при производстве кальянной смеси используют только 4 вида:

    1. Вирджиния голд – самый популярный вид табака. В то же время он является лучшим для людей, которые только начинают свое знакомство с кальяном. Данный табак не слишком крепкий и он имеет характерный сладковатый привкус, благодаря этим особенностям, при курении кальян будет легким, а смесь будет иметь более яркий и приятный вкус.

    2. Ориентал – Данный табак подойдет людям, которые хотят меньшее содержание никотина. Данный табак используют для приготовления самых мягких кальянов.

    3. Берли – данный табак не так популярен, как предыдущие и он так же реже встречается на прилавках магазина. Он не подойдет для новичка, однако для более опытных в самый раз. Этот табак имеет значительное преимущество над всеми разновидностями табака – он достаточно крепок и прекрасно впитывает и передает во время курения насыщенный аромат и вкус.

    4. Мэриленд – средний крепости табак американского производства. Имеет приятные вкусовые качества.

    Reply
  10. [url=https://ivermectin3.com/]ivermectin nz[/url] [url=https://allopurinol24.com/]allopurinol 300 mg for sale[/url] [url=https://indocinrx.com/]indocin 25 mg capsules[/url] [url=https://medrol80.com/]medrol 16mg tab[/url] [url=https://arimidex365.com/]arimidex australia buy[/url]

    Reply
  11. [url=https://jabykoay.plclip.info/kwGw2kGaTZo-only-desi-koi-mil-gaya-feat-naughty-america-hrithik-roshan-reaction-jaby-koay.html][img]https://i.ytimg.com/vi/kwGw2kGaTZo/hqdefault.jpg[/img][/url]

    ONLY DESIKoi Mil Gaya [url=https://jabykoay.plclip.info/kwGw2kGaTZo-only-desi-koi-mil-gaya-feat-naughty-america-hrithik-roshan-reaction-jaby-koay.html](feat.[/url] Naughty America)Hrithik RoshanReactionJaby Koay

    Reply
  12. [url=https://americasgottalent.hurun.info/grace-vanderwaal-s-iconic-golden-buzzer-moment-america-s-got-talent-2020/aoSitIiljpml1Mk.html][img]https://i.ytimg.com/vi/9KrRRo-gDpc/hqdefault.jpg[/img][/url]

    Grace [url=https://americasgottalent.hurun.info/grace-vanderwaal-s-iconic-golden-buzzer-moment-america-s-got-talent-2020/aoSitIiljpml1Mk.html]VanderWaal’s[/url] Iconic Golden Buzzer Moment – America’s Got Talent 2020

    Reply
  13. [url=https://mazhavilmanorama.plclip.info/jvUCAntUbds-jeevithanouka-last-week-highlights-mazhavil-manorama.html][img]https://i.ytimg.com/vi/jvUCAntUbds/hqdefault.jpg[/img][/url]

    JeevithanoukaLast week [url=https://mazhavilmanorama.plclip.info/jvUCAntUbds-jeevithanouka-last-week-highlights-mazhavil-manorama.html]highlights[/url] Mazhavil Manorama

    Reply
  14. [url=https://avodart24.com/]avodart online usa[/url] [url=https://diflucanrx.com/]diflucan pill uk[/url] [url=https://gabapentin.us.com/]4 gabapentin[/url] [url=https://augmentin875.com/]generic augmentin 875 mg[/url] [url=https://allopurinol24.com/]brand name allopurinol[/url]

    Reply
  15. [url=https://seroquel50.com/]seroquel price canada[/url]

    Reply
  16. [url=https://trazodone911.com/]trazodone 150 mg capsules[/url]

    Reply
  17. [url=https://justinbiebervevo.csshows.info/ariana-grande-justin-bieber-stuck-with-u-mother-s-day-edition/ntiDtaetbJXZk6Q][img]https://i.ytimg.com/vi/nrJTtH3cw0o/hqdefault.jpg[/img][/url]

    Ariana Grande, [url=https://justinbiebervevo.csshows.info/ariana-grande-justin-bieber-stuck-with-u-mother-s-day-edition/ntiDtaetbJXZk6Q]Justin[/url] Bieber – Stuck with U (Mother’s Day Edition)

    Reply
  18. [url=https://terminalmontage.esworld.info/aXWzYIKfjnnRlK8/][img]https://i.ytimg.com/vi/9CP0RlXAn_M/hqdefault.jpg[/img][/url]

    ? ? [url=https://terminalmontage.esworld.info/aXWzYIKfjnnRlK8/]?[/url] ? ? ? ? ? ? ?

    Reply
  19. You will find a lot of dating websites on the market, however, you want to be sure that the internet site you decide on is safe and will assist you to hookup women with the best women [url=http://www.quanticode.com/forum/phpBB3/viewtopic.php?f=5&t=26200&sid=ae5a5c7e7f54dd8e6aa4032502c241a9]pop over to this web-site[/url]. Should you don’t wish to use a online dating internet site for one evening of entertaining, you might like to think about a conversation iphone app that works well exclusively with single people and lets you visit a are living particular person on screen.

    Most courting apps provide a talk space that you can use in order to meet females. The very best of these web sites enable you to make use of a webcam and chat with them to get a specific period of time. If you utilize a chitchat area for one night of exciting, you will be amazed at how many girls you will definitely get to meet and perhaps even get acquainted with. Should you can’t have the woman you would like within the talk area, you might need to go back to a traditional dating web site.

    When you have an app that lets you speak to females for an entire night, you possess an edge over traditional internet dating. You don’t need to go on dates. You don’t have to worry about the woman you are interested in generating her emotions acknowledged while you are communicating on the internet. It may not appear to be it, but it is correct.

    If you are considering finding females but don’t want to be included in a responsibility, the best option is in an attempt to hookup females using one night time only. This will provide you with the ability of reaching females and never have to commit to nearly anything. Additionally, it provides you with the opportunity to meet much more females than you may with classic dating.

    It is simple to fulfill one ladies and become familiar with them in a seductive setting. The amount of ladies you can expect to satisfy will probably be much greater and you may locate a special one which you would love to fulfill personally.

    The easiest method to get moving using a conversation iphone app is to attend a dating site and find out what you believe of the capabilities accessible. If you like the functions, then visit the online dating internet site and initiate making use of them in your dating iphone app.

    After you have made a decision to work with an app for hookup girls, you will have to locate one that meets your requirements. If you would like hookup women for just one night time only, try to find an mobile app that gives a free of charge account or a regular monthly account. When you have much more time, there are additional web sites that are ideal for hookup girls just like a internet dating website or a online dating site.

    When you decide on the webpage you would like to use, you need to sign-up, and create your information. This will get you started chatting with females over a stay talk room, so you can meet as many women as you would like on a single evening only foundation.

    Most of these internet sites offer tips for meeting girls, but ensure that the internet site you be a part of has got the characteristics you require. Should you prefer a one nighttime to satisfy and hookup ladies on a single evening only basis, search for a web site which has this.

    In case you are more interested in a online dating website, then you could try and satisfy females with dating sites. Most of these web sites offer multiple days or a number of schedules.

    You will be able to meet women that you may be in a position to have sex with on a single night. or perhaps in a prolonged combination of dates. If you are interested in meeting females on a evening out, locate a website that allows you to satisfy women who are one.

    When you are having an mobile app, it can be very simple to satisfy women first night and also have gender using them. If you work with a online dating web site, you can have a wonderful knowledge of conference numerous days.

    Reply
  20. [url=http://seroquel50.com/]where to buy seroquel[/url]

    Reply
  21. [url=http://vardenafilxr.com/]vardenafil 20mg canada[/url] [url=http://fluoxetinetb.com/]fluoxetine capsules[/url]

    Reply
  22. [url=https://diclofenacg.com/]diclofenac 50 mg[/url]

    Reply
  23. [url=https://imamuride.jpflow.info/roman-t-sh-ng-d-hu-mi-nsumaho-galaxy-s20/j51xdm15zIpqpHE][img]https://i.ytimg.com/vi/_f8F9GiW8lA/hqdefault.jpg[/img][/url]

    [url=https://imamuride.jpflow.info/roman-t-sh-ng-d-hu-mi-nsumaho-galaxy-s20/j51xdm15zIpqpHE]ロマン特盛大画面スマホ!Galaxy S20 Ultra 5G[/url]

    Reply
  24. [url=https://singulair.us.org/]buy singulair[/url] [url=https://baclofen24.com/]baclofen 10 mg[/url] [url=https://ventolinh.com/]buy ventolin[/url]

    Reply
  25. [url=http://atorvastatin.us.com/]lipator[/url]

    Reply
  26. [url=http://retina.us.org/]generic retin-a cream[/url] [url=http://chloroquine.us.org/]chloroquine phosphate for sale[/url]

    Reply
  27. [url=https://priligy.us.com/]priligy over the counter usa[/url]

    Reply
  28. [url=https://metformin.us.org/]metformin medication[/url] [url=https://prazosin.us.com/]prazosin 1mg[/url] [url=https://nexium.us.org/]where can i buy nexium in uk[/url] [url=https://hydroxychloroquine.us.com/]hydroxychloroquine generic[/url] [url=https://hydroxychloroquinecv.com/]hydroxychloroquine buy[/url] [url=https://domperidone.us.com/]domperidone[/url] [url=https://azithromycin.us.org/]azithromycin for sale usa[/url] [url=https://proscar.us.com/]proscar medication[/url] [url=https://motrin.us.com/]motrin 400 mg[/url] [url=https://duloxetine.us.com/]buy duloxetine[/url]

    Reply
  29. [url=https://wellbutrin.us.org/]wellbutrin 525[/url]

    Reply
  30. [url=http://wellbutrin.us.org/]best generic wellbutrin 2017[/url]

    Reply
  31. [url=http://chloroquine.us.org/]where to buy chloroquine[/url]

    Reply
  32. [url=http://zovirax.us.com/]zovirax generic[/url] [url=http://attarax.com/]buy atarax tablets[/url]

    Reply
  33. [url=http://hydroxychlorothiazide.com/]3 hydrochlorothiazide[/url]

    Reply
  34. [url=https://domperidone.us.com/]domperidone[/url] [url=https://bupropion365.com/]bupropion 600 mg[/url] [url=https://retina.us.org/]buy retin a[/url]

    Reply
  35. [url=http://tamoxifenpct.com/]tamoxifen 5648[/url] [url=http://hydroxychlorothiazide.com/]hydrochlorothiazide 12.5[/url]

    Reply
  36. [url=http://malegra.us.org/]buy malegra 200 mg[/url] [url=http://hydroxychlorothiazide.com/]hydrochlorothiazide tab 100 mg[/url] [url=http://tamoxifenpct.com/]tamoxifen brand[/url] [url=http://motrin.us.com/]800 mg motrin cost[/url] [url=http://ivermectin.us.org/]buy ivermectin pills[/url]

    Reply
  37. [url=http://wellbutrin.us.org/]buy wellbutrin[/url]

    Reply
  38. [url=https://tadallafil.com/]tadalafil[/url]

    Reply
  39. [url=https://cipro.us.org/]buy cipro on line[/url] [url=https://tadalafil2017.us.com/]tadalafil 20 mg[/url]

    Reply
  40. [url=https://cipro.us.org/]cipro 500 mg[/url] [url=https://sildenafil4you.us.org/]sildenafil 100 mg[/url] [url=https://tretinoin365.com/]tretinoin[/url] [url=https://colchicinetab.com/]colchicine[/url] [url=https://tadalafil2017.us.com/]tadalafil india brand[/url] [url=https://sildenafiltb.com/]sildenafil 100mg price[/url] [url=https://chydroxychloroquine.com/]plaquenil 50 mg[/url]

    Reply
  41. cbd tinctures [url=http://hempcbdoil.us.com/ ]cbd oil store [/url] cbd hemp cbd cream

    Reply
  42. buy cbd [url=hempoilxl.com ]medterra cbd [/url] hemp cbd oil cbd cream

    Reply
  43. cbd gummies walmart [url=hempcbdoilgs.com ]cdb oils [/url] best cbd oil cbd near me

    Reply
  44. [url=http://neurontingab.com/]buy neurontin[/url] [url=http://isotretinoin24.com/]isotretinoin online[/url] [url=http://colchicinetab.com/]colchicine price in india[/url]

    Reply
  45. [url=http://tadalafil2017.us.com/]tadalafil tablets canada[/url]

    Reply
  46. [url=https://tadalafil2017.us.com/]buy tadalafil online[/url]

    Reply
  47. cbd store [url=http://cbdoilcho.com/ ]cbd tinctures [/url] cbd products cbd pure

    Reply
  48. cbd oils [url=http://cbdoilwalm.com/ ]cbd oil for dogs [/url] medterra cbd cbd oil store

    Reply
  49. buy cbd oil online [url=http://cbdoilww.com/ ]cbd capsules [/url] cbd gummies cbd drops

    Reply
  50. [url=https://tadallafil.com/]tadalafil 20[/url]

    Reply

Leave a Reply to CharlesBus