def main_work(req: func.HttpRequest, tc: TimerControl) -> func.HttpResponse: global APP_DATA if APP_DATA is None: logging.info("Reloading page (%s, %s)", str(use_azure_blob), str(preload)) APP_DATA = AppData(use_azure_blob=use_azure_blob, preload=preload) page = Page(APP_DATA) if False: logging.debug("METHOD: " + str(req.method)) logging.debug("URL: " + str(req.url)) logging.debug("HEADERS: " + str(dict(req.headers))) logging.debug("PARAMS: " + str(dict(req.params))) logging.debug("ROUTE PARAMS: " + str(dict(req.route_params))) logging.debug("GET BODY: " + str(req.get_body().decode())) # Header example from Azure: # HEADERS: {'x-client-port': '51166', 'sec-fetch-site': 'same-origin', 'disguised-host': 'testshkoladocker.azurewebsites.net', # 'x-forwarded-for': '82.69.90.27:51166', 'x-appservice-proto': 'https', 'sec-fetch-dest': 'document', # 'referer': 'https://testshkoladocker.azurewebsites.net/main', 'sec-fetch-mode': 'navigate', # 'accept-language': 'en-US, en; q=0.9, hr; q=0.8, bs; q=0.7, sr; q=0.6, sl; q=0.5', # 'host': 'testshkoladocker.azurewebsites.net', 'upgrade-insecure-requests': '1', # 'x-arr-ssl': '2048|256|C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Microsoft IT, CN=Microsoft IT TLS CA 5|CN=*.azurewebsites.net', # 'was-default-hostname': 'testshkoladocker.azurewebsites.net', # 'x-waws-unencoded-url': '/main?op=login_test&login_return=gASVaQAAAAAAAAB9lCiMCXBhZ2VfbmFtZZSMBHRlc3SUjARxX2lklIwAlIwEbF9pZJSMD3k1X2ZyYWN0aW9ucy51a5SMBGxhbmeUjAJ1a5SMB3VzZXJfaWSUaASMBG1lbnWUjAZtb2JpbGWUjAJqc5SJdS4%3D&user_id=Zomebody', # 'x-original-url': '/main?op=login_test&login_return=gASVaQAAAAAAAAB9lCiMCXBhZ2VfbmFtZZSMBHRlc3SUjARxX2lklIwAlIwEbF9pZJSMD3k1X2ZyYWN0aW9ucy51a5SMBGxhbmeUjAJ1a5SMB3VzZXJfaWSUaASMBG1lbnWUjAZtb2JpbGWUjAJqc5SJdS4%3D&user_id=Zomebody', # 'request-id': '|9fe76d08-44458cf4688911f9.1.', # 'accept': 'text/html, application/xhtml+xml, application/xml; q=0.9, image/webp, image/apng, */*; q=0.8, application/signed-exchange; v=b3; q=0.9', # 'x-site-deployment-id': 'testshkoladocker', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36', # 'x-client-ip': '82.69.90.27', 'content-length': '0', 'connection': 'close', 'accept-encoding': 'gzip, deflate, br', 'client-ip': '82.69.90.27:51166', 'sec-fetch-user': '******', # 'x-arr-log-id': 'd69d498a-19fe-4673-9809-d2aa180c87c5', 'x-forwarded-proto': 'https', 'max-forwards': '10'} headers = Headers() request = Request(req) args = dict() if req.method == "POST": # Merge body and request parameters # TODO: We cannot assume POST will only send json. # We should check content type of the POST request. try: args = json.loads(req.get_body().decode()) except json.JSONDecodeError: pass args.update(request.get_query_data()) args["root"] = "main" if "language" not in args.keys(): args["language"] = "rs" with tc.new_section("page_main"): page_body = page.main(request, headers, tc, args) return func.HttpResponse(page_body, status_code=headers.status_code(), headers=headers.get_headers(), mimetype=headers.content_type())
def test_received_callback_is_called_with_connection_as_parameter_after_whole_request_is_received( ): connection = Connection(ADDR, fake_socket, Mock()) received_callback = Mock() connection.receive(received_callback, 70) fake_socket.send_buffer = b'GET /path/to/example.com HTTP/1.1\r\n\r\n' connection.update() request = Request('GET', '/path/to/example.com', 'HTTP/1.1', None, None) received_callback.assert_called_with(connection, request)
def process_request(connection): """ 处理请求,发送响应 """ r = recv_request(connection) request = Request(r) log('request.cookies in process_request', request.cookies) response = response_for_path(request) log_response(request, response) connection.sendall(response) connection.close()
def _main(self, handle, req, tc, args): headers = Headers() request = Request(req, RequestType.CHERRY_PY) if req.method == "POST": # Merge body and request parameters # TODO: We cannot assume POST will only send json. # We should check content type of the POST request. try: json_args = json.loads(req.body.read().decode('utf-8')) args.update(**json_args) except json.JSONDecodeError: pass args["root"] = handle with tc.new_section("page_main"): try: page = Page(self._app_data) page_body = page.main(request, headers, tc, args) except Exception as error: trace_str = traceback.format_exc() logging.error("Error: {}\n{}".format(error, trace_str)) raise error response = cherrypy.response for k, v in headers.get_cookies().items(): response.cookie[k] = v for k, v in headers.get_headers(False).items(): response.headers[k] = v response.headers['Content-Type'] = headers.content_type() response.status = headers.status_code() logging.debug("_main finished: op={}".format(args.get('op'))) return page_body
def test_generate_404_response(): request = Request('GET', '/notfound', None, None, None) expected_response = b'HTTP/1.1 404 Not Found\r\nContent-Length: 25\r\nLocation: /notfound/\r\n\r\n<h1>Page not found</h1>\r\n' assert generate_404_response(request) == expected_response
def test_generate_response_with_png_mime_type_and_bytes_body(): request = Request('GET', '/random/Screenshot_20161222-082602.png', None, None, None) expected_result = b'HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: 62995\r\n\r\n\x89PN' assert generate_response(request, 'tests/webroot')[:70] == expected_result
def test_generate_301_response(): request = Request('GET', '/cat_pics', None, None, None) expected_response = b'HTTP/1.1 301 Moved Permanently\r\nContent-Length: 0\r\nLocation: /cat_pics/\r\n\r\n' assert generate_301_response(request) == expected_response
def test_sends_redirect_response_if_dir_without_end_slash(): request = Request('GET', '/cat_pics', None, None, None) expected_result = b'HTTP/1.1 301 Moved Permanently\r\nContent-Length: 0\r\nLocation: /cat_pics/\r\n\r\n' assert generate_response(request, 'tests/webroot') == expected_result
def test_generate_response_for_HEAD_request_of_root_dir(): request = Request('HEAD', '/', None, None, None) expected_result = b'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 201\r\n\r\n' assert generate_response(request, 'tests/webroot') == expected_result
def test_generate_response_for_PUT_request(): request = Request('PUT', '/', None, None, None) expected_result = b'HTTP/1.1 501 Not Implemented\r\n\r\n' assert generate_response(request, 'tests/webroot') == expected_result
def test_generate_response_for_HEAD_request_of_a_text_file(): request = Request('HEAD', '/lorem_ipsum.txt', None, None, None) expected_result = b'HTTP/1.1 200 OK\r\n' \ b'Content-Type: text/plain\r\n' \ b'Content-Length: 362\r\n\r\n' assert generate_response(request, 'tests/webroot') == expected_result
def test_generate_response_for_GET_request(): request = Request('GET', '/', None, None, None) expected_result = b'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 201\r\n\r\n<h1>/</h1><table><tbody><tr><td><a href="cat_pics">cat_pics/</a></td></tr><tr><td><a href="random">random/</a></td></tr><tr><td><a href="lorem_ipsum.txt">lorem_ipsum.txt</a></td></tr></tbody></table>\r\n' assert generate_response(request, 'tests/webroot') == expected_result