title: How to parse an HTTP request in python (custom web server)
body: <p>I am trying to create a multi-threaded web server in python. I have managed to get it to work with basic text, but I'm having trouble adapting it to HTTP. </p>
  
  <p>Also it crashes when sending a GET request, but it does not crash when just using 'connect'. Am I not setting up the server correctly on localhost:port ?</p>
  
  <p>The main problem however, is that I have a client socket, but I do not know how to extract the request data from it.</p>
  
  <pre><code>#! /usr/bin/env python3.3
  import socket, threading, time, sys, queue
  
  #initial number of worker threads
  kNumThreads = 50
  
  #queue of all the incoming requests
  connections = queue.Queue(-1)
  
  
  class Request_Handler(threading.Thread):
      def __init__(self):
          threading.Thread.__init__(self)
  
      def run(self):
          while(True):
              #Get the request socket data from the queue
              global connections
              self.connection = connections.get()
              self.addr = self.connection[1]
              self.socket = self.connection[0]
  
              #I have the socket, but how do I parse the request from here?
              #Also is there a better way to respond than to manually create a response here?
  
              self.response = 'HTTP/1.1 200 OK/nContent-Type: text/html; charset=UTF-8/n/n &lt;html&gt;&lt;body&gt;Hello World&lt;/body&gt;&lt;/html&gt;'
              print("got here")
              self.socket.send(self.response.encode('utf-8'))
              self.socket.close()
              requests.task_done()
  
  
  #creates kNumThreads threads that will handle requests
  def create_threads():
      for n in range(0, kNumThreads):
         RH = Request_Handler()
         RH.start()
  
  def main():
      s = socket.socket()
      port = int(sys.argv[1])
  
      #sets up the server locally
      s.bind(('127.0.0.1', port))
      s.listen(100)
  
      #create the worker threads   
      create_threads()
  
      #accept connections and add them to queue
      while(True):
          c, addr = s.accept()
          connections.put_nowait((c, addr))
  
  if __name__ == '__main__':
      main()
  </code></pre>