def test_msg():
    with server(success_response):
        connection = HTTPConnection(*listener)
        connection.request("GET", "/")
        response = connection.getresponse()
        assert response.msg['Set-Cookie'] == "foo=bar, baz=bar"
        assert response.msg['Content-Type'] == "text/plain"
def test_network_timeout():
    with server(network_timeout):
        http = HTTPClient(*listener, ssl=True,
            network_timeout=0.1, ssl_options={'ca_certs': CERT})
        with pytest.raises(gevent.ssl.SSLError):
            response = http.get('/')
            assert response.status_code == 0, 'should have timed out.'
Exemple #3
0
def test_network_timeout():
    with server(network_timeout):
        http = HTTPClient(*listener, ssl=True, insecure=True,
            network_timeout=0.1, ssl_options={'ca_certs': CERT})
        with pytest.raises(gevent.ssl.SSLError):
            response = http.get('/')
            assert response.status_code == 0, 'should have timed out.'
def test_msg():
    with server(success_response):
        connection = HTTPConnection(*listener)
        connection.request("GET", "/")
        response = connection.getresponse()

        assert response.msg['Set-Cookie'] == "foo=bar, baz=bar"
        assert response.msg['Content-Type'] == "text/plain"
def test_internal_server_error():
    with server(internal_server_error):
        client = HTTPClient(*listener)
        response = client.get("/")
        assert not response.should_keep_alive()
        assert response.should_close()
        body = response.read()
        assert len(body) == response.content_length
def test_internal_server_error():
    with server(internal_server_error):
        client = HTTPClient(*listener)
        response = client.get('/')
        assert not response.should_keep_alive()
        assert response.should_close()
        body = response.read()
        assert len(body) == response.content_length
def test_simple_ssl():
    with server(simple_ssl_response) as listener:
        http = HTTPClient(*listener,
                          insecure=True,
                          ssl=True,
                          ssl_options={'ca_certs': CERT})
        response = http.get('/')
        assert response.status_code == 200
        response.read()
def chat():
    # 세션간에 서로 참조를 하는 예제
    # 클라가 처음 연결 물었을때 ID 를 물어보고 그 ID 를 세션키 삼아서 세션을 관리하도록 했다.
    # 현재는 별기능 없고 전체챗만 가능
    class chat(session):
        def run(self):
            userid = self.login()
            self.session_name = userid
            self.register()
            self.loop()
            self.unregister()
        def login(self):
            self.sock.send("type your name\r\n")            
            userid = self.readline_dirty()
            self.sock.send("hello %s\r\n" % userid)
            return userid
        def loop(self):
            self.hello_everybody()
            try:
                while True:
                    msg = self.readline_dirty()
                    self.with_all_sessions(lambda k,v: v.sock.send("%s says: %s\r\n" % (self.session_name, msg)))
            except:
                # 이건 완전 땜질. 소켓이 끊어지면 급조된
                # readline_dirty 가 예외질을 해서 적절히
                # 막아줬다. 서비스코드라면 에러대책을 세워야겠지.
                pass
            self.goodbye_everybody()

        def hello_everybody(self):
            self.with_all_sessions(lambda k,v: v.sock.send("*** %s joined\r\n" % self.session_name))

        def goodbye_everybody(self):
            self.with_all_sessions(lambda k,v: v.sock.send("*** %s left\r\n" % self.session_name))

        def with_all_sessions(self, fun):
            # 사실상 server 쪽에 위치해야 하는 함수인데 일단 예제니까.
            # 그냥 for 쓰는게 더 보기 좋지만 self.mother.sessions 로 접근하는게 후에 바뀔수 있으니 함수 하나로 모아뒀다.
            for k,v in self.mother.sessions.iteritems():
                fun(k,v)

        def readline_dirty(self):
            # makefile 을 통해서 readline 을 쓰는게 가능한데 예제코드라 그냥 이짓을 했다
            buf = ""
            while True:
                tmp = self.sock.recv(1)
                if tmp:
                    if tmp == "\n":
                        return buf.strip()
                    else:
                        buf += tmp
                else:
                    raise StandardError("readline error")
            
    s = server(chat)
    s.run()
def test_success_response():
    with server(success_response):
        connection = HTTPConnection(*listener)
        connection.request("GET", "/")
        response = connection.getresponse()
        assert response.should_keep_alive()
        assert response.message_complete
        assert not response.should_close()
        assert response.read().decode() == 'Hello World!'
        assert response.content_length == 12
