aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2014-12-08 09:25:18 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2014-12-08 09:25:18 +0100
commit053038e5ba116cb319fb85f3cb3e062cf1b3df15 (patch)
tree4cfa64a957bda9a85834780e110f7d0ed1bd3a69
parent4d8bea0dc35841970760a9b55d75c3a2afc0aca9 (diff)
parent11d7a7d505717b2574e43f157c10a681f3f8c134 (diff)
Merge pull request #5436
11d7a7d [RPC] add rpc-test for http keep-alive (persistent connections) (Jonas Schnelli)
-rwxr-xr-xqa/pull-tester/rpc-tests.sh1
-rwxr-xr-xqa/rpc-tests/httpbasics.py76
2 files changed, 77 insertions, 0 deletions
diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh
index a93b80686b..071935759b 100755
--- a/qa/pull-tester/rpc-tests.sh
+++ b/qa/pull-tester/rpc-tests.sh
@@ -24,6 +24,7 @@ if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then
${BUILDDIR}/qa/rpc-tests/getchaintips.py --srcdir "${BUILDDIR}/src"
${BUILDDIR}/qa/rpc-tests/rest.py --srcdir "${BUILDDIR}/src"
${BUILDDIR}/qa/rpc-tests/mempool_spendcoinbase.py --srcdir "${BUILDDIR}/src"
+ ${BUILDDIR}/qa/rpc-tests/httpbasics.py --srcdir "${BUILDDIR}/src"
#${BUILDDIR}/qa/rpc-tests/forknotify.py --srcdir "${BUILDDIR}/src"
else
echo "No rpc tests to run. Wallet, utils, and bitcoind must all be enabled"
diff --git a/qa/rpc-tests/httpbasics.py b/qa/rpc-tests/httpbasics.py
new file mode 100755
index 0000000000..a94edaffa5
--- /dev/null
+++ b/qa/rpc-tests/httpbasics.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test REST interface
+#
+
+from test_framework import BitcoinTestFramework
+from util import *
+import base64
+
+try:
+ import http.client as httplib
+except ImportError:
+ import httplib
+try:
+ import urllib.parse as urlparse
+except ImportError:
+ import urlparse
+
+class RESTTest (BitcoinTestFramework):
+ def run_test(self):
+
+ #################################################
+ # lowlevel check for http persistent connection #
+ #################################################
+ url = urlparse.urlparse(self.nodes[0].url)
+ authpair = url.username + ':' + url.password
+ headers = {"Authorization": "Basic " + base64.b64encode(authpair)}
+
+ conn = httplib.HTTPConnection(url.hostname, url.port)
+ conn.connect()
+ conn.request('GET', '/', '{"method": "getbestblockhash"}', headers)
+ out1 = conn.getresponse().read();
+ assert_equal('"error":null' in out1, True)
+ assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
+
+ #send 2nd request without closing connection
+ conn.request('GET', '/', '{"method": "getchaintips"}', headers)
+ out2 = conn.getresponse().read();
+ assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
+ assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
+ conn.close()
+
+ #same should be if we add keep-alive because this should be the std. behaviour
+ headers = {"Authorization": "Basic " + base64.b64encode(authpair), "Connection": "keep-alive"}
+
+ conn = httplib.HTTPConnection(url.hostname, url.port)
+ conn.connect()
+ conn.request('GET', '/', '{"method": "getbestblockhash"}', headers)
+ out1 = conn.getresponse().read();
+ assert_equal('"error":null' in out1, True)
+ assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
+
+ #send 2nd request without closing connection
+ conn.request('GET', '/', '{"method": "getchaintips"}', headers)
+ out2 = conn.getresponse().read();
+ assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
+ assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
+ conn.close()
+
+ #now do the same with "Connection: close"
+ headers = {"Authorization": "Basic " + base64.b64encode(authpair), "Connection":"close"}
+
+ conn = httplib.HTTPConnection(url.hostname, url.port)
+ conn.connect()
+ conn.request('GET', '/', '{"method": "getbestblockhash"}', headers)
+ out1 = conn.getresponse().read();
+ assert_equal('"error":null' in out1, True)
+ assert_equal(conn.sock!=None, False) #now the connection must be closed after the response
+
+
+if __name__ == '__main__':
+ RESTTest ().main ()