- def _req_error(self, err, request):
- self._req_cancel(request)
-
- def queue_outbound(self, packet):
- self._pq.append((time.monotonic(), packet))
-
- def http_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):
- while True:
- try: request = self._rq[0]
- except IndexError: request = None
- if request and request.finished:
- self._rq.popleft()
- continue
-
- # now request is an unfinished request, or None
- try: (queuetime, packet) = self._pq[0]
- except IndexError:
- # no packets, oh well
- break
-
- age = time.monotonic() - queuetime
- if age > self.max_queue_time:
- self._pq.popleft()
- continue
-
- if request is None:
- # no request
- break
-
- # request, and also some non-expired packets
- while True:
- try: (dummy, packet) = self._pq[0]
- except IndexError: break
-
- encoded = slip_encode(packet)
-
- if request.sentLength > 0:
- if (request.sentLength + len(slip_delimiter)
- + len(encoded) > self.max_batch_down):
- break
- request.write(slip_delimiter)
-
- request.write(encoded)
- self._pq.popLeft()
-
- assert(request.sentLength)
- self._rq.popLeft()
- request.finish()
- # round again, looking for more to do
+def process_request(request):
+ # find client, update config, etc.
+ metadata = request.args['m']
+ (ci_s, pw, tro) = metadata.split(b'\n')[0:3]
+ ci = ipaddr(ci_s)
+ cl = clients[ci]
+ if pw != cl.pw: raise ValueError('bad password')
+
+ if pw != cl.target_requests_outstanding:
+ raise ...
+
+ try: d = request.args['d']
+ except KeyError: d = ''
+
+ cl.process_arriving_data(d)
+ cl.new_request(request)