Ejemplo n.º 1
0
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())
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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