Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Unified Diff: tools/android/loading/request_track.py

Issue 1633813005: tools/android/loading: Add support for multiple redirects. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/android/loading/request_track.py
diff --git a/tools/android/loading/request_track.py b/tools/android/loading/request_track.py
index 60a54e56cf1f75b1d0eb2fc97dbd7760cfeefdc7..566fb3c36208f76388b61e676594d255abb96192 100644
--- a/tools/android/loading/request_track.py
+++ b/tools/android/loading/request_track.py
@@ -46,7 +46,7 @@ class Request(object):
third_party/WebKit/Source/devtools/protocol.json.
Fields:
- request_id: (str) unique request ID. Postfixed with REDIRECT_SUFFIX for
+ request_id: (str) unique request ID. Postfixed with _REDIRECT_SUFFIX for
redirects.
frame_id: (str) unique frame identifier.
loader_id: (str) unique frame identifier.
@@ -77,7 +77,9 @@ class Request(object):
RESOURCE_TYPES = ('Document', 'Stylesheet', 'Image', 'Media', 'Font',
'Script', 'TextTrack', 'XHR', 'Fetch', 'EventSource',
'WebSocket', 'Manifest', 'Other')
- INITIATORS = ('parser', 'script', 'other')
+ INITIATORS = ('parser', 'script', 'other', 'redirect')
+ INITIATING_REQUEST = 'initiating_request'
+ ORIGINAL_INITIATOR = 'original_initiator'
def __init__(self):
self.request_id = None
self.frame_id = None
@@ -172,7 +174,7 @@ class Request(object):
class RequestTrack(devtools_monitor.Track):
"""Aggregates request data."""
- REDIRECT_SUFFIX = '.redirect'
+ _REDIRECT_SUFFIX = '.redirect'
# Request status
_STATUS_SENT = 0
_STATUS_RESPONSE = 1
@@ -183,12 +185,14 @@ class RequestTrack(devtools_monitor.Track):
_EVENTS_KEY = 'events'
_METADATA_KEY = 'metadata'
_DUPLICATES_KEY = 'duplicates_count'
+ _INCONSISTENT_INITIATORS_KEY = 'inconsistent_initiators'
def __init__(self, connection):
super(RequestTrack, self).__init__(connection)
self._connection = connection
self._requests = []
self._requests_in_flight = {} # requestId -> (request, status)
self._completed_requests_by_id = {}
+ self._redirects_count_by_id = collections.defaultdict(int)
if connection: # Optional for testing.
for method in RequestTrack._METHOD_TO_HANDLER:
self._connection.RegisterListener(method, self)
@@ -196,6 +200,7 @@ class RequestTrack(devtools_monitor.Track):
# detect this.
self._request_id_to_response_received = {}
self.duplicates_count = 0
+ self.inconsistent_initiators_count = 0
def Handle(self, method, msg):
assert method in RequestTrack._METHOD_TO_HANDLER
@@ -214,7 +219,10 @@ class RequestTrack(devtools_monitor.Track):
logging.warning('Requests in flight, will be ignored in the dump')
return {self._EVENTS_KEY: [
request.ToJsonDict() for request in self._requests],
- self._METADATA_KEY: {self._DUPLICATES_KEY: self.duplicates_count}}
+ self._METADATA_KEY: {
+ self._DUPLICATES_KEY: self.duplicates_count,
+ self._INCONSISTENT_INITIATORS_KEY:
+ self.inconsistent_initiators_count}}
@classmethod
def FromJsonDict(cls, json_dict):
@@ -224,14 +232,18 @@ class RequestTrack(devtools_monitor.Track):
requests = [Request.FromJsonDict(request)
for request in json_dict[cls._EVENTS_KEY]]
result._requests = requests
- result.duplicates_count = json_dict[cls._METADATA_KEY][cls._DUPLICATES_KEY]
+ metadata = json_dict[cls._METADATA_KEY]
+ result.duplicates_count = metadata.get(cls._DUPLICATES_KEY, 0)
+ result.inconsistent_initiators_count = metadata.get(
+ cls._INCONSISTENT_INITIATORS_KEY, 0)
return result
def _RequestWillBeSent(self, request_id, params):
# Several "requestWillBeSent" events can be dispatched in a row in the case
# of redirects.
+ redirect_initiator = None
if request_id in self._requests_in_flight:
- self._HandleRedirect(request_id, params)
+ redirect_initiator = self._HandleRedirect(request_id, params)
assert (request_id not in self._requests_in_flight
and request_id not in self._completed_requests_by_id)
r = Request()
@@ -247,6 +259,16 @@ class RequestTrack(devtools_monitor.Track):
('headers', 'headers'),
('initialPriority', 'initial_priority')))
r.resource_type = params.get('type', 'Other')
+ if redirect_initiator:
+ original_initiator = r.initiator
+ r.initiator = redirect_initiator
+ r.initiator[Request.ORIGINAL_INITIATOR] = original_initiator
+ initiating_request = self._completed_requests_by_id[
+ redirect_initiator[Request.INITIATING_REQUEST]]
+ initiating_initiator = initiating_request.initiator.get(
+ Request.ORIGINAL_INITIATOR, initiating_request.initiator)
+ if initiating_initiator != original_initiator:
+ self.inconsistent_initiators_count += 1
self._requests_in_flight[request_id] = (r, RequestTrack._STATUS_SENT)
def _HandleRedirect(self, request_id, params):
@@ -256,15 +278,23 @@ class RequestTrack(devtools_monitor.Track):
# one. Finalize the first request.
assert 'redirectResponse' in params
redirect_response = params['redirectResponse']
+
_CopyFromDictToObject(redirect_response, r,
(('headers', 'response_headers'),
('encodedDataLength', 'encoded_data_length'),
('fromDiskCache', 'from_disk_cache')))
r.timing = TimingFromDict(redirect_response['timing'])
- r.request_id = request_id + self.REDIRECT_SUFFIX
+
+ redirect_index = self._redirects_count_by_id[request_id]
+ self._redirects_count_by_id[request_id] += 1
+ r.request_id = '%s%s.%d' % (request_id, self._REDIRECT_SUFFIX,
+ redirect_index + 1)
+ initiator = {
+ 'type': 'redirect', Request.INITIATING_REQUEST: r.request_id}
self._requests_in_flight[r.request_id] = (r, RequestTrack._STATUS_FINISHED)
del self._requests_in_flight[request_id]
self._FinalizeRequest(r.request_id)
+ return initiator
def _RequestServedFromCache(self, request_id, _):
assert request_id in self._requests_in_flight
« no previous file with comments | « tools/android/loading/request_dependencies_lens_unittest.py ('k') | tools/android/loading/request_track_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698