From fd3bb914d6408e7ba40d92ecb985f1231ddd9e10 Mon Sep 17 00:00:00 2001 From: Ferdous Ahmed Adit Date: Sun, 22 Jan 2023 16:43:02 -0700 Subject: [PATCH 01/10] Bring index.html to root --- index.html | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 00000000..7d3e64eb --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + Example Page + + + + + + +
+

An Example Page

+ +
+ + From c052b5405fcae8cbf1eaf9e2c6d8fd5c3196b68b Mon Sep 17 00:00:00 2001 From: Ferdous Ahmed Adit Date: Tue, 24 Jan 2023 00:21:22 -0700 Subject: [PATCH 02/10] on track --- index.html | 20 ---------------- server.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 27 deletions(-) delete mode 100644 index.html diff --git a/index.html b/index.html deleted file mode 100644 index 7d3e64eb..00000000 --- a/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - Example Page - - - - - - -
-

An Example Page

- -
- - diff --git a/server.py b/server.py index bc5a725c..46ac2890 100644 --- a/server.py +++ b/server.py @@ -1,14 +1,14 @@ -# coding: utf-8 +# coding: utf-8 import socketserver # Copyright 2013 Abram Hindle, Eddie Antonio Santos -# +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -28,11 +28,62 @@ class MyWebServer(socketserver.BaseRequestHandler): - + extension_code = { + 'NOTHING': None, + 'INDEX_PAGE': 'index.html', + 'NOT_FOUND': '404' + } + def handle(self): self.data = self.request.recv(1024).strip() - print ("Got a request of: %s\n" % self.data) - self.request.sendall(bytearray("OK",'utf-8')) + print("Got a request of: %s\n" % self.data) + + # Now that we have the response. We need to parse it. parse_request + # already decodes the data. + request_is_good = self.parse_request(self.data) + print(self.extension) + if request_is_good == -1: # handling any POST/PUT/DELETE request + print("Something") + self.request.sendall(bytearray( + f"HTTP/1.1 405 METHOD NOT ALLOWED/r/nContent-Type: 'text/html'/r/nContent-Length: {len(f)}; encoding=utf-8/r/n/r/nThis works!", 'utf-8')) + return + elif self.extension == 'index.html': # directed to index.html + self.request.sendall(bytearray( + f"HTTP/1.1 200 OK\r\ncontent-Type: text/html; encoding=utf-8\r\n\r\nThis works!", 'utf-8')) + return + elif self.extension == '404': + self.request.sendall(bytearray( + f"HTTP/1.1 404 NOT FOUND\r\ncontent-Type: text/html; encoding=utf-8\r\n\r\nThis works!", 'utf-8')) + + def parse_request(self, data): + self.data = data.decode('utf-8') + # Is the message anything other than GET? + if self.data[:3] != 'GET': + return -1 + + self.extension = '' + # There is no extension after base url + if self.data[4:6] == '/ ': + self.extension = None + elif self.data[4:15] == '/index.html': # requested for index.html + self.extension = 'index.html' + else: # request is okay but cannot find the extension requested. + self.extension = '404' + return 1 + + ''' + Content-Type': 'text/html; encoding=utf8' + self.request.sendall(bytearray(f"HTTP/1.1 200 OK\r\n")) + + + + if self.data[:3] = "GET" + f = open(index.html) + f1 = f.read + f.close + self.request.sendall(bytearray(f"HTTP/1.1 200 OK/r/nContent/r/n/r/n{f1}", 'utf-8')) + self.request.sendall(bytearray("HTTP", 'utf-8'))''' + if __name__ == "__main__": HOST, PORT = "localhost", 8080 @@ -44,3 +95,7 @@ def handle(self): # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever() + + +file index.html +f = open("www/"+file) \ No newline at end of file From b209cd96b662159291afd31a068fa56a83a4c8d4 Mon Sep 17 00:00:00 2001 From: Ferdous Ahmed Adit Date: Wed, 25 Jan 2023 12:19:49 -0700 Subject: [PATCH 03/10] One Fail case left --- server.py | 115 +++++++++++++++++++++++++++++------ www/hardcode/deep.css | 4 ++ www/hardcode/deep/deep.css | 4 ++ www/hardcode/deep/index.html | 20 ++++++ www/hardcode/index.html | 20 ++++++ 5 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 www/hardcode/deep.css create mode 100644 www/hardcode/deep/deep.css create mode 100644 www/hardcode/deep/index.html create mode 100644 www/hardcode/index.html diff --git a/server.py b/server.py index 46ac2890..a904121a 100644 --- a/server.py +++ b/server.py @@ -1,5 +1,6 @@ # coding: utf-8 import socketserver +import os # Copyright 2013 Abram Hindle, Eddie Antonio Santos # @@ -33,6 +34,10 @@ class MyWebServer(socketserver.BaseRequestHandler): 'INDEX_PAGE': 'index.html', 'NOT_FOUND': '404' } + SPACE = '\r\n' + END = '\r\n\r\n' + NOT_OKAY = -1 + OKAY = 1 def handle(self): self.data = self.request.recv(1024).strip() @@ -41,16 +46,24 @@ def handle(self): # Now that we have the response. We need to parse it. parse_request # already decodes the data. request_is_good = self.parse_request(self.data) - print(self.extension) - if request_is_good == -1: # handling any POST/PUT/DELETE request - print("Something") - self.request.sendall(bytearray( - f"HTTP/1.1 405 METHOD NOT ALLOWED/r/nContent-Type: 'text/html'/r/nContent-Length: {len(f)}; encoding=utf-8/r/n/r/nThis works!", 'utf-8')) - return - elif self.extension == 'index.html': # directed to index.html + + if request_is_good == self.NOT_OKAY: # handling any POST/PUT/DELETE request self.request.sendall(bytearray( - f"HTTP/1.1 200 OK\r\ncontent-Type: text/html; encoding=utf-8\r\n\r\nThis works!", 'utf-8')) + f"HTTP/1.1 405 METHOD NOT ALLOWED{self.SPACE}Content-Type: 'text/html'{self.SPACE}Content-Length: 42{self.SPACE} encoding=utf-8{self.END}405 METHOD NOT ALLOWED", 'utf-8')) return + + elif self.extension == 'index.html': # directed to default index.html + self.serve_default_index() + + elif self.extension == 'deep_index.html': + self.serve_deep_index() + + elif self.extension == 'base.css': + self.serve_default_css() + + elif self.extension == 'hardcode_index.html': + self.serve_hardcode_index() + elif self.extension == '404': self.request.sendall(bytearray( f"HTTP/1.1 404 NOT FOUND\r\ncontent-Type: text/html; encoding=utf-8\r\n\r\nThis works!", 'utf-8')) @@ -62,20 +75,92 @@ def parse_request(self, data): return -1 self.extension = '' - # There is no extension after base url - if self.data[4:6] == '/ ': - self.extension = None - elif self.data[4:15] == '/index.html': # requested for index.html + # If root or directly requesting index.html + if self.parse_request_default_html(): self.extension = 'index.html' + elif self.parse_request_deep_html(): + self.extension = 'deep_index.html' + elif self.parse_request_default_css(): + self.extension = 'base.css' + elif self.parse_request_hardcode_html(): + self.extension = 'hardcode_index.html' + + # elif self.data[] + else: # request is okay but cannot find the extension requested. self.extension = '404' return 1 + """ + Parse the request path methods. --------------------------------- + """ + + def parse_request_default_html(self): + if self.data[4:6] == '/ ' \ + or self.data[4:17] == '/index.html/ ' \ + or self.data[4:16] == '/index.html ': + return True + return False + + def parse_request_default_css(self): + end = self.data.find("HTTP") + if self.data[4:end] == '/base.css ' \ + or self.data[4:end] == '/base.css/ ': + return True + return False + + def parse_request_deep_html(self): + end = self.data.find("HTTP") + if self.data[4:end] == '/deep ' \ + or self.data[4:end] == '/deep/ ' \ + or self.data[4:end] == '/deep/index.html '\ + or self.data[4:end] == '/deep/index.html/ ': + return True + return False + + def parse_request_hardcode_html(self): + end = self.data.find("HTTP") + end = end - 1 + if self.data[4:end] == '/hardcode'\ + or self.data[4:end] == '/hardcode/'\ + or self.data[4:end] == '/hardcode/index.html'\ + or self.data[4:end] == '/hardcode/index.html/': + return True + return False + + """ + Serve the page methods. ---------------------------------------- + """ + + def serve_default_css(self): + with open(os.getcwd() + "/www/base.css", 'rb') as file: + f_holder = file.read() + self.request.sendall(bytearray( + f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/css{self.SPACE}{self.END}{f_holder}", 'utf-8')) + + def serve_deep_index(self): + with open(os.getcwd() + "/www/deep/index.html", 'rb') as file: + f_holder = file.read() + self.request.sendall(bytearray( + f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) + + def serve_default_index(self): + with open(os.getcwd() + "/www/index.html", 'rb') as file: + f_holder = file.read() + self.request.sendall(bytearray( + f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) + + def serve_hardcode_index(self): + with open(os.getcwd() + "/www/hardcode/index.html", 'rb') as file: + f_holder = file.read() + self.request.sendall(bytearray( + f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) + ''' Content-Type': 'text/html; encoding=utf8' self.request.sendall(bytearray(f"HTTP/1.1 200 OK\r\n")) - + if self.data[:3] = "GET" f = open(index.html) @@ -95,7 +180,3 @@ def parse_request(self, data): # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever() - - -file index.html -f = open("www/"+file) \ No newline at end of file diff --git a/www/hardcode/deep.css b/www/hardcode/deep.css new file mode 100644 index 00000000..baafb8d2 --- /dev/null +++ b/www/hardcode/deep.css @@ -0,0 +1,4 @@ +h1 { + color:green; + text-align:center; +} diff --git a/www/hardcode/deep/deep.css b/www/hardcode/deep/deep.css new file mode 100644 index 00000000..baafb8d2 --- /dev/null +++ b/www/hardcode/deep/deep.css @@ -0,0 +1,4 @@ +h1 { + color:green; + text-align:center; +} diff --git a/www/hardcode/deep/index.html b/www/hardcode/deep/index.html new file mode 100644 index 00000000..ca0d6280 --- /dev/null +++ b/www/hardcode/deep/index.html @@ -0,0 +1,20 @@ + + + + Deeper Example Page + + + + + + +
+

