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.'
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_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
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_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)
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 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_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("/")
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('/')
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()
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_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_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 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()