From 4ad2863bf5d45af978509484bf1be4e944465127 Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Sun, 16 Oct 2022 15:05:15 +0300 Subject: [PATCH] [~] Refactor --- d1/f2.py | 263 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 165 insertions(+), 98 deletions(-) diff --git a/d1/f2.py b/d1/f2.py index 7080da1..b6f3fae 100644 --- a/d1/f2.py +++ b/d1/f2.py @@ -13,126 +13,193 @@ import pprint sys.path.insert(0, os.path.dirname(__file__)) -def application(environ, start_response): - def op1(data=None): +class Application: + def __init__(self, environ, start_response): + self.environ = environ + self.start_response = start_response + + def op1(self, data=None): if data is None: data = traceback.format_exc() with io.open('log.txt', 'a') as f: f.write(data) - try: - t4 = int(environ.get('CONTENT_LENGTH', '0')) - t3 = environ['wsgi.input'].read(t4) - def op1(rh): - t5 = rh.split('_') - t6 = ['%s%s' % (o[0].upper(), o[1:].lower()) for o in t5] - return '-'.join(t6) - t2 = { - op1(k[5:]) : v - for k, v in environ.items() - if k.startswith('HTTP_') - } - for k, v in environ.items(): - if k in [ - 'CONTENT_TYPE', - ]: - t2[op1(k)] = v - t7 = dict( - uri=environ['REQUEST_URI'], - method=environ['REQUEST_METHOD'], - protocol=environ['SERVER_PROTOCOL'], + def op2(self, rh): + t5 = rh.split('_') + t6 = ['%s%s' % (o[0].upper(), o[1:].lower()) for o in t5] + return '-'.join(t6) + + def op3(self,): + for o in [self.input_dat, self.output_dat]: + if not o is None and os.path.exists(o): + os.unlink(o) + + def op4(self,): + self.output_dat = tempfile.mktemp(suffix='.dat') + self.input_dat = tempfile.mktemp(suffix='.dat') + + def op5( + status_code=None, + status_text=None, + content_type=None, + content=None, + headers_text=None, + ): + if not headers_text is None: + if not any([o.startswith('Content-Length') for o in headers_text]): + headers_text = \ + headers_text.replace( + 'Transfer-Encoding: chunked\r\n', + '' + ) + headers_text += 'Content-Length: %d\r\n' % len(t10) + + t13 = headers_text.splitlines()[0] + t14 = t13.find(' ') + t15 = t13[t14 + 1:] + status_suffix = t15 + headers = [ + (o[:o.find(':')], o[o.find(':') + 1:]) + for o in headers_text.splitlines()[1:] + ] + else: + if status_code is None: + status_code = 200 + if status_text is None: + status_text = 'OK' + + if content_type is None: + content_type = 'text/plain' + + status_suffix = '%d %s' % (status_code, status_text) + headers = [('Content-Type', content_type)] + + t1 = self.start_response( + status_suffix, + headers, ) - output_dat = None - input_dat = None - def op1(): - for o in [input_dat, output_dat]: - if not o is None and os.path.exists(o): - os.unlink(o) - try: - output_dat = tempfile.mktemp(suffix='.dat') - input_dat = tempfile.mktemp(suffix='.dat') - op1() + assert isinstance(content, bytes) - with io.open(input_dat, 'wb') as f: - f.write(t3) + t1(content) + return [] + + def op6(self, cmd_args,): + self.op1(json.dumps(cmd_args)) + + with subprocess.Popen( + cmd_args, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE + ) as p: try: - with io.open( - os.path.join( - os.environ['HOME'], - 'proxy.json' - ), - 'r' - ) as f: - PROXY_URL = numpy.random.choice(json.load(f)) - except: - with io.open('log.txt', 'a') as f: - f.write(traceback.format_exc()) + p.wait(20) + response_headers = [ + o[2:] + for o in p.stderr.read().decode('utf-8').splitlines() + if o.startswith('< ') + ] + t9 = '\r\n'.join(response_headers) + if not 'Content-Length: 0' in t9: + for k in range(100): + try: + with io.open(self.output_dat, 'rb') as f: + t10 = f.read() + break + except: + time.sleep(0.05) + else: + t10 = b'' + finally: + p.terminate() - PROXY_URL = '127.0.0.1:9050' + return t10 + + def op7(self): + try: + with io.open( + os.path.join( + os.self.environ['HOME'], + 'proxy.json' + ), + 'r' + ) as f: + return numpy.random.choice(json.load(f)) + except: + with io.open('log.txt', 'a') as f: + f.write(traceback.format_exc()) + + return '127.0.0.1:9050' + + def op8(self, input_content, headers, uri, method): + try: + self.op4() + + with io.open( + self.input_dat, + 'wb' + ) as f: + f.write(input_content) + + + proxy_url = self.op7() t17 = [ 'curl', - 'http://%s%s' % (PROXY_URL, t7['uri']), + 'http://%s%s' % (proxy_url, uri), *sum([ ['--header', '%s: %s' % (k, v)] for k, v in t2.items() ], []), - '-X', t7['method'], - '--data-binary', '@%s' % input_dat, + '-X', method, + '--data-binary', '@%s' % self.input_dat, '--max-filesize', '%d' % (60 * 1024 * 1024), - '-o', output_dat, + '-o', self.output_dat, '-v', '-q', ] - with subprocess.Popen( - t17, stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE - ) as p: - try: - p.wait(20) - response_headers = [ - o[2:] - for o in p.stderr.read().decode('utf-8').splitlines() - if o.startswith('< ') - ] - t9 = '\r\n'.join(response_headers) - if not 'Content-Length: 0' in t9: - for k in range(3): - try: - with io.open(output_dat, 'rb') as f: - t10 = f.read() - break - except: - time.sleep(0.05) - else: - t10 = b'' - finally: - p.terminate() - except: - t9 = 'FUCK SHIT\r\n' - t10 = traceback.format_exc().encode('utf-8') + t10 = self.op6(t17) finally: - op1() + self.op3() - if not any([o.startswith('Content-Length') for o in t9]): - t9 = t9.replace('Transfer-Encoding: chunked\r\n', '') - t9 += 'Content-Length: %d\r\n' % len(t10) - t11 = t9.encode('utf-8') + t10 - t13 = t9.splitlines()[0] - t14 = t13.find(' ') - t15 = t13[t14 + 1:] - t16 = [(o[:o.find(':')], o[o.find(':') + 1:]) for o in t9.splitlines()[1:]] - if False: - t1 = start_response('200 OK', [('Content-Type', 'text/plain')]) - t1(t15) - t1(json.dumps(t16)) - t1(json.dumps(t17)) - t1(t10) - else: - t1 = start_response(t15, t16) - t1(t10) - except: - op1() + return t10 - return [] + def run(self): + try: + t4 = int(self.environ.get('CONTENT_LENGTH', '0')) + t3 = self.environ['wsgi.input'].read(t4) + t2 = { + self.op2(k[5:]) : v + for k, v in self.environ.items() + if k.startswith('HTTP_') + } + for k, v in self.environ.items(): + if k in [ + 'CONTENT_TYPE', + ]: + t2[self.op2(k)] = v + + t7 = dict( + uri=self.environ['REQUEST_URI'], + method=self.environ['REQUEST_METHOD'], + protocol=self.environ['SERVER_PROTOCOL'], + ) + + return self.op5( + headers_text=t9, + content=t10, + ) + except: + self.op1() + return self.op5( + content='internal server error', + ) + + +def application(environ, start_response): + return Application( + environ=environ, + start_response=start_response, + ).run()