Exemple #10
0
def test_success_response():
    with server(success_response):
        connection = HTTPConnection(*listener)
        connection.request("GET", "/")
        response = connection.getresponse()
        assert response.should_keep_alive()
        assert response.message_complete
        assert not response.should_close()
        assert response.read().decode() == 'Hello World!'
        assert response.content_length == 12
def test_close_during_chuncked_readline():
    with server(close_during_chuncked_readline):
        client = HTTPClient(*listener)
        response = client.get("/")
        assert response["transfer-encoding"] == "chunked"
        chunks = []
        with pytest.raises(HTTPException):
            data = "enter_loop"
            while data:
                data = response.readline()
                chunks.append(data)
        assert len(chunks) == 3
def test_timeout_during_chuncked_readline():
    with server(timeout_during_chuncked_readline):
        client = HTTPClient(*listener, network_timeout=0.1)
        response = client.get("/")
        assert response["transfer-encoding"] == "chunked"
        chunks = []
        with pytest.raises(gevent.socket.timeout):
            data = "enter_loop"
            while data:
                data = response.readline()
                chunks.append(data)
        assert len(chunks) == 3
def test_timeout_during_chuncked_readline():
    with server(timeout_during_chuncked_readline):
        client = HTTPClient(*listener, network_timeout=0.1)
        response = client.get('/')
        assert response['transfer-encoding'] == 'chunked'
        chunks = []
        with pytest.raises(gevent.socket.timeout):  #@UndefinedVariable
            data = 'enter_loop'
            while data:
                data = response.readline()
                chunks.append(data)
        assert len(chunks) == 3
def test_close_during_chuncked_readline():
    with server(close_during_chuncked_readline):
        client = HTTPClient(*listener)
        response = client.get('/')
        assert response['transfer-encoding'] == 'chunked'
        chunks = []
        with pytest.raises(HTTPException):  #@UndefinedVariable
            data = 'enter_loop'
            while data:
                data = response.readline()
                chunks.append(data)
        assert len(chunks) == 3
def test_close_during_chuncked_readline():
    with server(close_during_chuncked_readline):
        client = HTTPClient(*listener)
        response = client.get('/')
        assert response['transfer-encoding'] == 'chunked'
        chunks = []
        with pytest.raises(HTTPException): #@UndefinedVariable
            data = 'enter_loop'
            while data:
                data = response.readline()
                chunks.append(data)
        assert len(chunks) == 3
def test_timeout_during_chuncked_readline():
    with server(timeout_during_chuncked_readline):
        client = HTTPClient(*listener, network_timeout=0.1)
        response = client.get('/')
        assert response['transfer-encoding'] == 'chunked'
        chunks = []
        with pytest.raises(gevent.socket.timeout): #@UndefinedVariable
            data = 'enter_loop'
            while data:
                data = response.readline()
                chunks.append(data)
        assert len(chunks) == 3
def test_readline_multibyte_sep():
    with server(readline_multibyte_sep):
        client = HTTPClient(*listener, block_size=1)
        response = client.get("/")
        lines = []
        while True:
            line = response.readline("\r\n")
            if not line:
                break
            data = json.loads(line[:-1])
            lines.append(data)
        assert len(lines) == 100
        assert map(lambda x: x["index"], lines) == range(0, 100)
def test_readline_multibyte_sep():
    with server(readline_multibyte_sep):
        client = HTTPClient(*listener, block_size=1)
        response = client.get('/')
        lines = []
        while True:
            line = response.readline("\r\n")
            if not line:
                break
            data = json.loads(line[:-1])
            lines.append(data)
        assert len(lines) == 100
        assert map(lambda x: x['index'], lines) == range(0, 100)
Exemple #19
0
def test_readline_multibyte_sep():
    with server(readline_multibyte_sep):
        client = HTTPClient(*listener, block_size=1)
        response = client.get('/')
        lines = []
        while True:
            line = response.readline(b"\r\n")
            if not line:
                break
            data = json.loads(line[:-1].decode())
            lines.append(data)
        assert len(lines) == 100
        assert [x['index'] for x in lines] == [x for x in range(0, 100)]
Exemple #20
0
def test_readline_multibyte_sep():
    with server(readline_multibyte_sep):
        client = HTTPClient(*listener, block_size=1)
        response = client.get('/')
        lines = []
        while True:
            line = response.readline(b"\r\n")
            if not line:
                break
            data = json.loads(line[:-1].decode())
            lines.append(data)
        assert len(lines) == 100
        assert [x['index'] for x in lines] == [x for x in range(0, 100)]
