def get(self, page): target = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) target.connect(self.proxy) print 'Sending Hey', target.send("HEY") s_id = target.recv(1000) print "Received id:", s_id target2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) target2.connect(self.proxy) print 'Sending Hey', target2.send("HEY") s_id2 = target2.recv(1000) print "Received id:", s_id2 from http import HTTPRequest r = HTTPRequest("GET", "http://www.google.com/", "HTTP/1.0", body="Give me your website!!!", headers={"HOST": "www.google.com"}) msg = r.packToPack() target.send(s_id+" 1 1 SEND " + msg) print "GOT:", target.recv(100000) print "GOT:", target.recv(100000) target.send(s_id+" GOOD") r = HTTPRequest("GET", "http://inishia.com/", "HTTP/1.0", body="Give me your website!!!", headers={"HOST": "www.inishia.com"}) msg = r.packToPack() target2.send(s_id2+" 1 1 SEND " + msg) print "GOT:", target2.recv(100000) print "GOT:", target2.recv(100000) target2.send(s_id2+" GOOD")
def __init__(self, language="EN"): self.request = HTTPRequest(URI('https://www.wnp.waseda.jp/portal', 'portal.php'), encoding='euc-jp') self.request.set_dummy_headers() self.request.set_parameter('JavaCHK', 1) self.request.set_parameter('LOGINCHECK', 1) self.language = language self.set_language() self.logged = False self.logged_cnavi = False self._user_info = {} self.session_id_encode_key = None
def http_req(self, host: str = "127.0.0.1", port: int = 50123, file: str = "/", method: str = "GET", params: dict = None, data: str = None): http_req = HTTPRequest(host=host) request = http_req.build_request(file=file, method=method, params=params, data=data) current_timeout = 0.1 while True: self.server_socket.settimeout(current_timeout) if self.debug: print("{}{}Sending HTTP Request...{}".format( bcolors.BOLD, bcolors.OKBLUE, bcolors.ENDC)) print(request) self.send(message=request, host=host, port=port) if current_timeout > 2.0: raise TimeoutException("Timeout exceeded.") break try: data, addr = self.server_socket.recvfrom(self.buffer_size) if data == b"": raise RuntimeError("Connection broken") else: print("\n{}{}Received response:{}\n{}".format( bcolors.BOLD, bcolors.OKBLUE, bcolors.ENDC, data.decode())) return self.process_response(data.decode()) except socket.timeout: print("Request timed out. Trying again...\n") current_timeout *= 2 continue
def logSites(self, packet): if packet.haslayer(TCP): data = packet.getlayer(TCP) try: request = HTTPRequest(data.load) print "%s %s%s" % (request.command, request.headers['host'], request.path) except: pass
def http_send(self, host: str = "127.0.0.1", file: str = "/", method: str = "GET", params: dict = None, data: str = None): http_req = HTTPRequest(host=host) request = http_req.build_request(file=file, method=method, params=params, data=data) if self.debug: print("{}{}Sending HTTP Request...{}".format( bcolors.BOLD, bcolors.OKBLUE, bcolors.ENDC)) print(request) self.send(request)
def proxy_mangle_request(req): """ Takes in an HTTP request and opens the user's editor of choice to modify the request in JSON form. Returns a modified request. """ # Get control of the terminal term_mutex.acquire() try: # Write json to the temp file with tempfile.NamedTemporaryFile(delete=False) as tf: tfName = tf.name tf.write(req_to_json(req)) # Edit it editor = os.environ['EDITOR'] subprocess.call([editor, tfName]) # Read the temp file again fobj = open(tfName) req_dict = json.load(fobj) try: req_dict['headers']['Cookie'] = '; '.join(req_dict['headers']['Cookie']) except KeyError: pass # Put the headers back into lists by themselves for k, v in req_dict['headers'].iteritems(): req_dict['headers'][k] = [v] newreq = HTTPRequest(method = req_dict['method'], url = req.url, proto = req_dict['protocol'], headers = req_dict['headers'], body = req_dict['body']) # Delete the temp file fobj.close() os.remove(tfName) return newreq finally: # Whenever we finish, give up control of the terminal term_mutex.release()
def handle_method(self, method): self.server.log.info(method +' ' + self.path) res = None try: req = HTTPRequest(self, method) if req.path == '/archive': res = self.handle_archive(req) elif req.path == '/auth': res = self.handle_auth(req) elif req.path == '/cli': res = self.handle_cli(req) elif req.path == '/file': res = self.handle_file(req) elif req.path == '/ping': res = req.response else: raise http.HTTPNotFound(req.path) except http.HTTPException, e: e.handler = self res = e
from http import HTTPRequest, HTTPResponse from calc import Calculator from bcolors import bcolors http_req = HTTPRequest(host="127.0.0.1") http_resp = HTTPResponse() calc = Calculator() exp = "" while True: print("{}{}Type in your expression: {}".format(bcolors.OKBLUE, bcolors.BOLD, bcolors.ENDC), end="") exp = input() print() if exp == "exit": break request = http_req.build_request(method="POST", params={"expression": exp}) print("{}Making HTTP request...{}".format(bcolors.OKGREEN, bcolors.ENDC)) print("----------------------") print(request, "\n") print("{}Evaluating expression...{}".format(bcolors.OKGREEN, bcolors.ENDC)) print("------------------------") try: result = calc.evaluate(exp)
class NetPortalAPI: def __init__(self, language="EN"): self.request = HTTPRequest(URI('https://www.wnp.waseda.jp/portal', 'portal.php'), encoding='euc-jp') self.request.set_dummy_headers() self.request.set_parameter('JavaCHK', 1) self.request.set_parameter('LOGINCHECK', 1) self.language = language self.set_language() self.logged = False self.logged_cnavi = False self._user_info = {} self.session_id_encode_key = None def set_language(self): self.request.set_parameter('HID_P14', self.language) @property def user_info(self): if not self.logged: raise NetPortalException( "Need to login to get user info from API.") return self._user_info def login(self, username, password): self.request.uri.url = 'portal.php' self.request.method = "GET" response = self.request.send() self.request.set_cookies(response.cookies) if not 'PHPSESSID' in response.cookies: raise NetPortalException("Could not get PHPSESSID") self.net_portal_sessid = response.cookies['PHPSESSID'] self.request.set_parameter('PHPSESSID', response.cookies['PHPSESSID'].value) self.request.uri.url = 'portalLogin.php' response = self.request.send() self.request.set_cookies(response.cookies) if not 'PHP_Sessionid' in response.cookies: raise NetPortalException("Could not get PHP_Sessionid") self.request.uri.url = 'portal.php' self.request.remove_parameter('PHPSESSID') self.request.set_parameter('PHP_Sessionid', response.cookies['PHP_Sessionid'].value) self.request.set_parameter('loginid', username) self.request.set_parameter('passwd', password) self.request.method = "POST" response = self.request.send() # check if password was correct if not 'Admission_Key' in response.cookies: return False self.request.set_cookies(response.cookies) body = BeautifulSoup(response.get_body()) link = body.find("frame", {'name': 'LeftMenu'})['src'] self._get_left_menu_info(URI.parse(link, is_relative=True)) self.logged = True return True def _get_left_menu_info(self, uri): # get left menu self.request.uri.url = uri.url self.request.reset_parameters() self.request.method = "GET" for (key, value) in uri.params.items(): self.request.set_parameter(key, value) response = self.request.send() self.request.set_cookies(response.cookies) # parse left menu body = BeautifulSoup(response.get_body()) # get hidden form with personal info form = body.find("form", {'name': 'LinkIndication'}) self.request.reset_parameters() for field in form.find_all("input"): self.request.set_parameter(field['name'], field['value']) if field['name'] in info_input.keys(): info_input[field['name']](field['value'], self._user_info) # get missing info from JS missing_info = [ "LinkURL", "CateCode", "MenuCode", "UrlCode", "LogData", "MenuLinkName" ] reg = ".*?MenuLinkOpen\(" + ( "\'(.*?)\'," * 5) + "\'(.*?)\'\).*" # regex for JS function call params -_-' # info written in the last script of the first table target_script = body.find("table").find_all("script")[-1] for line in str(target_script).splitlines(): if "coursenavi/index3.php" in line: m = re.match(reg, line) if not m: raise NetPortalException( "Could not parse course navi link") # missing info captured in groups 1 to 6 for (key, value) in zip(missing_info, [m.group(i) for i in range(1, 7)]): self.request.set_parameter( key.decode("utf-8"), value.decode("utf-8") ) # BeautifulSoup encodes in utf by default break self.request.uri.url = "LogOutput.php" self.request.method = "POST" response = self.request.send() # prepare data to log to course navi self.request.set_cookies(response.cookies) body = BeautifulSoup(response.get_body()) self.cnavi_data = {} for field in body.find_all("input"): self.cnavi_data[field['name']] = field['value'] def login_cnavi(self): if not self.logged: raise NetPortalException("Need to login before login to cnavi") self.request.uri = URI('https://cnavi.waseda.jp', 'coursenavi/index2.php') self.request.method = "POST" self.request.set_parameters(self.cnavi_data) self.request.encoding = "utf-8" self.request.remove_cookie( "PHPSESSID") # different PHPSESSID for this domain response = self.request.send() self.request.set_cookies(response.cookies) self.cnavi_data.clear() body = BeautifulSoup(response.get_body()) for field in body.find_all("input"): self.cnavi_data[field['name']] = field['value'] self.request.set_parameters(self.cnavi_data) self.request.uri.url = "index.php" self.logged_cnavi = True def get_all_subjects(self): subjects = {} for cat in ['attending', 'to_attend', 'attended']: subjects.update(self.get_subjects(cat)) return subjects def get_subjects(self, subject_category='attending'): if not self.logged_cnavi: raise NetPortalException("Need to login to cnavi to get subjects") self.request.set_parameter('ControllerParameters', 'ZX14SubCon') self.request.set_parameter('hidListMode', subjects_category[subject_category]) response = self.request.send() body = BeautifulSoup(response.get_body()) subjects_container = body.find('div', {'id': 'wKTable'}).find("ul") ids = [] folders = [] for subject in subjects_container.find_all("li"): info = subject.find('p', {'class': 'w-col6'}) ids.append(info.find('input', {'name': 'chkbox[]'})['value']) folders.append( info.find('input', {'name': 'folder_id[]'})['value']) subjects = {} # ids are in the form "yyyyIDIDIDID" # use IDIDIDID as dictionary key # zip with folders to iterate on all needed information for (k, y, f) in map(lambda (s, f): (s[4:], s[:4], f), zip(ids, folders)): subjects.setdefault(k, {"folder_id": f, "years": []}) subjects[k]["years"].append(y) return subjects
class NetPortalAPI: def __init__(self, language="EN"): self.request = HTTPRequest(URI('https://www.wnp.waseda.jp/portal', 'portal.php'), encoding='euc-jp') self.request.set_dummy_headers() self.request.set_parameter('JavaCHK', 1) self.request.set_parameter('LOGINCHECK', 1) self.language = language self.set_language() self.logged = False self.logged_cnavi = False self._user_info = {} self.session_id_encode_key = None def set_language(self): self.request.set_parameter('HID_P14', self.language) @property def user_info(self): if not self.logged: raise NetPortalException("Need to login to get user info from API.") return self._user_info def login(self, username, password): self.request.uri.url = 'portal.php' self.request.method = "GET" response = self.request.send() self.request.set_cookies(response.cookies) if not 'PHPSESSID' in response.cookies: raise NetPortalException("Could not get PHPSESSID") self.net_portal_sessid = response.cookies['PHPSESSID'] self.request.set_parameter('PHPSESSID', response.cookies['PHPSESSID'].value) self.request.uri.url = 'portalLogin.php' response = self.request.send() self.request.set_cookies(response.cookies) if not 'PHP_Sessionid' in response.cookies: raise NetPortalException("Could not get PHP_Sessionid") self.request.uri.url = 'portal.php' self.request.remove_parameter('PHPSESSID') self.request.set_parameter('PHP_Sessionid', response.cookies['PHP_Sessionid'].value) self.request.set_parameter('loginid', username) self.request.set_parameter('passwd', password) self.request.method = "POST" response = self.request.send() # check if password was correct if not 'Admission_Key' in response.cookies: return False self.request.set_cookies(response.cookies) body = BeautifulSoup(response.get_body()) link = body.find("frame", {'name': 'LeftMenu'})['src'] self._get_left_menu_info(URI.parse(link, is_relative=True)) self.logged = True return True def _get_left_menu_info(self, uri): # get left menu self.request.uri.url = uri.url self.request.reset_parameters() self.request.method = "GET" for (key, value) in uri.params.items(): self.request.set_parameter(key, value) response = self.request.send() self.request.set_cookies(response.cookies) # parse left menu body = BeautifulSoup(response.get_body()) # get hidden form with personal info form = body.find("form", {'name': 'LinkIndication'}) self.request.reset_parameters() for field in form.find_all("input"): self.request.set_parameter(field['name'], field['value']) if field['name'] in info_input.keys(): info_input[field['name']](field['value'], self._user_info) # get missing info from JS missing_info = ["LinkURL", "CateCode", "MenuCode", "UrlCode", "LogData", "MenuLinkName"] reg = ".*?MenuLinkOpen\(" + ("\'(.*?)\'," * 5) + "\'(.*?)\'\).*" # regex for JS function call params -_-' # info written in the last script of the first table target_script = body.find("table").find_all("script")[-1] for line in str(target_script).splitlines(): if "coursenavi/index3.php" in line: m = re.match(reg, line) if not m: raise NetPortalException("Could not parse course navi link") # missing info captured in groups 1 to 6 for (key, value) in zip(missing_info, [m.group(i) for i in range(1, 7)]): self.request.set_parameter(key.decode("utf-8"), value.decode("utf-8")) # BeautifulSoup encodes in utf by default break self.request.uri.url = "LogOutput.php" self.request.method = "POST" response = self.request.send() # prepare data to log to course navi self.request.set_cookies(response.cookies) body = BeautifulSoup(response.get_body()) self.cnavi_data = {} for field in body.find_all("input"): self.cnavi_data[field['name']] = field['value'] def login_cnavi(self): if not self.logged: raise NetPortalException("Need to login before login to cnavi") self.request.uri = URI('https://cnavi.waseda.jp', 'coursenavi/index2.php') self.request.method = "POST" self.request.set_parameters(self.cnavi_data) self.request.encoding = "utf-8" self.request.remove_cookie("PHPSESSID") # different PHPSESSID for this domain response = self.request.send() self.request.set_cookies(response.cookies) self.cnavi_data.clear() body = BeautifulSoup(response.get_body()) for field in body.find_all("input"): self.cnavi_data[field['name']] = field['value'] self.request.set_parameters(self.cnavi_data) self.request.uri.url = "index.php" self.logged_cnavi = True def get_all_subjects(self): subjects = {} for cat in ['attending', 'to_attend', 'attended']: subjects.update(self.get_subjects(cat)) return subjects def get_subjects(self, subject_category='attending'): if not self.logged_cnavi: raise NetPortalException("Need to login to cnavi to get subjects") self.request.set_parameter('ControllerParameters', 'ZX14SubCon') self.request.set_parameter('hidListMode', subjects_category[subject_category]) response = self.request.send() body = BeautifulSoup(response.get_body()) subjects_container = body.find('div', {'id': 'wKTable'}).find("ul") ids = [] folders = [] for subject in subjects_container.find_all("li"): info = subject.find('p', {'class': 'w-col6'}) ids.append(info.find('input', {'name': 'chkbox[]'})['value']) folders.append(info.find('input', {'name': 'folder_id[]'})['value']) subjects = {} # ids are in the form "yyyyIDIDIDID" # use IDIDIDID as dictionary key # zip with folders to iterate on all needed information for (k, y, f) in map(lambda (s, f): (s[4:], s[:4], f), zip(ids, folders)): subjects.setdefault(k, {"folder_id": f, "years": []}) subjects[k]["years"].append(y) return subjects
from http import HTTPRequest, HTTPResponse, HTTPParser http_parser = HTTPParser() http_req = HTTPRequest(host="127.0.0.1") print(http_req.build_request(method="POST", params={"expression": "+ 1 2"}), "\n") request1 = http_req.build_request(method="POST", file="/testfilename", params={"expression": "* 5 6"}) print("Request 1:") print(request1) print("Parsed request:", http_parser.parse_request(request1)) http_resp = HTTPResponse() response1 = http_resp.build_response(status=406, data=-1) parsed_response1 = http_parser.parse_response(response1) print() print("Response 1:") print(response1, "\n") print("Status:", parsed_response1['status']) print("Header Fields:", parsed_response1['fields']) print("Data:", parsed_response1['data']) response2 = http_resp.build_response(status=200, data="10") parsed_response2 = http_parser.parse_response(response2)
import socket from http import HTTPRequest, HTTPResponse, HTTPParser server = "www.inspirasonho.com.br" file = "/sobre" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((server, 80)) hreq = HTTPRequest(host=server) request = hreq.build_request(method="GET", file=file) print("Request:") print(request) print("----\n") s.send(request.encode()) response = s.recv(4096) print("Response:") print(response.decode()) print() print("Response Length:", len(response))