diff options
Diffstat (limited to 'internal/ipc')
| -rw-r--r-- | internal/ipc/ipc.go | 20 | ||||
| -rw-r--r-- | internal/ipc/server.go | 8 |
2 files changed, 28 insertions, 0 deletions
diff --git a/internal/ipc/ipc.go b/internal/ipc/ipc.go index 68217c2..dc7a1df 100644 --- a/internal/ipc/ipc.go +++ b/internal/ipc/ipc.go @@ -114,6 +114,7 @@ type Response struct { Rules []rules.Rule `json:"rules,omitempty"` // for "rules" ScopeRules []scope.Rule `json:"scope_rules,omitempty"` // for "scope_rules" ClientCerts []clientcert.Cert `json:"client_certs,omitempty"` // for "client_certs" + WSMessages []store.WSMessage `json:"ws_messages,omitempty"` // for "ws_messages" Status *StatusMsg `json:"status,omitempty"` // for "status" // For "import_done": how many entries were actually inserted (a @@ -331,6 +332,25 @@ func (c *Client) Get(id int64) (*EntryDetail, error) { return resp.Detail, nil } +// ListWSMessages returns every WebSocket frame captured for entryID's +// connection, in the order they were sent - empty (not an error) if the +// entry wasn't a WebSocket upgrade or nothing was captured. +func (c *Client) ListWSMessages(entryID int64) ([]store.WSMessage, error) { + c.mu.Lock() + defer c.mu.Unlock() + if err := c.enc.Encode(Request{Type: "ws_messages", ID: entryID}); err != nil { + return nil, err + } + var resp Response + if err := c.dec.Decode(&resp); err != nil { + return nil, err + } + if resp.Type == "error" { + return nil, errors.New(resp.Error) + } + return resp.WSMessages, nil +} + // Repeat sends raw to scheme://host exactly as given (no re-serialization, // no header injection) and returns the resulting entry, including the raw // response bytes. The exchange is also recorded to history. diff --git a/internal/ipc/server.go b/internal/ipc/server.go index 4db27b9..378c1a9 100644 --- a/internal/ipc/server.go +++ b/internal/ipc/server.go @@ -143,6 +143,14 @@ func (s *Server) handleConn(conn net.Conn) { } enc.Encode(Response{Type: "get", Detail: detailFromEntry(e)}) + case "ws_messages": + msgs, err := s.db.ListWSMessages(req.ID) + if err != nil { + enc.Encode(Response{Type: "error", Error: err.Error()}) + continue + } + enc.Encode(Response{Type: "ws_messages", WSMessages: msgs}) + case "repeat": if s.repeater == nil { enc.Encode(Response{Type: "error", Error: "repeater not available"}) |