def test_readline_multibyte_splitsep():
    with server(readline_multibyte_splitsep):
        client = HTTPClient(*listener, block_size=1)
        response = client.get('/')
        lines = []
        last_index = 0
        while True:
            line = response.readline("\r\n")
            if not line:
                break
            data = json.loads(line[:-2])
            assert data['a'] == last_index + 1
            last_index = data['a']
        len(lines) == 3
def test_readline_multibyte_splitsep():
    with server(readline_multibyte_splitsep):
        client = HTTPClient(*listener, block_size=1)
        response = client.get("/")
        lines = []
        last_index = 0
        while True:
            line = response.readline("\r\n")
            if not line:
                break
            data = json.loads(line[:-2])
            assert data["a"] == last_index + 1
            last_index = data["a"]
        len(lines) == 3
def echo():
    # 실제 사용할때는 session 을 적당히 상속받고 
    class echo(session):
        def run(self):
            self.session_name = str(self.sock)
            self.register()
            self.loop()
            self.unregister()
        def loop(self):
            while True:
                buf = self.sock.recv(1024)
                if buf:
                    self.sock.send(buf)
                else:
                    LOG("disconnected %s", self.session_name)
                    return
    # 서버에 이 클래스를 넘긴후 run 부르면 된다
    s = server(echo)
    s.run()
def echo():
    # 실제 사용할때는 session 을 적당히 상속받고
    class echo(session):
        def run(self):
            self.session_name = str(self.sock)
            self.register()
            self.loop()
            self.unregister()

        def loop(self):
            while True:
                buf = self.sock.recv(1024)
                if buf:
                    self.sock.send(buf)
                else:
                    LOG("disconnected %s", self.session_name)
                    return

    # 서버에 이 클래스를 넘긴후 run 부르면 된다
    s = server(echo)
    s.run()
def test_close_during_content():
    with server(close_during_content):
        client = HTTPClient(*listener, block_size=1)
        response = client.get('/')
        with pytest.raises(HTTPException): #@UndefinedVariable
            response.read()
def test_timeout_send():
    with server(timeout_send):
        connection = HTTPClient(*listener, network_timeout=0.1)
        with pytest.raises(gevent.socket.timeout): #@UndefinedVariable
            connection.request("GET", '/')
def test_timeout_send():
    with server(timeout_send):
        connection = HTTPClient(*listener, network_timeout=0.1)
        with pytest.raises(gevent.socket.timeout):  #@UndefinedVariable
            connection.request("GET", '/')
def test_exception():
    with server(wrong_response_status_line):
        connection = HTTPClient(*listener)
        with pytest.raises(HTTPException):
            connection.get('/')
 def test_invalid_response_from_proxy(self, connection_pool):
     with server(make_proxy_response(b"qwertyuiop")):
         with pytest.raises(ProxyError):
             connection_pool.get_socket()
def test_timeout_recv():
    with server(timeout_recv):
        connection = HTTPClient(*listener, network_timeout=0.1)
        with pytest.raises(gevent.socket.timeout):
            connection.request("GET", '/')
 def test_sock_was_closed(self, connection_pool):
     with server(closed_socket):
         with pytest.raises(ProxyError):
             connection_pool.get_socket()
def test_close():
    with server(close):
        client = HTTPClient(*listener)
        with pytest.raises(HTTPException):
            client.get("/")
def test_close_after_recv():
    with server(close_after_recv):
        client = HTTPClient(*listener)
        with pytest.raises(HTTPException):  # @UndefinedVariable
            client.get("/")
Exemple #34
0
def test_verify_hostname():
    with server(simple_ssl_response):
        http = HTTPClient(*listener, ssl=True, ssl_options={'ca_certs': CERT})
        with pytest.raises(CertificateError):
            http.get('/')
Exemple #35
0
def test_simple_ssl():
    with server(simple_ssl_response):
        http = HTTPClient(*listener, insecure=True, ssl=True, ssl_options={'ca_certs': CERT})
        response = http.get('/')
        assert response.status_code == 200
        response.read()
 def test_empty_response_from_proxy(self, connection_pool):
     with server(make_proxy_response(b"")):
         with pytest.raises(ProxyError):
             connection_pool.get_socket()
def test_content_too_small():
    with server(content_too_small):
        client = HTTPClient(*listener, network_timeout=0.2)
        with pytest.raises(gevent.socket.timeout): #@UndefinedVariable
            response = client.get('/')
            response.read()
Exemple #38
0
def test_httplib_exception():
    with server(wrong_response_status_line):
        connection = HTTPConnection(*listener)
        connection.request("GET", '/')
        with pytest.raises(HTTPException):
            connection.getresponse()
