def capture_async(self, headers=None, **kwargs): ''' Returns a screenshot of the URL. Runs asynchronously in Gramex. Arguments are same as :py:func:`capture` ''' # If ?start is provided, start server and wait until timeout if 'start' in kwargs: self.start() end_time = time.time() + self.timeout while not self.started and time.time() < end_time: yield tornado.gen.sleep(self.check_interval) if not self.started: raise RuntimeError('%s not started. See logs' % self.engine.script) if six.PY2: recursive_encode(kwargs) r = yield self.browser.fetch(self.url, method='POST', body=urlencode(kwargs, doseq=True), raise_error=False, connect_timeout=self.timeout, request_timeout=self.timeout, headers=headers) if r.code == OK: self._validate_server(r) raise tornado.gen.Return(r)
def test_recursive_encode(self): ua, ub = 'α', 'β' ba, bb = ua.encode('utf-8'), ub.encode('utf-8') src = {ua: ub, True: [1, ub], None: {ua: ub, '': {ua: 1, ub: 0.1}}} out = {ba: bb, True: [1, bb], None: {ba: bb, b'': {ba: 1, bb: 0.1}}} recursive_encode(src) eq_(src, out)
def __call__(self, *cmds): _key, cmds = cmds, list(cmds) if _key not in self.cache: # deepcopy of args preserving order args = OrderedDict((k, list(v)) for k, v in self.args.items()) while len(cmds): cmd = cmds.pop(0) if cmd == ADD: key, val = cmds.pop(0), cmds.pop(0) if key not in args: args[key] = [val] elif val not in args[key]: args[key].append(val) elif cmd == SET: key, val = cmds.pop(0), cmds.pop(0) if val is None: args.pop(key, None) else: args[key] = [val] elif cmd == POP: key = cmds.pop(0) val = cmds.pop( 0) if len(cmds) and cmds[0] not in self.cmds else None if key in args: if val is None: args.pop(key) elif val in args[key]: args[key].remove(val) elif cmd == XOR: key, val = cmds.pop(0), cmds.pop(0) if key in args: if val in args[key]: args[key].remove(val) else: args[key].append(val) else: args[key] = [val] if six.PY2: recursive_encode(args) self.cache[_key] = urlencode(args, doseq=True) return self.cache[_key]