diff --git a/backend/pkg/messages/messages.go b/backend/pkg/messages/messages.go index 20410182a..a77486a52 100644 --- a/backend/pkg/messages/messages.go +++ b/backend/pkg/messages/messages.go @@ -22,7 +22,7 @@ const ( MsgSetInputValue = 18 MsgSetInputChecked = 19 MsgMouseMove = 20 - MsgNetworkRequest = 21 + MsgLegacyNetworkRequest = 21 MsgConsoleLog = 22 MsgPageLoadTiming = 23 MsgPageRenderTiming = 24 @@ -83,6 +83,7 @@ const ( MsgIssueEvent = 125 MsgSessionEnd = 126 MsgSessionSearch = 127 + MsgNetworkRequest = 128 MsgIOSBatchMeta = 107 MsgIOSSessionStart = 90 MsgIOSSessionEnd = 91 @@ -601,7 +602,7 @@ func (msg *MouseMove) TypeID() int { return 20 } -type NetworkRequest struct { +type LegacyNetworkRequest struct { message Type string Method string @@ -613,7 +614,7 @@ type NetworkRequest struct { Duration uint64 } -func (msg *NetworkRequest) Encode() []byte { +func (msg *LegacyNetworkRequest) Encode() []byte { buf := make([]byte, 81+len(msg.Type)+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response)) buf[0] = 21 p := 1 @@ -628,11 +629,11 @@ func (msg *NetworkRequest) Encode() []byte { return buf[:p] } -func (msg *NetworkRequest) Decode() Message { +func (msg *LegacyNetworkRequest) Decode() Message { return msg } -func (msg *NetworkRequest) TypeID() int { +func (msg *LegacyNetworkRequest) TypeID() int { return 21 } @@ -2202,6 +2203,43 @@ func (msg *SessionSearch) TypeID() int { return 127 } +type NetworkRequest struct { + message + Type string + Method string + URL string + Request string + Response string + Status uint64 + Timestamp uint64 + Duration uint64 + Cached bool +} + +func (msg *NetworkRequest) Encode() []byte { + buf := make([]byte, 91+len(msg.Type)+len(msg.Method)+len(msg.URL)+len(msg.Request)+len(msg.Response)) + buf[0] = 128 + p := 1 + p = WriteString(msg.Type, buf, p) + p = WriteString(msg.Method, buf, p) + p = WriteString(msg.URL, buf, p) + p = WriteString(msg.Request, buf, p) + p = WriteString(msg.Response, buf, p) + p = WriteUint(msg.Status, buf, p) + p = WriteUint(msg.Timestamp, buf, p) + p = WriteUint(msg.Duration, buf, p) + p = WriteBoolean(msg.Cached, buf, p) + return buf[:p] +} + +func (msg *NetworkRequest) Decode() Message { + return msg +} + +func (msg *NetworkRequest) TypeID() int { + return 128 +} + type IOSBatchMeta struct { message Timestamp uint64 diff --git a/backend/pkg/messages/read-message.go b/backend/pkg/messages/read-message.go index f3bc525a9..e7968dd6c 100644 --- a/backend/pkg/messages/read-message.go +++ b/backend/pkg/messages/read-message.go @@ -300,9 +300,9 @@ func DecodeMouseMove(reader BytesReader) (Message, error) { return msg, err } -func DecodeNetworkRequest(reader BytesReader) (Message, error) { +func DecodeLegacyNetworkRequest(reader BytesReader) (Message, error) { var err error = nil - msg := &NetworkRequest{} + msg := &LegacyNetworkRequest{} if msg.Type, err = reader.ReadString(); err != nil { return nil, err } @@ -1329,6 +1329,39 @@ func DecodeSessionSearch(reader BytesReader) (Message, error) { return msg, err } +func DecodeNetworkRequest(reader BytesReader) (Message, error) { + var err error = nil + msg := &NetworkRequest{} + if msg.Type, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Method, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.URL, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Request, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Response, err = reader.ReadString(); err != nil { + return nil, err + } + if msg.Status, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Timestamp, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Duration, err = reader.ReadUint(); err != nil { + return nil, err + } + if msg.Cached, err = reader.ReadBoolean(); err != nil { + return nil, err + } + return msg, err +} + func DecodeIOSBatchMeta(reader BytesReader) (Message, error) { var err error = nil msg := &IOSBatchMeta{} @@ -1774,7 +1807,7 @@ func ReadMessage(t uint64, reader BytesReader) (Message, error) { case 20: return DecodeMouseMove(reader) case 21: - return DecodeNetworkRequest(reader) + return DecodeLegacyNetworkRequest(reader) case 22: return DecodeConsoleLog(reader) case 23: @@ -1895,6 +1928,8 @@ func ReadMessage(t uint64, reader BytesReader) (Message, error) { return DecodeSessionEnd(reader) case 127: return DecodeSessionSearch(reader) + case 128: + return DecodeNetworkRequest(reader) case 107: return DecodeIOSBatchMeta(reader) case 90: diff --git a/ee/connectors/msgcodec/messages.py b/ee/connectors/msgcodec/messages.py index 7c2638ec6..d189c7e2a 100644 --- a/ee/connectors/msgcodec/messages.py +++ b/ee/connectors/msgcodec/messages.py @@ -185,7 +185,7 @@ class MouseMove(Message): self.y = y -class NetworkRequest(Message): +class LegacyNetworkRequest(Message): __id__ = 21 def __init__(self, type, method, url, request, response, status, timestamp, duration): @@ -772,6 +772,21 @@ class SessionSearch(Message): self.partition = partition +class NetworkRequest(Message): + __id__ = 128 + + def __init__(self, type, method, url, request, response, status, timestamp, duration, cached): + self.type = type + self.method = method + self.url = url + self.request = request + self.response = response + self.status = status + self.timestamp = timestamp + self.duration = duration + self.cached = cached + + class IOSBatchMeta(Message): __id__ = 107 diff --git a/ee/connectors/msgcodec/msgcodec.py b/ee/connectors/msgcodec/msgcodec.py index df6133cbb..bdf81ed96 100644 --- a/ee/connectors/msgcodec/msgcodec.py +++ b/ee/connectors/msgcodec/msgcodec.py @@ -216,7 +216,7 @@ class MessageCodec(Codec): ) if message_id == 21: - return NetworkRequest( + return LegacyNetworkRequest( type=self.read_string(reader), method=self.read_string(reader), url=self.read_string(reader), @@ -680,6 +680,19 @@ class MessageCodec(Codec): partition=self.read_uint(reader) ) + if message_id == 128: + return NetworkRequest( + type=self.read_string(reader), + method=self.read_string(reader), + url=self.read_string(reader), + request=self.read_string(reader), + response=self.read_string(reader), + status=self.read_uint(reader), + timestamp=self.read_uint(reader), + duration=self.read_uint(reader), + cached=self.read_boolean(reader) + ) + if message_id == 107: return IOSBatchMeta( timestamp=self.read_uint(reader), diff --git a/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx b/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx index dbd25cede..9f7e9470a 100644 --- a/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx +++ b/frontend/app/components/shared/DevTools/NetworkPanel/NetworkPanel.tsx @@ -128,10 +128,10 @@ export function renderDuration(r: any) { ); } -function renderStatus({ status }: { status: string }) { +function renderStatus({ status, cached }: { status: string, cached: boolean }) { return ( <> - {parseInt(status, 10) === 200 ? ( + {cached ? (
{status} diff --git a/mobs/messages.rb b/mobs/messages.rb index a107d5dcc..4c68918dc 100644 --- a/mobs/messages.rb +++ b/mobs/messages.rb @@ -104,7 +104,7 @@ message 20, 'MouseMove' do uint 'X' uint 'Y' end -message 21, 'NetworkRequest', :replayer => :devtools do +message 21, 'LegacyNetworkRequest', :replayer => :devtools do string 'Type' # fetch/xhr/anythingElse(axios,gql,fonts,image?) string 'Method' string 'URL' @@ -490,4 +490,14 @@ message 127, 'SessionSearch', :tracker => false, :replayer => false do uint 'Partition' end -# since tracker 4.1.10 +message 128, 'NetworkRequest', :replayer => :devtools do + string 'Type' # fetch/xhr/anythingElse(axios,gql,fonts,image?) + string 'Method' + string 'URL' + string 'Request' + string 'Response' + uint 'Status' + uint 'Timestamp' + uint 'Duration' + boolean 'Cached' +end \ No newline at end of file diff --git a/tracker/tracker/src/main/modules/network.ts b/tracker/tracker/src/main/modules/network.ts index a85a0bb1b..eddad5873 100644 --- a/tracker/tracker/src/main/modules/network.ts +++ b/tracker/tracker/src/main/modules/network.ts @@ -39,10 +39,9 @@ function checkCacheByPerformanceTimings(requestUrl: string) { if (performance) { const timings = performance.getEntriesByName(requestUrl)[0] // @ts-ignore - weird ts typings, please refer to https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming - if (timings.transferSize === 0 || timings.responseStart - timings.requestStart < 10) { - return true - } - } else return false + return timings.transferSize === 0 || timings.responseStart - timings.requestStart < 10 + } + return false } interface RequestData { @@ -229,9 +228,10 @@ export default function (app: App, opts: Partial = {}) { String(reqResInfo.url), stringify(reqResInfo.request), stringify(reqResInfo.response), - isCached ? 304 : r.status, + r.status, startTime + getTimeOrigin(), duration, + isCached, ), ) }) @@ -299,9 +299,10 @@ export default function (app: App, opts: Partial = {}) { String(reqResInfo.url), stringify(reqResInfo.request), stringify(reqResInfo.response), - isCached ? 304 : xhr.status, + xhr.status, startTime + getTimeOrigin(), duration, + isCached, ), ) }),