예제 #1
0
def test_responder_request(conn, send_status):
    events = conn.feed_data(FCGIBeginRequest(1, FCGI_RESPONDER, 0).encode())
    assert len(events) == 0

    content = encode_name_value_pairs([('REQUEST_METHOD', 'GET'), ('CONTENT_LENGTH', '')])
    events = conn.feed_data(FCGIParams(1, content).encode())
    assert len(events) == 0

    events = conn.feed_data(FCGIParams(1, b'').encode())
    assert isinstance(events[0], RequestBeginEvent)

    events = conn.feed_data(FCGIStdin(1, b'content').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestDataEvent)

    events = conn.feed_data(FCGIStdin(1, b'').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestDataEvent)

    headers = [(b'Content-Length', b'7'), (b'Content-Type', b'text/plain')]
    conn.send_headers(1, headers, status=200 if send_status else None)
    expected_body = b'Content-Length: 7\r\nContent-Type: text/plain\r\n\r\n'
    if send_status:
        expected_body = b'Status: 200\r\n' + expected_body
    assert conn.data_to_send() == \
        FCGIStdout(1, expected_body).encode()

    conn.send_data(1, b'Cont')
    assert conn.data_to_send() == FCGIStdout(1, b'Cont').encode()

    conn.send_data(1, b'ent', end_request=True)
    assert conn.data_to_send() == FCGIStdout(1, b'ent').encode() + \
        FCGIStdout(1, b'').encode() + FCGIEndRequest(1, 0, FCGI_REQUEST_COMPLETE).encode()
예제 #2
0
def test_aborted_request(conn):
    events = conn.feed_data(FCGIBeginRequest(1, FCGI_RESPONDER, 0).encode())
    assert len(events) == 0

    content = encode_name_value_pairs([('REQUEST_METHOD', 'GET'), ('CONTENT_LENGTH', '')])
    events = conn.feed_data(FCGIParams(1, content).encode())
    assert len(events) == 0

    events = conn.feed_data(FCGIParams(1, b'').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestBeginEvent)

    events = conn.feed_data(FCGIStdin(1, b'').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestDataEvent)

    events = conn.feed_data(FCGIAbortRequest(1).encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestAbortEvent)

    conn.end_request(1)
    assert conn.data_to_send() == FCGIEndRequest(1, 0, FCGI_REQUEST_COMPLETE).encode()
예제 #3
0
def test_filter_request():
    conn = FastCGIConnection(roles=[FCGI_FILTER])
    events = conn.feed_data(FCGIBeginRequest(1, FCGI_FILTER, 0).encode())
    assert len(events) == 0

    content = encode_name_value_pairs([('REQUEST_METHOD', 'GET'), ('CONTENT_LENGTH', '')])
    events = conn.feed_data(FCGIParams(1, content).encode())
    assert len(events) == 0

    events = conn.feed_data(FCGIParams(1, b'').encode())
    assert isinstance(events[0], RequestBeginEvent)

    events = conn.feed_data(FCGIStdin(1, b'content').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestDataEvent)

    events = conn.feed_data(FCGIStdin(1, b'').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestDataEvent)

    events = conn.feed_data(FCGIData(1, b'file data').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestSecondaryDataEvent)

    events = conn.feed_data(FCGIData(1, b'').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestSecondaryDataEvent)

    headers = [(b'Content-Length', b'9'), (b'Content-Type', b'application/octet-stream')]
    conn.send_headers(1, headers, status=404)
    assert conn.data_to_send() == \
        FCGIStdout(1, b'Status: 404\r\nContent-Length: 9\r\n'
                      b'Content-Type: application/octet-stream\r\n\r\n').\
        encode()

    conn.send_data(1, b'file data', end_request=True)
    assert conn.data_to_send() == FCGIStdout(1, b'file data').encode() + \
        FCGIStdout(1, b'').encode() + FCGIEndRequest(1, 0, FCGI_REQUEST_COMPLETE).encode()
