def head_request(self): # for keep alive, not work now. self.accept_task = False self.request_onway = True self.record_active("head") start_time = time.time() # xlog.debug("head request %s", self.ip) request_data = 'GET / HTTP/1.1\r\nHost: %s\r\n\r\n' % self.ssl_sock.host try: data = request_data.encode() ret = self.ssl_sock.send(data) if ret != len(data): xlog.warn("h1 head send len:%r %d %s", ret, len(data), self.ip) xlog.warn('%s trace:%s', self.ip, self.get_trace()) return False response = simple_http_client.Response(self.ssl_sock) response.begin(timeout=30) status = response.status if status != 200: xlog.warn("%s host:%s head fail status:%d", self.ip, self.ssl_sock.host, status) return False content = response.readall(timeout=5) time_now = time.time() self.record_active("head end") self.rtt = (time_now - start_time) * 1000 self.last_active_time = start_time ip_manager.update_ip(self.ip, self.rtt) self.accept_task = True return True except httplib.BadStatusLine as e: time_now = time.time() inactive_time = time_now - self.last_active_time head_timeout = time_now - start_time xlog.warn("%s keep alive fail, inactive_time:%d head_timeout:%d", self.ssl_sock.ip, inactive_time, head_timeout) xlog.warn('%s trace:%s', self.ip, self.get_trace()) ip_manager.report_connect_closed(self.ip, "down fail") self.close("head fail") except Exception as e: xlog.warn("h1 %s HEAD keep alive request fail:%r", self.ssl_sock.ip, e) xlog.warn('%s trace:%s', self.ip, self.get_trace()) ip_manager.report_connect_closed(self.ip, "down fail") self.close("head fail") finally: self.request_onway = False
def _create_ssl_connection(self, ip_port): if not connect_control.allow_connect(): time.sleep(10) return False ip = ip_port[0] port = ip_port[1] connect_control.start_connect_register(high_prior=True) time_begin = time.time() try: xlog.debug("try connect %s", ip) ssl_sock = check_ip.connect_ssl(ip, port=port, timeout=self.connect_timeout, on_close=ip_manager.ssl_closed) ip_manager.update_ip(ip, ssl_sock.handshake_time) xlog.debug("create_ssl update ip:%s time:%d h2:%d sni:%s top:%s", ip, ssl_sock.handshake_time, ssl_sock.h2, ssl_sock.sni, ssl_sock.top_domain) ssl_sock.last_use_time = ssl_sock.create_time ssl_sock.received_size = 0 ssl_sock.load = 0 ssl_sock.host = self.sub + "." + ssl_sock.top_domain connect_control.report_connect_success() return ssl_sock except Exception as e: time_cost = time.time() - time_begin if time_cost < self.connect_timeout - 1: xlog.debug("connect %s fail:%s cost:%d ", ip, e, time_cost * 1000) else: xlog.debug("%s fail:%r", ip, e) ip_manager.report_connect_fail(ip) connect_control.report_connect_fail() if not check_local_network.is_ok(): time.sleep(10) else: time.sleep(1) return False finally: connect_control.end_connect_register(high_prior=True)