def test_request_parsing_with_range_from_middle():
    # run
    http_request = parse_http_request(REQUEST_WITH_RANGE_FROM_MIDDLE)

    # assert
    tools.assert_true(http_request.is_range_requested())
    tools.assert_equals(http_request.get_range(), (5, 10))
def test_request_parsing_with_range_from_zero():
    # run
    http_request = parse_http_request(REQUEST_WITH_RANGE_FROM_ZERO)

    # assert
    tools.assert_true(http_request.is_range_requested())
    tools.assert_equals(http_request.get_range(), (0, None))
def test_good_http_request_2():
    # setup
    headers_expected_result = {}

    # run
    http_request = parse_http_request(GOOD_REQUEST_2)

    # assert
    tools.assert_equals(http_request.method, 'GET')
    tools.assert_equals(http_request.request_uri, '/')
    tools.assert_equals(http_request.protocol, 'HTTP/1.1')
    tools.assert_equals(http_request.headers, headers_expected_result)
def test_good_http_request_1():
    # setup
    headers_expected_result = {
        'Host': 'localhost:5555',
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Encoding': 'gzip,deflate,sdch',
        'Accept-Language': 'en-US,en;q=0.8',
        'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
    }

    # run
    http_request = parse_http_request(GOOD_REQUEST_1)

    # assert
    tools.assert_equals(http_request.method, 'GET')
    tools.assert_equals(http_request.request_uri, '/')
    tools.assert_equals(http_request.protocol, 'HTTP/1.1')
    tools.assert_equals(http_request.headers, headers_expected_result)
def test_bad_http_request_2():
    parse_http_request(BAD_REQUEST_2)
def test_http_request_data_empty_string():
    parse_http_request('')
def test_http_request_data_none():
    parse_http_request(None)
def handle_request(clientsock):
    Log.info('gdz.log handle_request --begin')

    data = clientsock.recv(RECV_BUFSIZ)

    Log.debug('Request received:\n%s', data)

    request = parse_http_request(data)
    Log.debug('gdz.log request ist: %s', json.dumps(str(request)))

    params = {}
    i = 0
    for item in str(request.request_uri[1:]).split('/'):
        key, value = i, item
        params[key] = value
        i = i+1
    Log.debug('gdz.log params: %s', json.dumps(params))
    file = get_file(params[2])
    Log.debug('gdz.log file.info: %s', json.dumps(file.__dict__))

    if (file.exists == False) and (params[0] == 'api'):
        result = {}
        Log.debug('gdz.log 0. heute ist api')
        response = HttpResponse(protocol=request.protocol, status_code=200)
        response.headers['charset'] = 'utf-8'
        response.headers['Content-type'] = 'text/plain'
        result['code'] = 0
        result['msg'] = '请求主页成功'
        result['success'] = 'true'
        if params[2] == 'home':
            result['result'] = getHomeContent()
        elif params[2] == 'categoryList':
            result['result'] = getCategoryList()
        elif params[2] == 'categoryDetail':
            result['result'] = getCategoryDetail()
        else:
            result['success'] = 'false'
            result['code'] = -1
            result['msg'] = 'not fund'
        Log.info(json.dumps(result))
        response.content = json.dumps(result)

    elif file.exists and request.is_range_requested():
        Log.debug('gdz.log 1. ist range requested.')
        response = HttpResponse(protocol=request.protocol, status_code=206,
                                range=request.get_range())
        response.file = file

    elif file.exists:
        Log.debug('gdz.log 2. file exists.')
        response = HttpResponse(protocol=request.protocol, status_code=200)
        response.headers['charset'] = 'utf-8'
        response.file = file

    else:
        Log.debug('gdz.log 3. file ist not gefunden.')
        response = HttpResponse(protocol=request.protocol, status_code=404)
        response.headers['Content-type'] = 'text/plain'
        response.headers['charset'] = 'utf-8'
        response.content = 'This file does not exist!'

    Log.info('GET %s %s %s %s',
             request.request_uri, request.protocol, request.get_range(), response.status_code)

    response.write_to(clientsock)
    clientsock.close()
    Log.info('gdz.log handle_request --end')