示例#1
0
 def process_flow(self, f: flow.Flow) -> None:
     if self.should_intercept(f):
         assert f.reply
         if f.reply.state != "start":
             return ctx.log.debug(
                 "Cannot intercept request that is already taken by another addon."
             )
         f.intercept()
示例#2
0
 def _sig_flow_add(self, view: View, flow: Flow):
     flow.mode = self.mode.value
     self._event_queue.put_nowait(
         events.FlowAddEvent(
             proxy_mode=self.mode,
             flow_state=get_flow_state(flow),
         ))
示例#3
0
	def request(self, flow: Flow) -> None:
		if flow.response or flow.error or (flow.reply and flow.reply.state == 'taken'):
			return
		if not (self.filter and self.filter(flow)):
			return

		headers = {
			'server': version.MITMPROXY,
		}

		script = self._get_script()
		if not script:
			flow.response = Response.make(404, None, headers)
			return

		headers['content-type'] = 'application/javascript'
		flow.response = Response.make(200, script, headers)
示例#4
0
    async def _async_request(self, flow: Flow) -> None:
        referer = flow.request.headers['referer']
        log.info(f'Webmanifest request from {referer}.')
        headers = {
            'server': version.MITMPROXY,
        }

        try:
            character_info = await wait_for(self.data.get(referer), timeout=15)
        except (TimeoutError, CancelledError):
            log.error(
                f'Timeout while waiting for character data from {referer}.')
            flow.response = Response.make(404, b'', headers)
            return

        data = loads(character_info.decode('utf-8'))['data']
        character_name = data['name']
        avatar_url = data['decorations'].get('avatarUrl', None)
        manifest = {
            'name': f'{character_name} - D&D Beyond',
            'short_name': character_name,
            'description':
            'An official digital toolset for Fifth Edition (5e) Dungeons & Dragons (D&D).',
            'icons': [],
            'display': 'fullscreen',
            'start_url': referer,
        }
        if avatar_url:
            manifest['icons'].append({
                'src': avatar_url,
                'sizes': '192x192',
                'type': 'image/webp',
            })
        else:
            manifest['icons'].append({
                'src':
                'https://www.dndbeyond.com/Content/Skins/Waterdeep/images/characters/default-avatar-builder.png',
                'sizes': '192x192',
                'type': 'image/png',
            })

        headers['content-type'] = 'application/webmanifest+json'
        flow.response = Response.make(200,
                                      dumps(manifest).encode('utf-8'), headers)
示例#5
0
 def get_modified(self, flow: Flow) -> bool:
     return flow.modified()
示例#6
0
 def add(self, f: flow.Flow):
     if self.flt and not flowfilter.match(self.flt, f):
         return
     d = f.get_state()
     tnetstring.dump(d, self.fo)
示例#7
0
 def add(self, f: flow.Flow):
     if self.flt and not flowfilter.match(self.flt, f):
         return
     d = f.get_state()
     tnetstring.dump(d, self.fo)
示例#8
0
 def process_flow(self, f: flow.Flow) -> None:
     if self.should_intercept(f):
         f.intercept()
 def request(self, flow: flow.Flow) -> None:
     """Get a flow from MITMProxy."""
     flow.count = self.context.count
     self.context.count += 1
     self.context.hosts_list.add(flow.request.host)
     self.context.locusts.add(flow.request.host, flow)