Amazing-Python-Scripts
851 строка · 32.3 Кб
1from socket import *2import datetime3import os4import time5import random6import threading7from _thread import *8import shutil # to implement delete method9import csv # used in put and post method to insert data10import base64 # used for decoding autherization header in delete method11import sys12import logging13from config import * # import variables14import signal # signal to handle Ctrl+C and other SIGNALS15from supplement.breakdown import * # to breakdown entity16from supplement.last_modified import * # last_modified for condi get17
18
19class http_methods:20def response_get_head(self, connectionsocket, entity, switcher, query,21method, glob):22serversocket, file_extension, conditional_get, conn, ip, serverport, scode, IDENTITY, client_thread = glob23isItFile = os.path.isfile(entity)24isItDir = os.path.isdir(entity)25show_response = ''26if isItFile:27show_response += 'HTTP/1.1 200 OK'28scode = 20029if (os.access(entity, os.R_OK)):30if (os.access(entity, os.W_OK)):31pass32else:33glob = status(connectionsocket, 403,34[ip, client_thread, scode])35ip, client_thread, scode = glob36else:37glob = status(connectionsocket, 403,38[ip, client_thread, scode])39ip, client_thread, scode = glob40try:41size = os.path.getsize(entity)42f = open(entity, "rb")43data = f.read(size)44except:45glob = status(connectionsocket, 500,46[ip, client_thread, scode])47ip, client_thread, scode = glob48elif isItDir:49dir_list = os.listdir(entity)50show_response += 'HTTP/1.1 200 OK'51scode = 20052# if it is a directory53if os.access(entity, os.R_OK):54if (os.access(entity, os.W_OK)):55pass56else:57glob = status(connectionsocket, 403,58[ip, client_thread, scode])59ip, client_thread, scode = glob60else:61glob = status(connectionsocket, 403,62[ip, client_thread, scode])63ip, client_thread, scode = glob64for i in dir_list:65if i.startswith('.'):66dir_list.remove(i)67else:68pass69else:70entity = entity.rstrip('/')71isItDir = os.path.isdir(entity)72isItFile = os.path.isfile(entity)73if isItDir:74scode = 20075show_response += 'HTTP/1.1 200 OK'76dir_list = os.listdir(entity)77entity = entity.rstrip('/')78if (os.access(entity, os.W_OK)):79if (os.access(entity, os.R_OK)):80pass81else:82glob = status(connectionsocket, 403,83[ip, client_thread, scode])84ip, client_thread, scode = glob85else:86glob = status(connectionsocket, 403,87[ip, client_thread, scode])88ip, client_thread, scode = glob89for i in dir_list:90if i.startswith('.'):91dir_list.remove(i)92else:93pass94elif isItFile:95show_response += 'HTTP/1.1 200 OK'96scode = 20097if (os.access(entity, os.R_OK)):98if (os.access(entity, os.W_OK)):99pass100else:101glob = status(connectionsocket, 403,102[ip, client_thread, scode])103ip, client_thread, scode = glob104try:105size = os.path.getsize(entity)106f = open(entity, "rb")107data = f.read(size)108except:109# error while accesing the file110glob = status(connectionsocket, 500,111[ip, client_thread, scode])112ip, client_thread, scode = glob113else:114glob = status(connectionsocket, 404,115[ip, client_thread, scode])116ip, client_thread, scode = glob117show_response += '\r\n' + COOKIE + str(IDENTITY) + MAXAGE118IDENTITY += random.randint(1, 10)119for state in switcher:120if state == 'User-Agent':121if isItDir:122show_response += '\r\nServer: ' + ip123elif isItFile:124l = time.ctime().split(' ')125l[0] = l[0] + ','126conversation = (' ').join(l)127show_response += '\r\nServer: ' + ip128conversation = '\r\nDate: ' + conversation129show_response += conversation130show_response += '\r\n' + last_modified(entity)131else:132pass133elif state == 'Host':134pass135elif state == 'Accept':136if isItFile:137try:138file_ext = os.path.splitext(entity)139if file_ext[1] in file_extension.keys():140conversation = file_extension[file_ext[1]]141temp = 0142else:143conversation = 'text/plain'144temp = 1145conversation = '\r\nContent-Type: ' + conversation146show_response += conversation147except:148glob = status(connectionsocket, 415,149[ip, client_thread, scode])150ip, client_thread, scode = glob151# scode = 415152elif isItDir:153conversation = '\r\nContent-Type: text/html'154show_response += conversation155else:156pass157elif state == 'Accept-Language':158conversation = '\r\nContent-Language: ' + switcher[state]159show_response += conversation160elif state == 'Accept-Encoding':161if isItFile:162conversation = '\r\nContent-Length: ' + str(size)163show_response += conversation164else:165pass166elif state == 'Connection':167if isItFile:168conn = True169show_response += '\r\nConnection: keep-alive'170elif isItDir:171conn = False172show_response += '\r\nConnection: close'173else:174pass175elif state == 'If-Modified-Since':176if_modify(switcher[state], entity)177else:178continue179if isItDir and method == 'GET':180show_response += '\r\n\r\n'181show_response += '\r\n<!DOCTYPE html>'182show_response += '\r\n<html>\n<head>'183show_response += '\r\n<title>Directory listing</title>'184show_response += '\r\n<meta http-equiv="Content-type" content="text/html;charset=UTF-8" /></head>'185show_response += '\r\n<body><h1>Directory listing..</h1><ul>'186for line in dir_list:187if entity == '/':188link = 'http://' + ip + ':' + \189str(serverport) + entity + line190l = '\r\n<li><a href ="' + link + '">' + line + '</a></li>'191show_response += l192else:193link = 'http://' + ip + ':' + \194str(serverport) + entity + '/' + line195l = '\r\n<li><a href ="' + link + '">' + line + '</a></li>'196show_response += l197show_response += '\r\n</ul></body></html>'198encoded = show_response.encode()199connectionsocket.send(encoded)200connectionsocket.close()201elif len(query) > 0 and not isItFile and not isItDir:202show_response = ''203row = ''204entity = CSVFILE205fields = ''206for d in query:207fields += d + ','208for i in query[d]:209row += i + ','210file_exists = os.path.exists(entity)211if file_exists:212scode = 200213show_response += 'HTTP/1.1 200 OK'214fi = open(entity, "a")215row = list(row.split(","))216csvwriter = csv.writer(fi)217csvwriter.writerow(row)218else:219fi = open(entity, "w")220show_response += 'HTTP/1.1 201 Created'221scode = 201222show_response.append('Location: ' + entity)223csvwriter = csv.writer(fi)224csvwriter.writerow(fields)225csvwriter.writerow(row)226fi.close()227show_response += '\r\nServer: ' + ip228show_response += '\r\n' + date()229f = open(WORKFILE, "rb")230show_response += '\r\nContent-Language: en-US,en'231size = os.path.getsize(WORKFILE)232conversation = '\r\nContent-Length: ' + str(size)233show_response += '\r\nContent-Type: text/html'234show_response += conversation235show_response += '\r\n' + last_modified(entity)236show_response += '\r\n\r\n'237encoded = show_response.encode()238connectionsocket.send(encoded)239connectionsocket.sendfile(f)240elif isItFile:241show_response += '\r\n\r\n'242if conditional_get == False and method == 'GET':243encoded = show_response.encode()244connectionsocket.send(encoded)245connectionsocket.sendfile(f)246elif conditional_get == False and method == 'HEAD':247encoded = show_response.encode()248connectionsocket.send(encoded)249elif conditional_get == True and (method == 'GET'250or method == 'HEAD'):251status_304(connectionsocket, entity, [ip, scode])252else:253glob = status(connectionsocket, 400, [ip, client_thread, scode])254ip, client_thread, scode = glob255return [256serversocket, file_extension, conditional_get, conn, ip,257serverport, scode, IDENTITY258]259
260def response_post(self, ent_body, connectionsocket, switcher, glob):261ip, serverport, scode = glob262show_response = ''263entity = CSVFILE264query = parse_qs(ent_body)265if os.access(entity, os.W_OK):266pass267else:268status(connectionsocket, 403, [ip, client_thread, scode])269fields = ''270row = ''271for d in query:272fields += d + ', '273for i in query[d]:274row += i + ', '275file_exists = os.path.exists(entity)276if file_exists:277fi = open(entity, "a")278show_response += 'HTTP/1.1 200 OK'279scode = 200280csvwriter = csv.writer(fi)281csvwriter.writerow(row)282else:283fi = open(entity, "w")284show_response += 'HTTP/1.1 201 Created'285scode = 201286show_response += '\r\nLocation: ' + entity287csvwriter = csv.writer(fi)288csvwriter.writerow(fields)289csvwriter.writerow(row)290fi.close()291show_response += '\r\nServer: ' + ip292show_response += date()293f = open(WORKFILE, "rb")294show_response += '\r\nContent-Language: en-US,en'295size = os.path.getsize(WORKFILE)296conversation = 'Content-Length: ' + str(size)297show_response += '\r\nContent-Type: text/html'298show_response += '\r\n' + conversation299show_response += '\r\n' + last_modified(entity)300show_response += '\r\n\r\n'301encoded = show_response.encode()302connectionsocket.send(encoded)303connectionsocket.sendfile(f)304return [ip, serverport, scode]305
306def response_put(self, connectionsocket, addr, ent_body, filedata, entity,307switcher, f_flag, scode, glob):308ip, client_thread, scode = glob309try:310length = int(switcher['Content-Length'])311except:312scode = 411313glob = status(connectionsocket, 411, [ip, client_thread, scode])314ip, client_thread, scode = glob315show_response = ''316try:317filedata = filedata + ent_body318except TypeError:319ent_body = ent_body.encode()320filedata = filedata + ent_body321isItFile = os.path.isfile(entity)322isItDir = os.path.isdir(entity)323i = len(ent_body)324size = length - i325# r = length % SIZE326# q = int(length // SIZE)327# isItDir = os.path.isdir(entity)328# isItFile = os.path.isdir(entity)329for _ in iter(int, 1):330if not size > 0:331break332ent_body = connectionsocket.recv(SIZE)333try:334filedata = filedata + ent_body335except:336ent_body = ent_body.encode()337print("encoding...")338filedata = filedata + ent_body339size -= len(ent_body)340mode_f, r_201, move_p = True, False, False341limit = len(ROOT)342l = len(entity)343if not l < limit:344if isItFile:345if os.access(entity, os.W_OK):346# no need for read access347if os.access(entity, os.R_OK):348pass349else:350pass351else:352glob = status(connectionsocket, 403,353[ip, client_thread, scode])354ip, client_thread, scode = glob355# writing File mode ON356mode_f = True357if f_flag == 1:358f = open(entity, "wb")359f.write(filedata)360elif f_flag == 0:361f = open(entity, "w")362f.write(filedata.decode())363else:364f = open(entity, "wb")365f.write(filedata)366f.close()367elif isItDir:368move_p = True369loc = ROOT + '/' + str(addr[1])370if os.access(entity, os.W_OK):371# no need for read access372if os.access(entity, os.R_OK):373pass374else:375pass376else:377glob = status(connectionsocket, 403,378[ip, client_thread, scode])379ip, client_thread, scode = glob380try:381loc = loc + \382file_type[switcher['Content-Type'].split(';')[0]]383except:384glob = status(connectionsocket, 403,385[ip, client_thread, scode])386ip, client_thread, scode = glob387if f_flag == 1:388f = open(loc, "wb")389f.write(filedata)390elif f_flag == 0:391f = open(loc, "w")392f.write(filedata.decode())393else:394f = open(loc, "wb")395f.write(filedata)396f.close()397
398else:399if ROOT in entity:400entity = ROOT + '/' + str(addr[1])401try:402entity = entity + \403file_type[switcher['Content-Type'].split(';')[0]]404except:405# error in header406glob = status(connectionsocket, 403,407[ip, client_thread, scode])408ip, client_thread, scode = glob409if f_flag:410f = open(entity, "wb")411f.write(filedata)412elif f_flag == 0:413# open the file in write mode414f = open(entity, "w")415f.write(filedata.decode())416else:417# open the file in write binary mode418f = open(entity, "wb")419f.write(filedata)420f.close()421r_201 = True422else:423mode_f = False424else:425move_p = True426loc = ROOT + '/' + str(addr[1])427try:428loc = loc + file_type[switcher['Content-Type']]429except:430glob = status(connectionsocket, 403,431[ip, client_thread, scode])432ip, client_thread, scode = glob433if f_flag == 0:434f = open(loc, "w")435else:436f = open(loc, "wb")437f.write(filedata)438f.close()439if move_p:440scode = 301441show_response += 'HTTP/1.1 301 Moved Permanently'442show_response += '\r\nLocation: ' + loc443elif mode_f:444scode = 204445show_response += 'HTTP/1.1 204 No Content'446show_response += '\r\n\Content-Location: ' + entity447elif r_201:448scode = 201449show_response += 'HTTP/1.1 201 Created'450show_response += '\r\nContent-Location: ' + entity451elif not mode_f:452scode = 501453show_response += 'HTTP/1.1 501 Not Implemented'454show_response += '\r\nConnection: keep-alive'455show_response += '\r\n\r\n'456encoded = show_response.encode()457connectionsocket.send(encoded)458connectionsocket.close()459return None460
461def response_delete(self, entity, connectionsocket, ent_body, switcher,462glob):463ip, serverport, scode, client_thread = glob464isItDir = os.path.isdir(entity)465isItFile = os.path.isfile(entity)466# print(f"deleting {entity} ")467# print(isItFile)468option_list = entity.split('/')469show_response = ''470if 'Authorization' in switcher.keys():471conversation = switcher['Authorization']472# print("Auth process started:")473if conversation:474conversation = conversation.split(' ')475conversation = base64.decodebytes(476conversation[1].encode()).decode()477conversation = conversation.split(':')478else:479scode = 401480show_response += 'HTTP/1.1 401 Unauthorized'481show_response += '\r\nWWW-Authenticate: Basic'482show_response += '\r\n\r\n'483encoded = show_response.encode()484connectionsocket.send(encoded)485return [ip, serverport, scode]486
487if conversation[0] == USERNAME:488if conversation[1] == PASSWORD:489pass490else:491scode = 401492show_response += 'HTTP/1.1 401 Unauthorized'493show_response += '\r\nWWW-Authenticate: Basic'494show_response += '\r\n\r\n'495encoded = show_response.encode()496connectionsocket.send(encoded)497return [ip, serverport, scode]498else:499scode = 401500show_response += 'HTTP/1.1 401 Unauthorized'501show_response += '\r\nWWW-Authenticate: Basic'502show_response += '\r\n\r\n'503encoded = show_response.encode()504connectionsocket.send(encoded)505return [ip, serverport, scode]506else:507scode = 401508show_response += 'HTTP/1.1 401 Unauthorized'509show_response += '\r\nWWW-Authenticate: Basic'510show_response += '\r\n\r\n'511encoded = show_response.encode()512connectionsocket.send(encoded)513return [ip, serverport, scode]514if len(ent_body) > 1 or 'delete' in option_list or isItDir:515scode = 405516show_response += 'HTTP/1.1 405 Method Not Allowed'517show_response += '\r\nAllow: GET, HEAD, POST, PUT'518elif isItFile:519scode = 200520show_response += 'HTTP/1.1 200 OK'521try:522if (os.access(entity, os.W_OK)):523if (os.access(entity, os.R_OK)):524pass525else:526glob = status(connectionsocket, 403,527[ip, client_thread, scode])528ip, client_thread, scode = glob529else:530glob = status(connectionsocket, 403,531[ip, client_thread, scode])532ip, client_thread, scode = glob533shutil.move(entity, DELETE)534except shutil.Error:535os.remove(entity)536else:537scode = 400538show_response += 'HTTP/1.1 400 Bad Request'539show_response += '\r\nServer: ' + ip540show_response += '\r\nConnection: keep-alive'541show_response += '\r\n' + date()542show_response += '\r\n\r\n'543encoded = show_response.encode()544connectionsocket.send(encoded)545return [ip, serverport, scode]546
547
548m = http_methods()549
550# function to check if the resource has been modified or not since the date in HTTP request
551
552
553def if_modify(state, entity):554global conditional_get, month555valid = False556day = state.split(' ')557if len(day) == 5:558valid = True559if valid:560m = month[day[1]]561date = int(day[2])562t = day[3].split(':')563t[0], t[1], t[2] = int(t[0]), int(t[1]), int(t[2])564y = int(day[4])565ti = datetime.datetime(y, m, date, t[0], t[1], t[2])566hsec = int(time.mktime(ti.timetuple()))567fsec = int(os.path.getmtime(entity))568if hsec == fsec:569conditional_get = True570elif hsec < fsec:571conditional_get = False572return conditional_get573
574
575# function to return current date
576
577
578def date():579# Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123580# Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036581# Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format582now = datetime.datetime.now()583datenow = now.strftime('%A,%d %B %Y %H:%M:%S ')584datenow += "GMT"585conversation = 'Date: ' + datenow586return conversation587
588
589# function to give response if server is busy
590
591
592def status(connectionsocket, code, glob):593ip, client_thread, scode = glob594scode = code595show_response = ''596if (code == '505') or (code == 505):597show_response += 'HTTP/1.1 505 HTTP version not supported'598elif (code == '415') or (code == 415):599show_response += 'HTTP/1.1 415 Unsupported Media Type'600elif (code == '403') or (code == 403):601show_response += 'HTTP/1.1 403 Forbidden'602elif (code == '404') or (code == 404):603show_response += 'HTTP/1.1 404 Not Found'604elif (code == '414') or (code == 414):605show_response += 'HTTP/1.1 414 Request-URI Too Long'606elif (code == '500') or (code == 500):607show_response += 'HTTP/1.1 500 Internal Server Error'608elif (code == '503') or (code == 503):609show_response += 'HTTP/1.1 503 Server Unavailable'610show_response += '\r\nServer: ' + ip611show_response += '\r\n' + date()612show_response += '\r\n\r\n'613if code == 505:614show_response += '\r\nSupported Version - HTTP/1.1 \n Rest Unsupported'615encoded = show_response.encode()616connectionsocket.send(encoded)617logging.info(' {} {}\n'.format(connectionsocket, scode))618try:619client_thread.remove(connectionsocket)620connectionsocket.close()621except:622pass623server([624serversocket, file_extension, conditional_get, conn, SIZE,625client_thread, scode, ip, IDENTITY, serverport626])627return [ip, client_thread, scode]628
629
630# function for conditional get implementation
631def status_304(connectionsocket, entity, glob):632ip, scode = glob633scode = 304634show_response = ''635show_response += 'HTTP/1.1 304 Not Modified'636show_response += '\r\n' + date()637show_response += '\r\n' + last_modified(entity)638show_response += '\r\nServer: ' + ip639show_response += '\r\n\r\n'640encoded = show_response.encode()641connectionsocket.send(encoded)642
643
644# function which operates between response and requests
645def bridgeFunction(connectionsocket, addr, start, glob):646serversocket, file_extension, conditional_get, conn, SIZE, client_thread, scode, ip, IDENTITY, serverport = glob647conditional_get = False648urlflag = 0649f_flag = 0650filedata = b""651conn = True652for _ in iter(int, 1):653if not conn:654# print("Connection not established")655break656if SIZE > 0:657pass658else:659break660try:661message = connectionsocket.recv(SIZE)662except OSError:663message = connectionsocket.recv(SIZE)664try:665f_flag = 0666message = message.decode('utf-8')667req_list = message.split('\r\n\r\n')668# print(req_list)669except UnicodeDecodeError:670f_flag = 1671# if you're using non UTF-8 chars672req_list = message.split(b'\r\n\r\n')673req_list[0] = req_list[0].decode(errors='ignore')674# print(req_list)675if len(req_list) == 1:676status(connectionsocket, 505, [ip, client_thread, scode])677print("\nBlank line expected at the end\n")678break679elif len(req_list) > 1:680# every line ends with a \r\n so for only headers it'll create ['req', '']681pass682else:683status(connectionsocket, 505, [ip, client_thread, scode])684print("Error in headers\n")685break686try:687LOG.write(((addr[0]) + '\n' + req_list[0] + '\n\n'))688except:689pass690# show_response = ''691# header_len = len(header_list)692ent_body = req_list[1]693header_list = req_list[0].split('\r\n')694request_line = header_list[0].split(' ')695if len(req_list) < 2:696status(connectionsocket, 505, [ip, client_thread, scode])697else:698pass699entity = request_line[1]700method = request_line[0]701if entity == '/':702entity = os.getcwd()703elif (entity == favicon) or (entity704== 'favicon') or (entity705== 'favicon.ico'):706entity = FAVICON707entity, query = breakdown(entity)708if (len(entity) > MAX_URL and urlflag == 0):709status(connectionsocket, 414, [ip, client_thread, scode])710connectionsocket.close()711break712elif len(entity) <= MAX_URL:713# print("working Fine")714urlflag = 1715pass716else:717urlflag = 1718version = request_line[2]719try:720version_num = version.split('/')[1]721if (version_num == RUNNING_VERSION):722# print("using HTTP 1.1")723pass724elif not (version_num == RUNNING_VERSION):725status(connectionsocket, 505, [ip, client_thread, scode])726except IndexError:727# print("EXPECTED HTTP version number")728status(connectionsocket, 505, [ip, client_thread, scode])729request_line = header_list.pop(0)730switcher = {}731i = 0732while i < len(header_list):733line = header_list[i]734line_list = line.split(': ')735switcher[line_list[0]] = line_list[1]736i += 1737if (method == 'HEAD') or (method == 'GET'):738# connectionsocket, entity, switcher, query, method, glob739glob = m.response_get_head(740connectionsocket, entity, switcher, query, method, [741serversocket, file_extension, conditional_get, conn, ip,742serverport, scode, IDENTITY, client_thread743])744
745serversocket, file_extension, conditional_get, conn, ip, serverport, scode, IDENTITY = glob746elif method == 'POST':747glob = m.response_post(ent_body, connectionsocket, switcher,748[ip, serverport, scode])749ip, serverport, scode = glob750elif method == 'DELETE':751glob = m.response_delete(entity, connectionsocket, ent_body,752switcher,753[ip, serverport, scode, client_thread])754ip, serverport, scode = glob755conn = False756connectionsocket.close()757elif method == 'PUT':758m.response_put(connectionsocket, addr, ent_body, filedata, entity,759switcher, f_flag, scode, [ip, client_thread, scode])760else:761method = 'Not Defined'762break763# use the logging formatting764logging.info(' {} {} {} {} {}\n'.format(addr[0], addr[1], request_line,765entity, scode))766try:767connectionsocket.close()768client_thread.remove(connectionsocket)769except:770pass771
772
773# function handling multiple requests
774
775
776def server(glob):777serversocket, file_extension, conditional_get, conn, SIZE, client_thread, scode, ip, IDENTITY, serverport = glob778for _ in iter(int, 1):779# connectionsocket = request, addr = port,ip780connectionsocket, addr = serversocket.accept()781start = 0782client_thread.append(connectionsocket) # add connections783if not (len(client_thread) < MAX_REQUEST):784status(connectionsocket, 503, [ip, client_thread, scode])785connectionsocket.close()786else:787start_new_thread(bridgeFunction, (connectionsocket, addr, start, [788serversocket, file_extension, conditional_get, conn, SIZE,789client_thread, scode, ip, IDENTITY, serverport790]))791serversocket.close()792
793
794'''
795Function to handle the exit ( Ctrl+C and other signals )
796'''
797sig_rec = False798
799
800def signal_handler(sig, frame):801print('You pressed Ctrl+C!')802print("q for quit\n r for restart")803sys.exit(0)804
805
806if __name__ == '__main__':807ip = None # IP808conn = True # to receive requests continuously in client's thread809scode = 0 # Status code initialization810
811IDENTITY = 0 # Cookie ID . This project Increments it by 1812conditional_get = False # check : is it conditional get method?813month = MONTH814
815# Dictionary to convert content types into the file extentions eg. text/html to .html816file_type = FORMAT2817# Dictionary to convert file extentions into the content types eg. .html to text/html818file_extension = FORMAT819
820client_thread = [] # list to work with the threads821
822serversocket = socket(AF_INET, SOCK_STREAM)823s = socket(AF_INET, SOCK_DGRAM)824logging.basicConfig(filename=LOG,825level=logging.INFO,826format='%(asctime)s:%(filename)s:%(message)s')827
828# To run it on the localhost if you dont want google DNS829ip = '127.0.0.1'830# print(ip)831try:832serverport = int(sys.argv[1])833except:834print(835"Port Number missing\n\nTO RUN\nType: python3 httpserver.py port_number"836)837sys.exit()838try:839serversocket.bind(('', serverport))840except:841print('\nTO RUN:python3 httpserver.py port_number')842sys.exit()843serversocket.listen(5)844print('HTTP server running on ip: ' + ip + ' port: ' + str(serverport) +845'\nGo to this in the browser: (http://' + ip + ':' +846str(serverport) + '/)')847server([848serversocket, file_extension, conditional_get, conn, SIZE,849client_thread, scode, ip, IDENTITY, serverport850]) # IMP calling the main server Function851sys.exit()852