This is one of my first times writing Python. I'm most curious about style and whether while 1: x,y = socket.accept()
is an acceptable way to wait for new connections.
#!/usr/bin/pythonw
import socket
import os
class Server:
def __init__(self, directory, host="", port=8123):
print("Server running on port ", port)
self.directory = directory
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind((host, port))
serversocket.listen(5)
while 1:
connection, address = serversocket.accept()
print("Connection received")
socketfile = connection.makefile("rw")
request = socketfile.readline()
print(request)
url = self.getURL(request)
print("Serving ", url)
responseBody = None
responseCode = 200
try:
with open(url, "rb") as requestedFile:
responseBody = requestedFile.read()
except FileNotFoundError:
print("Error 404: File not found")
responseBody = b"404 Error Not Found"
responseCode = 404
connection.sendall(self.writeResponse(url, responseCode, responseBody))
socketfile.close()
connection.close()
print("Connection closed\n")
def writeResponse(self, url, code, body):
response = "HTTP/1.1 " + ("200\n" if code is 200 else "404\n")
response = response + "Cache-Control: no-cache, no-store, must-revalidate\n"
response = response + "Pragma: no-cache\n"
response = response + "Expires: 0\n"
response = response + "Connection: close\n"
if code is 200:
response = response + "Content-Length: " + str(os.path.getsize(url)) + "\n"
if ".css" in url:
response = response + "Content-Type: text/css; charset=UTF-8\n"
elif ".js" in url:
response = response + "Content-Type: application/javascript charset=UTF-8\n"
response = response + "\n"
return str.encode(response) + body
def getURL(self, line):
first = line.find(" ") + 1
second = line.find(" ", first + 1)
line = line[(first + 1):second]
if line == "" or line == "/":
return self.directory + "index.html"
else:
return self.directory + line
if __name__ == "__main__":
x = Server("/some/path/")