An Example of a Deeper Page

+ +
+ + diff --git a/www/hardcode/index.html b/www/hardcode/index.html new file mode 100644 index 00000000..ca0d6280 --- /dev/null +++ b/www/hardcode/index.html @@ -0,0 +1,20 @@ + + + + Deeper Example Page + + + + + + +
+

An Example of a Deeper Page

+ +
+ + From cc2c3ef8e026aed591b42b722801a398a38cc1b4 Mon Sep 17 00:00:00 2001 From: Ferdous Ahmed Adit Date: Thu, 26 Jan 2023 20:44:48 -0700 Subject: [PATCH 04/10] All the things work, 99% done --- server.py | 87 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/server.py b/server.py index a904121a..fa992ea3 100644 --- a/server.py +++ b/server.py @@ -54,19 +54,32 @@ def handle(self): elif self.extension == 'index.html': # directed to default index.html self.serve_default_index() + return elif self.extension == 'deep_index.html': self.serve_deep_index() + return elif self.extension == 'base.css': self.serve_default_css() + return elif self.extension == 'hardcode_index.html': self.serve_hardcode_index() + return + + elif self.extension == 'hardcode_deep_index.html': + self.serve_hardcode_deep_index() + return + + elif self.parse_redirect() == 1: + self.serve_redirect(1) + return elif self.extension == '404': self.request.sendall(bytearray( f"HTTP/1.1 404 NOT FOUND\r\ncontent-Type: text/html; encoding=utf-8\r\n\r\nThis works!", 'utf-8')) + return def parse_request(self, data): self.data = data.decode('utf-8') @@ -84,6 +97,8 @@ def parse_request(self, data): self.extension = 'base.css' elif self.parse_request_hardcode_html(): self.extension = 'hardcode_index.html' + elif self.parse_request_hardcode_deep_html(): + self.extension = 'hardcode_deep_index.html' # elif self.data[] @@ -102,17 +117,9 @@ def parse_request_default_html(self): return True return False - def parse_request_default_css(self): - end = self.data.find("HTTP") - if self.data[4:end] == '/base.css ' \ - or self.data[4:end] == '/base.css/ ': - return True - return False - def parse_request_deep_html(self): end = self.data.find("HTTP") - if self.data[4:end] == '/deep ' \ - or self.data[4:end] == '/deep/ ' \ + if self.data[4:end] == '/deep/ ' \ or self.data[4:end] == '/deep/index.html '\ or self.data[4:end] == '/deep/index.html/ ': return True @@ -121,54 +128,78 @@ def parse_request_deep_html(self): def parse_request_hardcode_html(self): end = self.data.find("HTTP") end = end - 1 - if self.data[4:end] == '/hardcode'\ - or self.data[4:end] == '/hardcode/'\ + if self.data[4:end] == '/hardcode/'\ or self.data[4:end] == '/hardcode/index.html'\ or self.data[4:end] == '/hardcode/index.html/': return True return False + def parse_request_hardcode_deep_html(self): + end = self.data.find("HTTP") + end = end - 1 + if self.data[4:end] == '/hardcode/deep/'\ + or self.data[4:end] == '/hardcode/deep/index.html'\ + or self.data[4:end] == '/hardcode/deep/index.html/': + return True + return False + + def parse_redirect(self): + end = self.data.find("HTTP") + end = end - 1 + if self.data[4:end] == '/deep': + return 1 + + def parse_request_default_css(self): + end = self.data.find("HTTP") + if self.data[4:end] == '/base.css ' \ + or self.data[4:end] == '/base.css/ ': + return True + return False + """ Serve the page methods. ---------------------------------------- """ def serve_default_css(self): - with open(os.getcwd() + "/www/base.css", 'rb') as file: + with open(os.getcwd() + "/www/base.css", 'r') as file: f_holder = file.read() + f_holder = f_holder.replace('\n', '') self.request.sendall(bytearray( f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/css{self.SPACE}{self.END}{f_holder}", 'utf-8')) + def serve_redirect(self, value): + if value == 1: + self.request.sendall(bytearray( + f"HTTP/1.1 301 MOVED PERMANENTLY{self.SPACE}Location: http://127.0.0.1:8080/deep/{self.SPACE}{self.END}", 'utf-8')) + + def serve_hardcode_deep_index(self): + with open(os.getcwd() + "/www/hardcode/deep/index.html", 'r') as file: + f_holder = file.read() + f_holder = f_holder.replace('\n', '') + self.request.sendall(bytearray( + f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) + def serve_deep_index(self): - with open(os.getcwd() + "/www/deep/index.html", 'rb') as file: + with open(os.getcwd() + "/www/deep/index.html", 'r') as file: f_holder = file.read() + f_holder = f_holder.replace('\n', '') self.request.sendall(bytearray( f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) def serve_default_index(self): - with open(os.getcwd() + "/www/index.html", 'rb') as file: + with open(os.getcwd() + "/www/index.html", 'r') as file: f_holder = file.read() + f_holder = f_holder.replace('\n', '') self.request.sendall(bytearray( f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) def serve_hardcode_index(self): - with open(os.getcwd() + "/www/hardcode/index.html", 'rb') as file: + with open(os.getcwd() + "/www/hardcode/index.html", 'r') as file: f_holder = file.read() + f_holder = f_holder.replace('\n', '') self.request.sendall(bytearray( f"HTTP/1.1 200 OK{self.SPACE}Content-Type: text/html{self.SPACE}{self.END}{f_holder}", 'utf-8')) - ''' - Content-Type': 'text/html; encoding=utf8' - self.request.sendall(bytearray(f"HTTP/1.1 200 OK\r\n")) - - - - if self.data[:3] = "GET" - f = open(index.html) - f1 = f.read - f.close - self.request.sendall(bytearray(f"HTTP/1.1 200 OK/r/nContent/r/n/r/n{f1}", 'utf-8')) - self.request.sendall(bytearray("HTTP", 'utf-8'))''' - if __name__ == "__main__": HOST, PORT = "localhost", 8080 From df5ecfe07d795aadf28511ab23959e8c33ba9c58 Mon Sep 17 00:00:00 2001 From: Ferdous Ahmed Adit Date: Fri, 27 Jan 2023 02:34:17 -0700 Subject: [PATCH 05/10] Uploaded root.png and deep.png, changed the license information --- README.md | 11 +++++++++-- deep.png | Bin 0 -> 15135 bytes root.png | Bin 0 -> 13658 bytes server.py | 4 +++- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 deep.png create mode 100644 root.png diff --git a/README.md b/README.md index d6888ed1..68f2aa46 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,17 @@ server.py contains contributions from: * Abram Hindle * Eddie Antonio Santos * Jackson Z Chang -* Mandy Meindersma +* Mandy Meindersma +* Ferdous Adit (1538839) But the server.py example is derived from the python documentation -examples thus some of the code is Copyright © 2001-2013 Python +examples thus some of the code is Copyright © 2001-2023 Python Software Foundation; All Rights Reserved under the PSF license (GPL compatible) http://docs.python.org/2/library/socketserver.html +* root.png +* deep.png + +Screenshots are derivative works and as such subject to the copyright of the displayed content, may it be a video, television program, or a computer +program. Thus, screenshots must not be uploaded to Wikimedia Commons unless all content in them is under a https://en.wikipedia.org/wiki/Free_license or in the public domain. + diff --git a/deep.png b/deep.png new file mode 100644 index 0000000000000000000000000000000000000000..6366ad69a49467d6d44c0875e3db2f5d0cf79819 GIT binary patch literal 15135 zcmeHOX;f3!+NQU4stUCZh)nl-ui7e-0+kt3Cs09g1Q{eELX;^2LV!$GRNBgLTZR-d zi59CUqhbglBu7O^OMn!agd`jhLxhllgyaM=ebIQoKi{9b*8TO}ve(MWJ}2kA+53H; z{p@!?`<(9&9|~Og>4r}&EG$;;-?!(eg~bxQg~i9UOBb8Yq(nToHhq1Rel&2GMO}~G zr0L)j-P`#WcYNNSzbAG1 zfydP)UxJBSEIkXq{p_Tz0Ru0Zo$5MZ$9_n%J8#UAF#lruUsL(!>#=vuGnK#IlrJ~e zK0Bm&*D6z4x<&Wlx+|;kADPcRTLzdb7GqZs=GvtT&tT@-H=h5G%|WSSX#BCB#kpyj zZYT%MuDj!pXf#ObLUtF&Zm}vpBEt)84|eWu3@*t#U!GsYk)JlsG)_C_cTT>k>$M?cbdwafZK&T+kd zWiTf^5rDC`>gs$;s*CTzzX{KOdZhe2GkCt?u&;nTrGmM36N@mP#I~M2rJfs*XGQh^ z%K^ttKDs93Z!un>W6)HUN&_ix$s-vEt09%=dg7#YYnoOT1iDOJ0}qHinjCVA6Wto$ zcfr(y&+sDQM2(NFqz2m_sdt`UgAbwucAo-{|M1bJTx*Hb)UuZKDbtz}eogSL)-=S} za(S6N5@pPCb0&`-2QT1nZf}$6?%qssLLaRwHN*SXjKLJBt!&$!XX@<`xZaHqPiSyo z6sL+F@|0=LI{bHFqDG%Hx(*-a#v3BSzd&UFg}^eIsVLg?KG5<&rBsd~WS?BD)h0r| zr}Eo4icP4U^b;CV+02on`CS`zhR{)m<@b;RA=LS*s|IvLa^yUpacEW?9c~Verkm-e z8+7{wAS!vR^2@66?lat+m#y`0&wQPlkQr9j!4}?PVN+BZ!_!nRARBp>w^=s`^-Z+c|p(6sbHeo>x~cPl#nFl%Ks&R5bJ3HnzD>iv}rS1)_NWTgr04iutTE4tpV z9z%yp>tPRYX@}JnapLsTSgOG$(}e*zTW_g!)it#QXH)B|x&GwfYHq(%znafVDI(P^ z^52FYA_^aSFAm{7^0mC4e7}&*9(1!7#ZoUL<~5IM=fLgf`W) zN53pi0mKqM9MPI?K(nqi^b14@WW=!)+R> zL^^Ws3bEt3o=#0wIzhxvJzQH!=z&7V(3z1;FintKxnDUfv*OTAV9PSIN3w3kPOw>m8~M zgk7Qv^R$BfC;AE~%pYW9=G3ENs5vR48f3lvx(eAd084pxUQ745T3TrROx8+{!4B?u zTKf!@99{cp*|pl#Ec$_M8DCEp?WfL3j+M;eLzfJfcH6XZ7s(3#>Ak+>>C^r6gm{1d zD3TMrZ`{*~&0ZpWb@s*c+Y30RilIKQ{jo-Si74n z)#uMiu^CvZ!|e$V;dH9jsGfK*uwg#hs=_k|Giq3wm2&MOg%vwHJ3ps?97V1%vZjli z9V%0JT6|EvaQ==x+9xcj8E|T2i^y{+kB#SIE;Kb+A;Z|+i43j%djipX!N>!>9)lO;garVW#R^z_`S3T&p>5gU=H z=i%%!wU|Y_e1QAwFO>2lEjIWN@29wko)K=?`1!K<*z34f8_*qjd6bO)OPWVrXtX7e zaWk>Da`oOJSw_xbXXy<#?Fgw+QeM8$~ zu@eI=6z4F$A9|1gxAb13{(BD-Y9$z1Nqc2#M^-DQ1BK})>K)3)2Rz} zw|%&|WHy`{mrRoIHTfjSQ(Obs7gmG!NCdzZE9Zz(*7$Z~QGF zY3lj?Au{1Qt6|^@b*?SBye58#>C!|+@@hLydpcF7VkS<7c??cdFGD`hWF1YYRoiGU z*^!HWPk`4@K92n4jXEcONO(uj??6Tyop{`9r^t;(;@SX2gCvDF(e>MQwQya_k7-}w z=j|dTqT1QL?O`k*99Wd#>u`-!6aqzoH`g-MbRWQ028Tu=gMdq2-zJQchOHxBcUYlC zw)t1f)-&Te!KTft#Stx84b~<4xJ*3bd#3+iJ-}GDFKvhe2q-t^~!d*8bANY3t7Rnv!y^ z$a(27zBC?aCQCD0KVJtG);0Mas%Ru@GesRu8A#`pMi|Wn*lryNuDhLPybu*iTSFE^ zpAfap&x3g9I#cgXJwt6%NU+!zp5j23AhPFYM7EI*u^ z+Tt1Ygzct@`i~D&)Ow$*pqA4%8l)Lq$E6xRHlFcqoUR=DWqjR{v_xD?we62n!-afA=&*6u5%?EK4_dh!p5eBu`eEjw+TR}s7Fe@$PGTWC)C0-j(nwNv{ac>^ zpKIU_)H`(bE4Pi&(yhRPapg#sQcpL7YH0d1yf~Z*>w29GiWRA|-IghH31hTEyFlE- zW0dJR^Hb0UtI^eer^%wy&GDm0`o2{7r>0C?(Og#T0$Nkysz(v2n zHsF!y;xzB5o;8j;5I;%ON_TgfiYn{rz@=5Ycw)R4`#4ex^n{jmmI$RZT}F}_d)fN^ zpi2%yBaqPUu#R8U{;-H7XEqrZ3#(Q$8EmA|F#H}JPm0tNavsJJ+}?2=I-^e;gKh_R z_{E&ZA3GFMhafYt=!dEGATyUJO~)eYLh_2V7v<|;>}o?Xi$*xdD;dMES|mQb#lUxm zz8medX7s0Ll%QY%aRe&4?Or+O1Gb4QA3qU)6nbHpl47y$J=aw#)`UPb>H`|b3o%21 z*FeZn#wS**#YLfnH!q?L_!-SkuX29!bAy&M*4HAQ8Ik?teS76&qwDcV;Z#<=9m~BU zas1Kkfwxf`E_M@_1Nte>NdSxL)TViPZylfM4X~4eNM)K&H05u)ew*EGvW~9K;uqy| zts+MX<22~`6(0-Ir)&x&swPO)xts1Cfw=1vnO%*eU(KslrQg8~zY19n46xwSPR2D> zwk8)(FvCv@7kY zO$h@1_EU0#&uJt9MzYoiXeEN5h|LxY+G}}fi$}tKcN#^;ML1JwyRJ7KA zqs1UGh=8}Jtj3F#wDfXOZfbc7)?i9>CiH+6C)>E3GyD2XGRZMj$`tA06V1@vExC3l zu&Hq}+Xm;e6~)5Mn9|ghgJA3hMHf>btM8oaDEgb(_tCsOaPD!wmAdoQ)$%jRjpE{h z@cInh^vX|x7)>oQqOQJrL%oSE1#w={e78oU;z`CAEq-vPwyEDwY`Xy#dN|MNE>8A$ zbgXD+D)iIwtAgTbB4NYoqw^aRBzafCo`)k@6d5uub$M@@syXuyAKO`~L?S@vji=#g zIgQy=!e-&we(TMMqwMa%n%|^JgH+B(j>p+8D52vj3(Og?ir%l(pYXcRLMC!0Sh|>1 z_0lLPKfwl=+$9-ZlG;p}r@xZdj@qZqz~r{MvRD}3dXXtJ^|DEx)>?T%qcaAaRuLWAJu8g1hjP&%Abli2aQ<I=$_gR!%Q3<(c|Uizh&_`}%|rBLN8)+zG(*+fQXQd&$8P9xQJQQQY_yBAb!}wPJnCcr!0tQe@-Zno!5KY&v5DaXeQqjLk(2 zWJZ^W$)C?p(R=;KR(-BEj>IwAiN_mCP;KL`tQOpkU{-vn1iD^)1Sx>=*|P(&5e3Oy zc7*n&)Ujl|kCUc6`C9CWJIUIRQpDw74p0(SirE%s;~N?bYjj?(j7 zNykN97qUl(>g}<%W#cmgjg9#rMp}y**8&Rd%-`Ht6#H86haue)@TY+)sPDqXqdi;t z5@6~`9L@4Z^*@|?9!~AB9#~d4_ugqwij;RTIt6>s5q!l?m+DXZL2q%%E3T1(vOj)5 z!YKzdafz>ODeZJA& z(=9c5zgG>@DqXWP*rTP_W2n=w?nH5KVn^8qHRG*ci>{%S>;FFfR74eeUeW*}~2~jzj0!vx6U`zCUD;E#8`V zz;Y#EJKyGRzVRDLUz@DE`{3N1h+<9LW0<^0>6A#4m0giFdA*a(87O{E(waV@f+G@p z^1G^%9U`3#voE*uGi6)&(GmqcwY;V*+?Vcv=hd4envubIklTGYx;16o&1~Po374bM z8}!=P6}5r(--0RW0n=Nb`%{95F*HA0^vsRkJ2`h}zWTB_evv>Fx{8M94jAhKF*xxU zdJdncZz7lSedRj!V7+#_oMSfmBuqUyhF%-Y8<%7*1G-&pU7*R)7OUd@%K2^;EH{bD zgk9sAw3_2a8jd^K@j9*FuZVVnQv-bP!;_W}D?qE&UVq8hpjz>Y#@nt7U0&K7n^ik_ zr1o^`q_F)5ht46~Nkb}{YJo71`8o&0RY82&1-GeN zjHW0iDMMqQ;Skx{)Z6v>x?J;G;1W@HDE?p4u`cyLP>dm;6@c+eqoxnRfg1!mw`cW2 zicvYF5CQsobC9iGOW;t9vw#rjhQp&@`-UsjquXAC8E}Y0@G8KIx@KPR+H&IU0%0Tk# zvw8pl@RhF3gWqO7)V==ccd^@5iUXpMsu})dLakI~ne?X9EjhZm3-fF6JQDmIGC(5m@3i|FkLIEYW)@;tMt(FoQi z3tpB9wX|48J)jd$s;)zr6yAq;a!q4|W{(StwFV3dNEO~t-JpFfEcTgc8tlqEWz|tT z+*B=RtO^+#I)UPznd>cl6ru_Uoe18S3iG)*RM)67Pn* zr3t&OXV3&=mhIp(6o^b{x<`c#`Uk1z2|9*~Ud>f-3*_5BK=4VJYLj$^(ZWx+{}$cC zM%nvoHzvxa1x@6ABcC=4{^04M1by{yd_1Kf4$*IokNjKa_G$G=3@bcL#MIJob6!R* zM=^8aw`ibC`6A&%%wLJ;X60IZ#$S^WY1x9b4rzMtMVm0*&c}Y&(W`-6RS0X765i2wiq literal 0 HcmV?d00001 diff --git a/root.png b/root.png new file mode 100644 index 0000000000000000000000000000000000000000..c9801750c1b222ef29fc0992ec6f5056bbf0ea4a GIT binary patch literal 13658 zcmeHO`Cn5<*S`TlT2X4X0?N|b)}+pV6+}qbAwaf@N?VjX&r=o^ zByBA!0zr%rAR9;_B1=kHf`kw>hG148gb+fK_on!~|G@jp`)N6!Pd+m@cV^DaS-$to znR|aY78J1h{f+Mf0I>SdLBA6Ku#x}(=1;6F!GHb}{X7*cAgLz;_5zj2}!o=KDhd?k5{a-JonWx zvuE1!{>VXUbMpe5F=nsSzfoVwt;40Kr^oiu;ir`A!5NrnvsKGqB>;S~;>=Qw@PXOR zrP^0k5WA(?$5#RCrP>Gk0n-XWvibxtU#eaGfB;#l?f?4>_m~=7F$xQ2^A*Ymooy$W zj}X&iX`^KJt9d31hK*!B>N55#qVJ&jf%kC4Slh!*(}(!AxCuAfc~BHd6NAxMu#}0Y z@sTjyV?!oY_B2aNFZ6b{-XD!{Et)w@4Xj1#`uQhN5wOu90GH~9-yxDrjZmkfty&ll zsNdYa8OKen~A19DFV%@q^P!{V)`E4M*E!m7~99 z)$+Bz`xIpULUm7v-pz76=CVhUGa=`wPq?5%Y_l}2Ow+Vx7tW-g7Re~h)!~^ESj5e2 zRo$n6XQrzaVXJ7zit!nGq4XY-nawKP%D)V@@BM8-x&{CUch_`KyWznl49V$o54Lp+ z0=pd`6}qn_RORII@ET!3xG!iDWf#>Yj$kidU{7JSaG@ThkE6r_OnlZ;+0TXEW>Y_S zxj@jDy^U62oAD!6EE!l1OWu}LVA65$Laf?1l8a1zB(o1=*Uv)dN z0;B62N3Y{5OBOVnaydUUlsY180)W!}U|z1*Ra%MI;&Me!Y(@kYvCL;AT_z zh}@FEEd3*tH_ni}DfifLLlgJPd8`|h$($^<(f<)i3xyAH_>`aUcUBh!vx~a=bq(|A z^A2mI4MziXHUatHL#=U|zS#wjj%g;N_wEAobVHT0s;4k2)WgnGBL4EDk2UYLKrg#S z*E0R_aHXa;*tq!W7U%ZZRsbK(iMv>ueN%bVPwuIejpWebw=Rwr^f6OaqTE~F4nklt zM_)!xBjLlj=Ty#WSnXVwL>tKP0M$r3sjpZ8mj2M+pd_^pbFSlpqm5+d?)_h7O}p_E zs8wMrh0n8pDcqV5C!!7mxKNIoW~gtzs0;D$Y;8=YhHD=cmO2;CTxv_7uZUvdNIuyR`wPo$N}a4aIx){|;6KIe%35=XL?YS5bv%(tQWxgKOWO#Ndvzy1L?b%?GUP`KdLQx#(&J0LSp3gHF0L&gpe;QOeF+*Y=Y3@>W)& zBD7D!n|k~T86$b3m~;A_#g3gPf%1(3RxQvFa?dj?tB{?Zm4BaCzR8=JK9{sb;B^UaZbo4XPh6;P`1OWu_sym% z4#=>_iCHWbG=-WF-S+Zl{jJCyqJ>K_lfzz{$DF#?!!rOUi@{3qM*=eU>?J6`oyJnh z)D46OE9RzQtw*3$+rOgLD_fXOu+D96jq#K^n%#>txz^>%#WK5~x&#W&{ilkb6 zjQk92IJw+y%{NU8h+$a$Yxg^|O9V!f-~MgIi z^-;nCn9{^g;CA7H9C2Rg_TXl*m4-*^1R`#7bPF}81LA{_dEq^aS!`Jv;G>Am6zd0( z*WEGEMCJop%yGf+o-QX)%l8deK+`?b{w5Wtu@j0dYKK2UXVxHo{Na4ywQgO>*4GnN zCs3HDSPzv_c>69gf%m{k#q;fsci*Fvrfo4#qWQNWCBq-N<%wx?`Vq1Hp8;v-AoHsc zG%hDtlSpaDD~kmR;Z#$*dXtf*niRI_Cv;B2(B~%6?pNEI!VwoIOrtL2i7I@X&FcY7 znTzPm&bH)satke9fBc9;eE*T5I+8>em0$HW6c@Ea)VuYbkXsjbeIj>`{;D-YvyyU+ za{(wv*C@*~rTfA;RHkuSm8u+2_8;0;31B`XMXFRaYGZVaIwy^$puEl5YjjNImRYwuS8PA}Y?fLfKMF;Zz3Nvm4<(C z^Lf8*&dgeOdjeY-_gc%L^=8Ux-x>`UB+fPi7X>)nY`7okAmH;02Zhs3=Bq~()5d`x ze>jE{Q5KAssM!zoc%A&cfHZId?vD)FCI!4Y6*^ixH?ttW^kC5=-Q`W{#f!yn{>1MB zj44Qc2M9L2g(_kPDw zh!uAdbpaMUm=oS9J)*J;C-M1-s~&+>vYBBef!EH0(?$HU&}9OL0|~U@1NRSCz_K#z zUVCJPQtc6|GJM9|L^$|ZlF`{GT0kbo^@O3Tg&p;L@y@xKtnHawVzy|`X4_4M!E~bJ z?HYehm}A~ETeUK?`R92gpUEv3?o%7WW#PRcHM|IC&U%y(1D|MndrW((6uR&Ga{Pdl zo^hkON9cR&?vH)QhD$kP3Ch+0DQ}cc%MQFB0|=_vZxI}Xq`q;VSBX@e&hArP4}Gl2Yeus@ba^w-IRZ?6k`eJZ5|AO0kmrNrwrUD5`Gqo{u62m%(8bGNnegn-MU zAwlo^E4tkxj7Qv$X$$K4?5;zJq#<3`d2EQdFhUzrUOd+@k<7m5`*4$BBGYF?H=@qw z=Ojis6s9nGs!?51k|zrm!9{svDKsk1u#9PBMdr%|_{N*q*b?Jb1Woji z&6qj6U4yEz)crDtrA1QXsIesFx5lzT7Q#;d^(xS>{)+2EM%EMdUU%*qamQp9*c{e2 z@xTa;aK4g723rvJf+3^)&RY1M5o8m%V6TRSF4M;5);hw`v7b2p+%&eGV9O@3;ir|X z>USO9&=>0prD9v|^hC{xsI)G2l#iRJv$`-evnTNu#2O4|wn*Guz{Y1#UjR8<rbF? zCtnn8$jal+Mr@}v%O=DX4lq{{5#_;F{4B<&KYN*1;>O*R*uSf77B(OCMIH_ALOC1*dAC#Ki7dyp&_d27Aj;jb z5i~UuT_4K^m^m6$mXe{FpnikX@H4wwTYae$+fJLmZR^U76*ttK4zlIB4N(t{_B@ss zLp=}?Ln}w8RoC7 z;9c4^KRFcpe9ku`)gyAn*eltn)~6&UJy86zy1Uu@23Ng{%7`%vkk&-%MuKfE_0MG9 z4iTz#LWR^Zv2e|XDcakt7G zlv&$bRyr*iKp`7YJc~C-NFzS6ijrIEx;Zf-nu;Dq9RoKECVI@PL|Z1|H%)HHJ^I?d zr6&r~xazTLY9Xn?s#O)*l+J3ElS)3xJV~%QKRpM~y>Q-&Y(K?nk_Bvb>eY4AHqAu- zpbC8Kr4Y1zN}hYx*6ucWMVDwMrPOsKN|I=#KenRhazk#z=>Y(FsG(BqWzB?|5zXJF z30j!F7(me`OPS@&%27PJ%AU54n(5Rla}2}QBrnQKG~ZE6_l(}$kP+MvFMbI|jeSqF z%)6+e$J93zqK&1O5-mhZUCN_#!vMOq}-haSiv=1%r}Q%rfYs`GO@jKyN`K zuqajI3t0wH{|uLf{T3%Lmd88cdCdQ^O|raZF&^E;#p?pJua!_U<2?*^z%1gn3DHbc zb}AGy--ocBp5rFIFzUf!@LXaP!Q#wccY*QhY$;@3!KaBBnlTq8T@{q|zves{MwgTH z-Zo7+e9P?V?s3Bq2bB0@X2D?Ws>CR+b8OaONj;XAAZo+foKL4NDg`^ZM}0Vr?F!Z+ z1tVxzXp^st;SpmUlVR2zX_9qJAcrV$tF7&azRSo2)q}UL^sC}~D+^G~nd(9)8#N!OB&S=<1g?9w& z^57PQ=$X9z@TQYPXZaBjfBVCqIcuJ#5m@a)1oWPWOtx>68Rhv(yb zuCwj0n(`qajUUMZ72Q+c*rc8NUA3)wdjq-qKaPvori8UY!RHeA6Vj}M{04G Date: Fri, 27 Jan 2023 11:52:05 -0700 Subject: [PATCH 06/10] Update server.py Updating licencing --- server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.py b/server.py index d3f48c35..d7ce49b9 100644 --- a/server.py +++ b/server.py @@ -2,7 +2,7 @@ import socketserver import os -# Copyright 2013 Abram Hindle, Eddie Antonio Santos +# Copyright 2023 Abram Hindle, Eddie Antonio Santos # # Updated by Ferdous Adit, 1538839. # From e14924333ae570533b39fe540fafac936f9eae2a Mon Sep 17 00:00:00 2001 From: Ferdous Ahmed Adit Date: Fri, 27 Jan 2023 13:47:02 -0700 Subject: [PATCH 07/10] Updated the references --- README.md | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 68f2aa46..6fc6836f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -CMPUT404-assignment-webserver -============================= +# CMPUT404-assignment-webserver CMPUT404-assignment-webserver @@ -7,27 +6,49 @@ See requirements.org (plain-text) for a description of the project. Make a simple webserver. -Contributors / Licensing -======================== +# Contributors / Licensing Generally everything is LICENSE'D under the Apache 2 license by Abram Hindle. server.py contains contributions from: -* Abram Hindle -* Eddie Antonio Santos -* Jackson Z Chang -* Mandy Meindersma -* Ferdous Adit (1538839) +- Abram Hindle +- Eddie Antonio Santos +- Jackson Z Chang +- Mandy Meindersma +- Ferdous Adit But the server.py example is derived from the python documentation examples thus some of the code is Copyright © 2001-2023 Python Software Foundation; All Rights Reserved under the PSF license (GPL compatible) http://docs.python.org/2/library/socketserver.html -* root.png -* deep.png +- root.png +- deep.png + +Screenshots are derivative works and as such subject to the copyright of +the displayed content, may it be a video, television program, or a computer +program. Thus, screenshots must not be uploaded to Wikimedia Commons unless +all content in them is under a https://en.wikipedia.org/wiki/Free_license or +in the public domain. + +# Credit or References + +- BogoToBogo +- https://www.bogotobogo.com/python/python_network_programming_socketserver_framework_for_network_servers.php +- Network Programming III - SocketServer + +- Tech With Tim +- https://www.youtube.com/@TechWithTim +- Python Socket Programming Tutorial +- https://youtu.be/3QiPPX-KeSc +- Youtube -Screenshots are derivative works and as such subject to the copyright of the displayed content, may it be a video, television program, or a computer -program. Thus, screenshots must not be uploaded to Wikimedia Commons unless all content in them is under a https://en.wikipedia.org/wiki/Free_license or in the public domain. +- jbx +- https://stackoverflow.com/users/340088/jbx +- https://stackoverflow.com/a/53070496 +- Stackoverflow +- PyMOTW +- http://pymotw.com/2/SocketServer/ +- SocketServer – Creating network servers From efbc29f8e8bbf0e90730c203cb97a16f8efe7802 Mon Sep 17 00:00:00 2001 From: ferdousa95 <72733638+ferdousa95@users.noreply.github.com> Date: Fri, 27 Jan 2023 13:57:50 -0700 Subject: [PATCH 08/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6fc6836f..0b23f37b 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,8 @@ in the public domain. # Credit or References - BogoToBogo -- https://www.bogotobogo.com/python/python_network_programming_socketserver_framework_for_network_servers.php -- Network Programming III - SocketServer +https://www.bogotobogo.com/python/python_network_programming_socketserver_framework_for_network_servers.php +Network Programming III - SocketServer - Tech With Tim - https://www.youtube.com/@TechWithTim From dbe510626a70fb6942c2ac02db1c15959e3c644e Mon Sep 17 00:00:00 2001 From: ferdousa95 <72733638+ferdousa95@users.noreply.github.com> Date: Fri, 27 Jan 2023 13:59:03 -0700 Subject: [PATCH 09/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0b23f37b..5bbbf94d 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ in the public domain. # Credit or References -- BogoToBogo -https://www.bogotobogo.com/python/python_network_programming_socketserver_framework_for_network_servers.php +- BogoToBogo
+https://www.bogotobogo.com/python/python_network_programming_socketserver_framework_for_network_servers.php
Network Programming III - SocketServer - Tech With Tim From 1027bcc172651766a73230718aca94515c5fb3ee Mon Sep 17 00:00:00 2001 From: ferdousa95 <72733638+ferdousa95@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:00:03 -0700 Subject: [PATCH 10/10] Update README.md --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 5bbbf94d..6a2526ac 100644 --- a/README.md +++ b/README.md @@ -36,19 +36,19 @@ in the public domain. - BogoToBogo
https://www.bogotobogo.com/python/python_network_programming_socketserver_framework_for_network_servers.php
-Network Programming III - SocketServer - -- Tech With Tim -- https://www.youtube.com/@TechWithTim -- Python Socket Programming Tutorial -- https://youtu.be/3QiPPX-KeSc -- Youtube - -- jbx -- https://stackoverflow.com/users/340088/jbx -- https://stackoverflow.com/a/53070496 -- Stackoverflow - -- PyMOTW -- http://pymotw.com/2/SocketServer/ -- SocketServer – Creating network servers +Network Programming III - SocketServer
+ +- Tech With Tim
+https://www.youtube.com/@TechWithTim
+Python Socket Programming Tutorial
+https://youtu.be/3QiPPX-KeSc
+Youtube
+ +- jbx
+https://stackoverflow.com/users/340088/jbx
+https://stackoverflow.com/a/53070496
+Stackoverflow
+ +- PyMOTW
+http://pymotw.com/2/SocketServer/
+SocketServer – Creating network servers