Changeset View
Changeset View
Standalone View
Standalone View
test/functional/interface_http.py
Show All 26 Lines | def run_test(self): | ||||
url = urllib.parse.urlparse(self.nodes[0].url) | url = urllib.parse.urlparse(self.nodes[0].url) | ||||
authpair = url.username + ':' + url.password | authpair = url.username + ':' + url.password | ||||
headers = {"Authorization": "Basic " + str_to_b64str(authpair)} | headers = {"Authorization": "Basic " + str_to_b64str(authpair)} | ||||
conn = http.client.HTTPConnection(url.hostname, url.port) | conn = http.client.HTTPConnection(url.hostname, url.port) | ||||
conn.connect() | conn.connect() | ||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
assert(conn.sock != None) | assert conn.sock != None | ||||
# according to http/1.1 connection must still be open! | # according to http/1.1 connection must still be open! | ||||
# send 2nd request without closing connection | # send 2nd request without closing connection | ||||
conn.request('POST', '/', '{"method": "getchaintips"}', headers) | conn.request('POST', '/', '{"method": "getchaintips"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
# must also response with a correct json-rpc message | # must also response with a correct json-rpc message | ||||
assert(conn.sock != None) | assert conn.sock != None | ||||
# according to http/1.1 connection must still be open! | # according to http/1.1 connection must still be open! | ||||
conn.close() | conn.close() | ||||
# same should be if we add keep-alive because this should be the std. | # same should be if we add keep-alive because this should be the std. | ||||
# behaviour | # behaviour | ||||
headers = {"Authorization": "Basic " + | headers = {"Authorization": "Basic " + | ||||
str_to_b64str(authpair), "Connection": "keep-alive"} | str_to_b64str(authpair), "Connection": "keep-alive"} | ||||
conn = http.client.HTTPConnection(url.hostname, url.port) | conn = http.client.HTTPConnection(url.hostname, url.port) | ||||
conn.connect() | conn.connect() | ||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
assert(conn.sock != None) | assert conn.sock != None | ||||
# according to http/1.1 connection must still be open! | # according to http/1.1 connection must still be open! | ||||
# send 2nd request without closing connection | # send 2nd request without closing connection | ||||
conn.request('POST', '/', '{"method": "getchaintips"}', headers) | conn.request('POST', '/', '{"method": "getchaintips"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
# must also response with a correct json-rpc message | # must also response with a correct json-rpc message | ||||
assert(conn.sock != None) | assert conn.sock != None | ||||
# according to http/1.1 connection must still be open! | # according to http/1.1 connection must still be open! | ||||
conn.close() | conn.close() | ||||
# now do the same with "Connection: close" | # now do the same with "Connection: close" | ||||
headers = {"Authorization": "Basic " + | headers = {"Authorization": "Basic " + | ||||
str_to_b64str(authpair), "Connection": "close"} | str_to_b64str(authpair), "Connection": "close"} | ||||
conn = http.client.HTTPConnection(url.hostname, url.port) | conn = http.client.HTTPConnection(url.hostname, url.port) | ||||
conn.connect() | conn.connect() | ||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
assert(conn.sock == None) | assert conn.sock == None | ||||
# now the connection must be closed after the response | # now the connection must be closed after the response | ||||
# node1 (2nd node) is running with disabled keep-alive option | # node1 (2nd node) is running with disabled keep-alive option | ||||
urlNode1 = urllib.parse.urlparse(self.nodes[1].url) | urlNode1 = urllib.parse.urlparse(self.nodes[1].url) | ||||
authpair = urlNode1.username + ':' + urlNode1.password | authpair = urlNode1.username + ':' + urlNode1.password | ||||
headers = {"Authorization": "Basic " + str_to_b64str(authpair)} | headers = {"Authorization": "Basic " + str_to_b64str(authpair)} | ||||
conn = http.client.HTTPConnection(urlNode1.hostname, urlNode1.port) | conn = http.client.HTTPConnection(urlNode1.hostname, urlNode1.port) | ||||
conn.connect() | conn.connect() | ||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
# node2 (third node) is running with standard keep-alive parameters | # node2 (third node) is running with standard keep-alive parameters | ||||
# which means keep-alive is on | # which means keep-alive is on | ||||
urlNode2 = urllib.parse.urlparse(self.nodes[2].url) | urlNode2 = urllib.parse.urlparse(self.nodes[2].url) | ||||
authpair = urlNode2.username + ':' + urlNode2.password | authpair = urlNode2.username + ':' + urlNode2.password | ||||
headers = {"Authorization": "Basic " + str_to_b64str(authpair)} | headers = {"Authorization": "Basic " + str_to_b64str(authpair)} | ||||
conn = http.client.HTTPConnection(urlNode2.hostname, urlNode2.port) | conn = http.client.HTTPConnection(urlNode2.hostname, urlNode2.port) | ||||
conn.connect() | conn.connect() | ||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | ||||
out1 = conn.getresponse().read() | out1 = conn.getresponse().read() | ||||
assert(b'"error":null' in out1) | assert b'"error":null' in out1 | ||||
assert(conn.sock != None) | assert conn.sock != None | ||||
# connection must be closed because bitcoind should use | # connection must be closed because bitcoind should use | ||||
# keep-alive by default | # keep-alive by default | ||||
# Check excessive request size | # Check excessive request size | ||||
conn = http.client.HTTPConnection(urlNode2.hostname, urlNode2.port) | conn = http.client.HTTPConnection(urlNode2.hostname, urlNode2.port) | ||||
conn.connect() | conn.connect() | ||||
conn.request('GET', '/' + ('x' * 1000), '', headers) | conn.request('GET', '/' + ('x' * 1000), '', headers) | ||||
out1 = conn.getresponse() | out1 = conn.getresponse() | ||||
Show All 15 Lines | def run_test(self): | ||||
"Origin": origin} | "Origin": origin} | ||||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | conn.request('POST', '/', '{"method": "getbestblockhash"}', headers) | ||||
out1 = conn.getresponse() | out1 = conn.getresponse() | ||||
assert_equal(out1.status, http.client.OK) | assert_equal(out1.status, http.client.OK) | ||||
assert_equal(out1.headers["Access-Control-Allow-Origin"], origin) | assert_equal(out1.headers["Access-Control-Allow-Origin"], origin) | ||||
assert_equal(out1.headers["Access-Control-Allow-Credentials"], "true") | assert_equal(out1.headers["Access-Control-Allow-Credentials"], "true") | ||||
assert_equal(out1.headers["Access-Control-Expose-Headers"], | assert_equal(out1.headers["Access-Control-Expose-Headers"], | ||||
"WWW-Authenticate") | "WWW-Authenticate") | ||||
assert(b'"error":null' in out1.read()) | assert b'"error":null' in out1.read() | ||||
# Check Pre-flight CORS request | # Check Pre-flight CORS request | ||||
corsheaders = {"Origin": origin, | corsheaders = {"Origin": origin, | ||||
"Access-Control-Request-Method": "POST"} | "Access-Control-Request-Method": "POST"} | ||||
conn.request('OPTIONS', '/', None, corsheaders) | conn.request('OPTIONS', '/', None, corsheaders) | ||||
out1 = conn.getresponse() | out1 = conn.getresponse() | ||||
assert_equal(out1.status, http.client.OK) | assert_equal(out1.status, http.client.OK) | ||||
assert_equal(out1.headers["Access-Control-Allow-Origin"], origin) | assert_equal(out1.headers["Access-Control-Allow-Origin"], origin) | ||||
Show All 28 Lines |