| 715 | return ret |
| 716 | |
| 717 | def get(self, flow_id, message, content_view) -> None: |
| 718 | flow = self.flow |
| 719 | assert isinstance(flow, (HTTPFlow, TCPFlow, UDPFlow)) |
| 720 | |
| 721 | if self.request.arguments.get("lines"): |
| 722 | max_lines = int(self.request.arguments["lines"][0]) |
| 723 | else: |
| 724 | max_lines = None |
| 725 | |
| 726 | if message == "messages": |
| 727 | messages: list[TCPMessage] | list[UDPMessage] | list[WebSocketMessage] |
| 728 | if isinstance(flow, HTTPFlow) and flow.websocket: |
| 729 | messages = flow.websocket.messages |
| 730 | elif isinstance(flow, (TCPFlow, UDPFlow)): |
| 731 | messages = flow.messages |
| 732 | else: |
| 733 | raise APIError(400, f"This flow has no messages.") |
| 734 | msgs = [] |
| 735 | for m in messages: |
| 736 | d = self.message_to_json( |
| 737 | view_name=content_view, |
| 738 | message=m, |
| 739 | flow=flow, |
| 740 | max_lines=max_lines, |
| 741 | from_client=m.from_client, |
| 742 | timestamp=m.timestamp, |
| 743 | ) |
| 744 | msgs.append(d) |
| 745 | if max_lines: |
| 746 | max_lines -= d["text"].count("\n") + 1 |
| 747 | assert max_lines is not None |
| 748 | if max_lines <= 0: |
| 749 | break |
| 750 | self.write(msgs) |
| 751 | else: |
| 752 | message = getattr(self.flow, message) |
| 753 | self.write(self.message_to_json(content_view, message, flow, max_lines)) |
| 754 | |
| 755 | |
| 756 | class Commands(RequestHandler): |