All pastes #833353 Raw Edit

Untitled

public text v1 · immutable
#833353 ·published 2007-12-27 04:12 UTC
rendered paste body
#!/usr/bin/env python

import socket
import sys
import thread
import re
import datetime

port = int(sys.argv[1])
regex_topline = "^(GET) (/.*) HTTP/(.*)$"
regex_agent = "^User-Agent: (/.*)$"
regex_action_location = "^/(location|file|detail)=(.*)$"
root = "/home/michael/"

def error(message):
	header = """HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Nippysaurus Custom Server
Last-Modified: Mon, 23 May 2005 22:38:34 GMT
Connection: close
Content-Type: text/html; charset=UTF-8

"""
	content = "error: " + message
	return str(header) + str(content)

def detail(path):
	None

def file(path):
	None

def location(path):
	response = """HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Nippysaurus Custom Server
Last-Modified: Mon, 23 May 2005 22:38:34 GMT
Connection: close
Content-Type: text/html; charset=UTF-8

hello"""
	response += "yep"
	return response

def redirect(destination):
	return "HTTP/1.1 301 Moved Permanently\nLocation: /" + destination

def process(request):
	if request['resource'] == '/':
		return redirect('location=/')
	# Table of action functions which correspond to action types.
	actions = {'location':location, 'file':file, 'detail':detail}
	# In resource line, find request type and location that request refers to.
	# Group 1 is request type ... "resource", "file", or "detail"
	# Group 2 is file or folder request is referring to (resource).
	m = re.match(regex_action_location,request['resource'])
	if m:
		return actions[m.group(1)](m.group(2))
	else:
		return error("invalid resource request format")

def connection(conn):
	global id,idlock
	idlock.acquire()
	id += 1
	idlock.release()
	print "connection",id,"opened"
	data = conn.recv(512)
	if data:
		request = {'type':None, 'resource':None, 'version':None, 'agent':None}
		for line in data.rstrip("\n\r").splitlines():
			# Find top line.
			# Group 1 is request type.
			# Group 2 is location request refers to.
			# Group 3 is HTTP version.
			m = re.match(regex_topline,line)
			if m:
				request['type'] = m.group(1)
				request['resource'] = m.group(2)
				request['version'] = m.group(3)
			# Find user agent.
			# Group 1 is user agent.
			m = re.match(regex_agent,line)
			if m:
				request['agent'] = m.group(1)
		# Formulate a response based on request information then send to client.
		conn.send(process(request))
	# No keepalive connections!
	conn.close()
	print "connection",id,"closed"

idlock = thread.allocate_lock()
id = 0

def listen():
	s = None
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.bind(("",port))
	s.listen(1)
	print "listening on port",port
	while 1:
		(conn,addr) = s.accept()
		thread.start_new_thread(connection,(conn,))

thread.start_new_thread(listen,())

#try:
#	f = open("/home/michael/Desktop/TestTextt","r")
#	print f.read()
#except IOError, (errno, strerror):
#	print strerror

raw_input("")