server.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import socket
  2. import threading
  3. import datetime
  4. import os
  5. from pathlib import Path
  6. htmlTemplate='''<!DOCTYPE html>
  7. <html>
  8. <head>
  9. <title>{title}</title>
  10. </head>
  11. <body>{content}</body>
  12. </html>
  13. '''
  14. EXTS={'jpg' :'image/jpeg',
  15. 'jpeg':'image/jpeg',
  16. 'png' :'image/png',
  17. 'ico' :'image/icon',
  18. 'htm' :'text/html',
  19. 'html':'text/html',
  20. 'js' :'application:x-javascript',
  21. 'css' :'text/css',
  22. 'txt' :'text/plain'}
  23. class Request(object):
  24. def __init__(self,req):
  25. self.__chips=req.split('\r\n')
  26. self.__RLChips=self.__chips[0].split(' ')
  27. self.method=self.__RLChips[0]
  28. self.URL=self.__RLChips[1]
  29. self.version=self.__RLChips[2]
  30. self.headers=self.__getHeaders()
  31. self.requestBody=self.__chips[-1]
  32. def __getHeaders(self):
  33. header=self.__chips[1:-2]
  34. headerDict={}
  35. for i in header:
  36. key,value=i.split(': ',1)
  37. headerDict[key]=value
  38. return headerDict
  39. class Response(object):
  40. def __init__(self):
  41. self.version='HTTP/1.1'
  42. self.date=datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S GMT')
  43. self.contentType='text/html'
  44. self.ext=''
  45. def dealRequest(self,request):
  46. self.version=request.version
  47. self.URL=request.URL
  48. self.path=os.path.join('www',request.URL[1:])
  49. self.ext=self.path.split('.')[-1] if '.' in self.path else ''
  50. self.statusCode,self.statusDesc=self.__ifExist()
  51. self.content=self.__getContent()
  52. self.contentType=self.__getType()
  53. def __ifExist(self):
  54. exist=os.path.exists(self.path)
  55. if exist:
  56. return ['200','OK']
  57. else:
  58. return ['404','Not Found']
  59. def __getContent(self):
  60. if self.statusCode=='200':
  61. if Path(self.path).is_file():
  62. with open(self.path,'rb') as f:
  63. page=f.read()
  64. try:
  65. return page.decode('utf-8')
  66. except:
  67. return page
  68. else:
  69. content=''
  70. if self.URL[-1]!='/':
  71. self.redirect(self.URL+'/',tem=False)
  72. return ''
  73. for i in os.listdir(self.path):
  74. if Path(os.path.join(self.path,i)).is_dir():
  75. i=i+'/'
  76. content=content+'<li><a href="%s">%s</a></li>' %(self.URL+i,i)
  77. if self.URL!='/':
  78. content='<li><a href="../">../</a></li>'+content
  79. title='Index of '+self.URL
  80. content='<h1> '+title+'</h1><hr/>'+'<ul>'+content+'</ul>'
  81. return htmlTemplate.format(title=title,content=content)
  82. elif self.statusCode=='404':
  83. return htmlTemplate.format(title='404 Not Found',content='<h1>404 Not Found</h1>')
  84. else:
  85. return ''
  86. def __getType(self):
  87. if self.statusCode=='200' and Path(self.path).is_file():
  88. return EXTS[self.ext] if self.ext in EXTS else 'text/plain'
  89. else:
  90. return 'text/html'
  91. def redirect(self,url,tem=True):
  92. if tem:
  93. self.statusCode='302'
  94. self.statusDesc='Moved Temporarily'
  95. else:
  96. self.statusCode='301'
  97. self.statusDesc='Moved Permanently'
  98. self.location=url
  99. @property
  100. def header(self):
  101. statusLine=self.version+' '+self.statusCode+' '+self.statusDesc
  102. baseHeader=statusLine+\
  103. '\r\nDate: '+self.date+\
  104. '\r\nContent-Type: '+self.contentType+\
  105. '\r\nContent-Length: '+str(len(self.content))
  106. if self.statusCode=='302' or self.statusCode=='301':
  107. baseHeader=baseHeader+'\r\nLocation: '+self.location
  108. return baseHeader+"\r\n\r\n"
  109. def http(sock,addr):
  110. buffer=b''
  111. while True:
  112. data=sock.recv(1024)
  113. buffer=buffer+data
  114. if len(data)<1024:
  115. break
  116. data=buffer.decode('utf-8')
  117. if len(data)==0:
  118. sock.close()
  119. return ''
  120. response=Response()
  121. try:
  122. request=Request(data)
  123. response.dealRequest(request)
  124. if request.URL=='/123456':
  125. response.redirect('/index.html')
  126. except:
  127. response.statusCode='500'
  128. response.statusDesc='Internal Server Error'
  129. response.content=htmlTemplate.format(title='500 Internal Server Error',content='<h1>500 Internal Server Error</h1>')
  130. sock.send(response.header.encode('utf-8'))
  131. if isinstance(response.content,bytes):
  132. sock.send(response.content)
  133. else:
  134. sock.send(response.content.encode('utf-8'))
  135. print(addr[0]+' === '+request.method+" === "+request.URL+" === "+response.statusCode)
  136. sock.close()
  137. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  138. s.bind(('0.0.0.0',5000))
  139. s.listen(5)
  140. print('httpserver running...')
  141. while True:
  142. sock,addr=s.accept()
  143. t=threading.Thread(target=http,args=(sock,addr))
  144. t.start()