def test_timeout_recv():
    with server(timeout_recv):
        connection = HTTPClient(*listener, network_timeout=0.1)
        with pytest.raises(gevent.socket.timeout):
            connection.request("GET", "/")
 def test_invalid_status_code_from_proxy(self, connection_pool):
     with server(make_proxy_response(b"HTTP/1.1 qwerty \r\n\r\n")):
         with pytest.raises(ProxyError):
             connection_pool.get_socket()
 def test_use_proxy(self, connection_pool):
     with server(
             make_proxy_response(b"HTTP/1.1 200 \r\n\r\n",
                                 b"some response"), ):
         socket = connection_pool.get_socket()
         assert b"some response" == socket.recv(1024)
def test_content_too_small():
    with server(content_too_small):
        client = HTTPClient(*listener, network_timeout=0.2)
        with pytest.raises(gevent.socket.timeout):  #@UndefinedVariable
            response = client.get('/')
            response.read()
def test_exception():
    with server(wrong_response_status_line):
        connection = HTTPClient(*listener)
        with pytest.raises(HTTPException):
            connection.get('/')
 def test_proxy_does_not_respond(self, connection_pool):
     with server(make_proxy_response()):
         with pytest.raises(ProxyError):
             connection_pool.get_socket()
def test_close_after_recv():
    with server(close_after_recv):
        client = HTTPClient(*listener)
        with pytest.raises(HTTPException):
            client.get('/')
def test_close_after_recv():
    with server(close_after_recv):
        client = HTTPClient(*listener)
        with pytest.raises(HTTPException):
            client.get('/')
def test_verify_hostname():
    with server(simple_ssl_response) as listener:
        http = HTTPClient(*listener, ssl=True, ssl_options={'ca_certs': CERT})
        with pytest.raises(CertificateError):
            http.get('/')
def test_close_during_content():
    with server(close_during_content):
        client = HTTPClient(*listener, block_size=1)
        response = client.get('/')
        with pytest.raises(HTTPException):  #@UndefinedVariable
            response.read()
def test_httplib_exception():
    with server(wrong_response_status_line):
        connection = HTTPConnection(*listener)
        connection.request("GET", '/')
        with pytest.raises(HTTPException):
            connection.getresponse()
def chat():
    # 세션간에 서로 참조를 하는 예제
    # 클라가 처음 연결 물었을때 ID 를 물어보고 그 ID 를 세션키 삼아서 세션을 관리하도록 했다.
    # 현재는 별기능 없고 전체챗만 가능
    class chat(session):
        def run(self):
            userid = self.login()
            self.session_name = userid
            self.register()
            self.loop()
            self.unregister()

        def login(self):
            self.sock.send("type your name\r\n")
            userid = self.readline_dirty()
            self.sock.send("hello %s\r\n" % userid)
            return userid

        def loop(self):
            self.hello_everybody()
            try:
                while True:
                    msg = self.readline_dirty()
                    self.with_all_sessions(lambda k, v: v.sock.send(
                        "%s says: %s\r\n" % (self.session_name, msg)))
            except:
                # 이건 완전 땜질. 소켓이 끊어지면 급조된
                # readline_dirty 가 예외질을 해서 적절히
                # 막아줬다. 서비스코드라면 에러대책을 세워야겠지.
                pass
            self.goodbye_everybody()

        def hello_everybody(self):
            self.with_all_sessions(lambda k, v: v.sock.send(
                "*** %s joined\r\n" % self.session_name))

        def goodbye_everybody(self):
            self.with_all_sessions(lambda k, v: v.sock.send("*** %s left\r\n" %
                                                            self.session_name))

        def with_all_sessions(self, fun):
            # 사실상 server 쪽에 위치해야 하는 함수인데 일단 예제니까.
            # 그냥 for 쓰는게 더 보기 좋지만 self.mother.sessions 로 접근하는게 후에 바뀔수 있으니 함수 하나로 모아뒀다.
            for k, v in self.mother.sessions.iteritems():
                fun(k, v)

        def readline_dirty(self):
            # makefile 을 통해서 readline 을 쓰는게 가능한데 예제코드라 그냥 이짓을 했다
            buf = ""
            while True:
                tmp = self.sock.recv(1)
                if tmp:
                    if tmp == "\n":
                        return buf.strip()
                    else:
                        buf += tmp
                else:
                    raise StandardError("readline error")

    s = server(chat)
    s.run()
 def test_not_200_code(self, connection_pool):
     with server(make_proxy_response(b"HTTP/1.1 429 \r\n\r\n")):
         with pytest.raises(ProxyError):
             connection_pool.get_socket()