예제 #4
0
def test_authorizer_request():
    conn = FastCGIConnection(roles=[FCGI_AUTHORIZER])
    events = conn.feed_data(FCGIBeginRequest(1, FCGI_AUTHORIZER, 0).encode())
    assert len(events) == 0

    content = encode_name_value_pairs([('REQUEST_METHOD', 'GET'), ('CONTENT_LENGTH', '')])
    events = conn.feed_data(FCGIParams(1, content).encode())
    assert len(events) == 0

    events = conn.feed_data(FCGIParams(1, b'').encode())
    assert len(events) == 1
    assert isinstance(events[0], RequestBeginEvent)

    headers = [(b'Content-Length', b'13'), (b'Content-Type', b'text/plain')]
    conn.send_headers(1, headers, status=403)
    assert conn.data_to_send() == \
        FCGIStdout(1, b'Status: 403\r\nContent-Length: 13\r\n'
                      b'Content-Type: text/plain\r\n\r\n').encode()

    conn.send_data(1, b'Access denied', end_request=True)
    assert conn.data_to_send() == \
        FCGIStdout(1, b'Access denied').encode() + FCGIStdout(1, b'').encode() + \
        FCGIEndRequest(1, 0, FCGI_REQUEST_COMPLETE).encode()
예제 #5
0
def test_unknown_role(conn):
    events = conn.feed_data(FCGIBeginRequest(1, FCGI_AUTHORIZER, 0).encode())
    assert len(events) == 0
    assert conn.data_to_send() == FCGIEndRequest(1, 0, FCGI_UNKNOWN_ROLE).encode()
예제 #6
0
import pytest

from fcgiproto.constants import (
    FCGI_REQUEST_COMPLETE, FCGI_RESPONDER, FCGI_AUTHORIZER, FCGI_FILTER, FCGI_UNKNOWN_ROLE)
from fcgiproto.events import (
    RequestDataEvent, RequestAbortEvent, RequestBeginEvent, RequestSecondaryDataEvent)
from fcgiproto.exceptions import ProtocolError
from fcgiproto.records import (
    FCGIStdin, FCGIData, FCGIAbortRequest, FCGIStdout, FCGIEndRequest, FCGIBeginRequest,
    FCGIParams, encode_name_value_pairs)
from fcgiproto.states import RequestState

begin_record = FCGIBeginRequest(1, FCGI_RESPONDER, 0)
params_record = FCGIParams(1, encode_name_value_pairs([('NAME', 'VALUE')]))
params_end_record = FCGIParams(1, b'')
stdin_record = FCGIStdin(1, b'')
data_record = FCGIData(1, b'')
abort_record = FCGIAbortRequest(1)
stdout_record = FCGIStdout(1, b'content')
stdout_end_record = FCGIStdout(1, b'')
end_record = FCGIEndRequest(1, 0, FCGI_REQUEST_COMPLETE)
end_record_reject = FCGIEndRequest(1, 0, FCGI_UNKNOWN_ROLE)


class BaseStateTests(object):
    possible_states = {RequestState.EXPECT_BEGIN_REQUEST,
                       RequestState.EXPECT_PARAMS,
                       RequestState.EXPECT_STDIN,
                       RequestState.EXPECT_DATA,
                       RequestState.EXPECT_STDOUT,
                       RequestState.EXPECT_END_REQUEST,
예제 #7
0
def test_encode_begin_request():
    record = FCGIBeginRequest(5, 1, 1)
    assert record.encode(
    ) == b'\x01\x01\x00\x05\x00\x08\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00'
예제 #8
0
def test_parse_begin_request():
    buffer = bytearray(b'\x00\x01\x01\x00\x00\x00\x00\x00')
    record = FCGIBeginRequest.parse(5, buffer)
    assert record.request_id == 5
    assert record.role == 1
    assert record.flags == 1