[tor-commits] [ooni-probe/master] Progress on implementing web_connectivity test

art at torproject.org art at torproject.org
Mon May 30 16:28:32 UTC 2016


commit 9ab068b324290df91d4296f2f3388071df3bbac4
Author: Arturo Filastò <arturo at filasto.net>
Date:   Tue Feb 2 16:07:04 2016 +0100

    Progress on implementing web_connectivity test
---
 ooni/nettests/blocking/web_connectivity.py | 62 ++++++++++++++++++++----------
 1 file changed, 42 insertions(+), 20 deletions(-)

diff --git a/ooni/nettests/blocking/web_connectivity.py b/ooni/nettests/blocking/web_connectivity.py
index bcc3a28..bc23f6d 100644
--- a/ooni/nettests/blocking/web_connectivity.py
+++ b/ooni/nettests/blocking/web_connectivity.py
@@ -13,7 +13,7 @@ from twisted.python import usage
 from ooni.utils import log
 
 from ooni.utils.net import StringProducer, BodyReceiver
-from ooni.templates import httpt, dnst, tcpt
+from ooni.templates import httpt, dnst
 from ooni.errors import failureToString
 
 class TCPConnectProtocol(Protocol):
@@ -21,6 +21,7 @@ class TCPConnectProtocol(Protocol):
         self.transport.loseConnection()
 
 class TCPConnectFactory(Factory):
+    noisy = False
     def buildProtocol(self, addr):
         return TCPConnectProtocol()
 
@@ -74,6 +75,9 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
         self.report['accessible'] = None
         self.report['blocking'] = None
 
+        self.report['control_failure'] = None
+        self.report['experiment_failure'] = None
+
         self.report['tcp_connect'] = [
         ]
 
@@ -83,8 +87,10 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
 
         self.control = {
             'tcp_connect': {},
-            'dns_consistency': [],
-            'http_requests': {
+            'dns': {
+                'ips': []
+            },
+            'http_request': {
                 'body_length': None,
                 'headers': {}
             }
@@ -93,7 +99,7 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
     def dns_discovery(self):
         return self.performALookup(self.localOptions['dns-discovery'])
 
-    def dns_consistency(self):
+    def experiment_dns_query(self):
         return self.performALookup(self.hostname)
 
     def tcp_connect(self, socket):
@@ -119,6 +125,7 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
         @d.addErrback
         def eb(failure):
             result['status']['success'] = False
+            result['status']['failure'] = failureToString(failure)
             self.report['tcp_connect'].append(result)
         return d
 
@@ -144,11 +151,7 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
     def experiment_http_get_request(self):
         return self.doRequest(self.input)
 
-    def compare_control_experiment(self, experiment_http_response,
-                                   experiment_dns_answers):
-
-        blocking = None
-
+    def compare_body_lengths(self, experiment_http_response):
         control_body_length = self.control['http_request']['body_length']
         experiment_body_length = len(experiment_http_response.body)
 
@@ -165,20 +168,22 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
         self.report['body_proportion'] = rel
         if rel > float(self.factor):
             self.report['body_length_match'] = True
+            return None
         else:
-            blocking = 'http'
             self.report['body_length_match'] = False
+            return 'http'
 
+    def compare_dns_experiments(self, experiment_dns_answers):
         control_ips = set(self.control['dns']['ips'])
         experiment_ips = set(experiment_dns_answers)
 
         if len(control_ips.intersection(experiment_ips)) > 0:
             self.report['dns_consistency'] = 'consistent'
         else:
-            if blocking is not None:
-                blocking = 'dns'
             self.report['dns_consistency'] = 'inconsistent'
 
+    def compare_tcp_experiments(self):
+        blocking = False
         for idx, result in enumerate(self.report['tcp_connect']):
             socket = "%s:%s" % (result['ip'], result['port'])
             control_status = self.control['tcp_connect'][socket]
@@ -189,14 +194,13 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
                 blocking = 'tcp_ip'
             else:
                 self.report['tcp_connect'][idx]['status']['blocked'] = False
-
-        self.report['blocking'] = blocking
+        return blocking
 
     @defer.inlineCallbacks
     def test_web_connectivity(self):
         results = yield defer.DeferredList([
             self.dns_discovery(),
-            self.dns_consistency()
+            self.experiment_dns_query()
         ])
 
         self.report['client_resolver'] = None
@@ -207,11 +211,29 @@ class WebConnectivityTest(httpt.HTTPTest, dnst.DNSTest):
 
         sockets = map(lambda x: "%s:80" % x, results[1][1])
 
-        dl = [self.control_request(sockets)]
+        control_request = self.control_request(sockets)
+        @control_request.addErrback
+        def control_err(failure):
+            self.report['control_failure'] = failureToString(failure)
+
+        dl = [control_request]
         for socket in sockets:
             dl.append(self.tcp_connect(socket))
-        yield defer.DeferredList(dl)
+        results = yield defer.DeferredList(dl)
+
+        experiment_http = self.experiment_http_get_request()
+        @experiment_http.addErrback
+        def experiment_err(failure):
+            self.report['experiment_failure'] = failureToString(failure)
+
+        experiment_http_response = yield experiment_http
+
+        if self.report['control_failure'] is None and \
+                self.report['experiment_failure'] is None:
+            self.compare_body_lenghts(experiment_http_response)
+
+        if self.report['control_failure'] is None:
+            self.compare_dns_experiments(experiment_dns_answers)
 
-        experiment_http_response = yield self.experiment_http_get_request()
-        self.compare_control_experiment(experiment_http_response,
-                                        experiment_dns_answers)
+        if self.report['control_failure'] is None:
+            self.compare_tcp_experiments()





More information about the tor-commits mailing list