+ if ip in clients:
+ raise ValueError('multiple client cfg sections for %s' % ip)
+ clients[ip] = self
+
+ log_debug('DBG.INIT', 'new client %s' % self)
+
+ def process_arriving_data(self, d):
+ log_data(DBG.FLOW, d, 'client req data: %s' % saddr=self._ip)
+ for packet in slip.decode(d):
+ (saddr, daddr) = packet_addrs(packet)
+ if saddr != self._ip:
+ raise ValueError('wrong source address %s' % saddr)
+ route(packet, saddr, daddr)
+
+ def _req_cancel(self, request):
+ log_httpreq(DBG.HTTPCTRL, request, 'cancel')
+ request.finish()
+
+ def _req_error(self, err, request):
+ log_httpreq(DBG.HTTPCTRL, request, 'error %s' % err)
+ self._req_cancel(request)
+
+ def queue_outbound(self, packet):
+ self._pq.append(packet)
+ self._check_outbound()
+
+ def new_request(self, request):
+ request.setHeader('Content-Type','application/octet-stream')
+ reactor.callLater(self.max_request_time, self._req_cancel, request)
+ request.notifyFinish().addErrback(self._req_error, request)
+ self._rq.append(request)
+ self._check_outbound()
+
+ def _check_outbound(self):
+ log_httpreq(DBG.HTTPCTRL, None, 'CHKO')
+ while True:
+ try: request = self._rq[0]
+ except IndexError: request = None
+ if request and request.finished:
+ log_httpreq(DBG.HTTP_CTRL, request, 'CHKO request finished, discard')
+ self._rq.popleft()
+ continue
+
+ if not self._pq.nonempty():
+ # no packets, oh well
+ log_httpreq(DBG.HTTP_CTRL, request, 'CHKO no packets, OUT-DONE')
+ break
+
+ if request is None:
+ # no request
+ log_httpreq(DBG.HTTP_CTRL, request, 'CHKO no request, OUT-DONE')
+ break
+
+ log_httpreq(DBG.HTTP_CTRL, request, 'CHKO processing')
+ # request, and also some non-expired packets
+ self._pq.process((lambda: request.sentLength),
+ request.write,
+ self.max_batch_down)
+
+ assert(request.sentLength)
+ self._rq.popleft()
+ request.finish()
+ log_httpreq(DBG.HTTP, request, 'complete')
+ # round again, looking for more to do
+
+ while len(self._rq) > self.target_requests_outstanding:
+ request = self._rq.popleft()
+ log_httpreq(DBG.HTTP, request, 'CHKO above target, returning empty')