srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/internal/ipc
diff options
context:
space:
mode:
Diffstat (limited to 'internal/ipc')
-rw-r--r--internal/ipc/ipc.go20
-rw-r--r--internal/ipc/server.go8
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"})