1 #!/usr/bin/env python
2
3 # simple HTTP Server in Python 2
4
5 import socket, string, os
6 from stat import *
7
8 # Please change setting to your needs
9 PORT = 8081 # Arbitrary non-privileged server
10 DOCUMENT_ROOT = "Test-HTML/"
11
12 # procedure process_request
13 def process_request( clientsocket, address ):
14
15 # read HTTP request
16 # Define Response Headers
17 responsePrefix = "HTTP/1.0 200 OK\nServer:HPIserver/1.0\n"
18 response_NotSupported = """HTTP/1.0 400 Bad Request
19 Server: HPIserver/1.0\nConnection: close
20 Content-Type: text/html; charset=iso-8859-1\n
21 <HTML><HEAD><TITLE>400 Bad Request</TITLE></HEAD>\n"""
22 response_FileNotFound = """HTTP/1.0 404 Not Found\nServer: HPIserver/1.0
23 Connection: close\nContent-Type: text/html; charset=iso-8859-1\n
24 <html><head><title>File not found</title></head>\n"""
25
26 # Create File descriptor for request to read the first line of the request
27 clientsockfile = clientsocket.makefile('rw')
28 requestline = clientsockfile.readline();
29
30 # process GET method only
31 requestwords = string.split( requestline )
32 if requestwords[0] == 'GET':
33
34 # search file
35 try:
36 if requestwords[1] == '/':
37 # assume index.html was requested (no directory view)
38 requestwords[1] = '/index.html'
39 filestatus = os.stat( DOCUMENT_ROOT + requestwords[1] )
40 if S_ISREG(filestatus[ST_MODE]): # Regular file ?
41 # detect file size using stat()
42 filesize = filestatus[ST_SIZE]
43 # open file in binary mode
44 file = open(DOCUMENT_ROOT + requestwords[1], 'rb')
45 else:
46 raise OSError
47 except OSError:
48 clientsocket.send( response_FileNotFound )
49 clientsocket.send( "<body> File: " + requestwords[1] +
50 " not found</body>\n</html>\n" )
51 else:
52
53 # Detect file's MIME type by suffix.
54 suffix = string.split( requestwords[1], '.' )[-1]
55 # text/html image/gif image/jpeg audio/midi application/java
56 if suffix == 'html': filetype = 'text/html'
57 elif suffix == 'gif' : filetype = 'image/gif'
58 elif suffix == 'jpg' : filetype = 'image/jpeg'
59 elif suffix == 'mid' : filetype = 'audio/midi'
60 elif suffix == 'class' : filetype = 'application/java'
61 else: filetype = "unknown"
62
63 # send response
64 # Send response header
65 clientsocket.send( responsePrefix )
66 clientsocket.send( "content-type: "+ filetype + "\n" )
67 clientsocket.send( "content-length: "+ repr(filesize) + "\n" )
68 clientsocket.send( "\n" )
69
70 # send file in 1024 byte chunks
71 while 1:
72 data = file.read(1024)
73 if not data:
74 break
75 clientsocket.send( data )
76 else:
77 clientsocket.send( response_NotSupported )
78 clientsocket.send( "<body> request: " + requestline +
79 "</body>\n</html>\n" )
80
81 # close Filedescriptor for request
82 clientsockfile.close()
83
84
85 #-----------------------------------------
86 # Server main
87
88
89 # Initialization
90
91 # Open server socket
92
93 # inet Socket (not UNIX), Type Stream (not datagram)
94 serversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
95 serversocket.bind((socket.gethostname(), PORT)) # bind to Port PORT
96 # tell OS to activate port for a maximum
97 # of 1 connection simultanouslyserversocket.listen(1)
98
99 # request-response loop
100 try:
101 while 1:
102 # wait for request and establish connection
103 ( clientsocket, address ) = serversocket.accept()
104 process_request( clientsocket, address )
105 # Close connection
106 clientsocket.close()
107 finally:
108 # Deactivation
109 serversocket.close()
![]() |
Apache Modeling Portal 2004-10-29 |