+ self._log(DBG.INIT, 'new')
+
+ def _log(self, dflag, msg, **kwargs):
+ log_debug(dflag, ('client %s: ' % self._ip)+msg, **kwargs)
+
+ def process_arriving_data(self, d):
+ self._log(DBG.FLOW, "req data (enc'd)", d=d)
+ if not len(d): return
+ for packet in slip.decode(d):
+ (saddr, daddr) = packet_addrs(packet)
+ if saddr != self._ip:
+ raise ValueError('wrong source address %s' % saddr)
+ route(packet, self._ip, saddr, daddr)
+
+ def _req_cancel(self, request):
+ self._log(DBG.HTTP_CTRL, 'cancel', idof=request)
+ request.finish()
+
+ def _req_error(self, err, request):
+ self._log(DBG.HTTP_CTRL, 'error %s' % err, idof=request)
+ 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.http_timeout, self._req_cancel, request)
+ request.notifyFinish().addErrback(self._req_error, request)
+ self._rq.append(request)
+ self._check_outbound()
+
+ def _req_write(self, req, d):
+ self._log(DBG.HTTP, 'req_write ', idof=req, d=d)
+ req.write(d)
+
+ def _check_outbound(self):
+ log_debug(DBG.HTTP_CTRL, 'CHKO')
+ while True:
+ try: request = self._rq[0]
+ except IndexError: request = None
+ if request and request.finished:
+ self._log(DBG.HTTP_CTRL, 'CHKO req finished, discard', idof=request)
+ self._rq.popleft()
+ continue
+
+ if not self._pq.nonempty():
+ # no packets, oh well
+ self._log(DBG.HTTP_CTRL, 'CHKO no packets, OUT-DONE', idof=request)
+ break
+
+ if request is None:
+ # no request
+ self._log(DBG.HTTP_CTRL, 'CHKO no request, OUT-DONE', idof=request)
+ break
+
+ self._log(DBG.HTTP_CTRL, 'CHKO processing', idof=request)
+ # request, and also some non-expired packets
+ self._pq.process((lambda: request.sentLength),
+ (lambda d: self._req_write(request, d)),
+ self.max_batch_down)
+
+ assert(request.sentLength)
+ self._rq.popleft()
+ request.finish()
+ self._log(DBG.HTTP, 'complete', idof=request)
+ # round again, looking for more to do
+
+ while len(self._rq) > self.target_requests_outstanding:
+ request = self._rq.popleft()
+ self._log(DBG.HTTP, 'CHKO above target, returning empty', idof=request)