@@ -47,16 +47,12 @@ logger = logger.getChild('search')
47number_of_searches = 0
47number_of_searches = 0
50−def send_http_request(engine, request_params, start_time, timeout_limit):
50+def send_http_request(engine, request_params):
51− # for page_load_time stats
52− time_before_request = time()
54 # create dictionary which contain all
51 # create dictionary which contain all
55 # informations about the request
52 # informations about the request
56 request_args = dict(
53 request_args = dict(
57 headers=request_params['headers'],
54 headers=request_params['headers'],
58 cookies=request_params['cookies'],
55 cookies=request_params['cookies'],
59− timeout=timeout_limit,
60 verify=request_params['verify']
56 verify=request_params['verify']
@@ -68,29 +64,10 @@ def send_http_request(engine, request_params, start_time, timeout_limit):
68 request_args['data'] = request_params['data']
64 request_args['data'] = request_params['data']
70 # send the request
66 # send the request
71− response = req(request_params['url'], **request_args)
67+ return req(request_params['url'], **request_args)
73− # is there a timeout (no parsing in this case)
74− timeout_overhead = 0.2 # seconds
75− time_after_request = time()
76− search_duration = time_after_request - start_time
77− if search_duration > timeout_limit + timeout_overhead:
78− raise requests.exceptions.Timeout(response=response)
80− with threading.RLock():
81− # no error : reset the suspend variables
82− engine.continuous_errors = 0
83− engine.suspend_end_time = 0
84− # update stats with current page-load-time
85− # only the HTTP request
86− engine.stats['page_load_time'] += time_after_request - time_before_request
87− engine.stats['page_load_count'] += 1
89− # everything is ok : return the response
93−def search_one_request(engine, query, request_params, start_time, timeout_limit):
70+def search_one_request(engine, query, request_params):
94 # update request parameters dependent on
71 # update request parameters dependent on
95 # search-engine (contained in engines folder)
72 # search-engine (contained in engines folder)
96 engine.request(query, request_params)
73 engine.request(query, request_params)
@@ -103,7 +80,7 @@ def search_one_request(engine, query, request_params, start_time, timeout_limit)
103 return []
80 return []
105 # send request
82 # send request
106− response = send_http_request(engine, request_params, start_time, timeout_limit)
83+ response = send_http_request(engine, request_params)
108 # parse the response
85 # parse the response
109 response.search_params = request_params
86 response.search_params = request_params
@@ -111,11 +88,20 @@ def search_one_request(engine, query, request_params, start_time, timeout_limit)
113def search_one_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit):
90def search_one_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit):
91+ # set timeout for all HTTP requests
92+ requests_lib.set_timeout_for_thread(timeout_limit, start_time=start_time)
93+ # reset the HTTP total time
94+ requests_lib.reset_time_for_thread()
114 engine = engines[engine_name]
97 engine = engines[engine_name]
99+ # suppose everything will be alright
100+ requests_exception = False
117 # send requests and parse the results
103 # send requests and parse the results
118− search_results = search_one_request(engine, query, request_params, start_time, timeout_limit)
104+ search_results = search_one_request(engine, query, request_params)
120 # add results
106 # add results
121 result_container.extend(engine_name, search_results)
107 result_container.extend(engine_name, search_results)
@@ -124,14 +110,15 @@ def search_one_request_safe(engine_name, query, request_params, result_container
124 with threading.RLock():
110 with threading.RLock():
125 engine.stats['engine_time'] += time() - start_time
111 engine.stats['engine_time'] += time() - start_time
126 engine.stats['engine_time_count'] += 1
112 engine.stats['engine_time_count'] += 1
127−
113+ # update stats with the total HTTP time
128− return True
114+ engine.stats['page_load_time'] += requests_lib.get_time_for_thread()
115+ engine.stats['page_load_count'] += 1
130 except Exception as e:
117 except Exception as e:
131− engine.stats['errors'] += 1
133 search_duration = time() - start_time
118 search_duration = time() - start_time
134− requests_exception = False
119+
120+ with threading.RLock():
121+ engine.stats['errors'] += 1
136 if (issubclass(e.__class__, requests.exceptions.Timeout)):
123 if (issubclass(e.__class__, requests.exceptions.Timeout)):
137 result_container.add_unresponsive_engine((engine_name, gettext('timeout')))
124 result_container.add_unresponsive_engine((engine_name, gettext('timeout')))
@@ -152,14 +139,17 @@ def search_one_request_safe(engine_name, query, request_params, result_container
152 # others errors
139 # others errors
153 logger.exception('engine {0} : exception : {1}'.format(engine_name, e))
140 logger.exception('engine {0} : exception : {1}'.format(engine_name, e))
155− # update continuous_errors / suspend_end_time
142+ # suspend or not the engine if there are HTTP errors
143+ with threading.RLock():
156 if requests_exception:
144 if requests_exception:
157− with threading.RLock():
145+ # update continuous_errors / suspend_end_time
158− engine.continuous_errors += 1
146+ engine.continuous_errors += 1
159− engine.suspend_end_time = time() + min(60, engine.continuous_errors)
147+ engine.suspend_end_time = time() + min(60, engine.continuous_errors)
161− #
149+ # no HTTP error (perhaps an engine error)
162− return False
150+ # anyway, reset the suspend variables
151+ engine.continuous_errors = 0
152+ engine.suspend_end_time = 0
165def search_multiple_requests(requests, result_container, start_time, timeout_limit):
155def search_multiple_requests(requests, result_container, start_time, timeout_limit):