OLD | NEW |
---|---|
1 # Life of a URLRequest | 1 # Life of a URLRequest |
2 | 2 |
3 This document is intended as an overview of the core layers of the network | 3 This document is intended as an overview of the core layers of the network |
4 stack, their basic responsibilities, how they fit together, and where some of | 4 stack, their basic responsibilities, how they fit together, and where some of |
5 the pain points are, without going into too much detail. Though it touches a | 5 the pain points are, without going into too much detail. Though it touches a |
6 bit on child processes and the content/loader stack, the focus is on net/ | 6 bit on child processes and the content/loader stack, the focus is on net/ |
7 itself. | 7 itself. |
8 | 8 |
9 It's particularly targeted at people new to the Chrome network stack, but | 9 It's particularly targeted at people new to the Chrome network stack, but |
10 should also be useful for team members who may be experts at some parts of the | 10 should also be useful for team members who may be experts at some parts of the |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
286 ResourceLoader tells the ResourceHandlers, and the AsyncResourceHandler tells | 286 ResourceLoader tells the ResourceHandlers, and the AsyncResourceHandler tells |
287 the ResourceDispatcher the request is complete. The RDH then deletes | 287 the ResourceDispatcher the request is complete. The RDH then deletes |
288 ResourceLoader, which deletes the URLRequest and ResourceHandler chain. | 288 ResourceLoader, which deletes the URLRequest and ResourceHandler chain. |
289 | 289 |
290 When the HttpNetworkTransaction is being torn down, it figures out if the | 290 When the HttpNetworkTransaction is being torn down, it figures out if the |
291 socket is reusable. If not, it tells the HttpBasicStream to close the socket. | 291 socket is reusable. If not, it tells the HttpBasicStream to close the socket. |
292 Either way, the ClientSocketHandle returns the socket is then returned to the | 292 Either way, the ClientSocketHandle returns the socket is then returned to the |
293 socket pool, either for reuse or so the socket pool knows it has another free | 293 socket pool, either for reuse or so the socket pool knows it has another free |
294 socket slot. | 294 socket slot. |
295 | 295 |
296 ### Object Relationships and Ownership | |
297 | |
298 A sample of the object relationships involved in the above process is | |
299 diagramed here: | |
300 | |
301  | |
302 | |
303 There are a couple of points in the above diagram that do not come | |
304 clear visually: | |
305 | |
306 * The method that generates the filter chain that is hung off the | |
307 URLRequestJob is declared on URLRequestJob, but the only current | |
308 implementation of it is on URLRequestHttpJob, so the generation is | |
309 shown as happening from that class. | |
310 * HttpTransactions of different types are layered; i.e. a | |
311 HttpCache::Transaction contains a pointer to an HttpTransaction, but | |
312 that pointed-to HttpTransaction generally is an | |
313 HttpNetworkTransaction. | |
296 | 314 |
297 # Additional Topics | 315 # Additional Topics |
298 | 316 |
299 ## HTTP Cache | 317 ## HTTP Cache |
300 | 318 |
301 The HttpCache::Transaction sits between the URLRequestHttpJob and the | 319 The HttpCache::Transaction sits between the URLRequestHttpJob and the |
302 HttpNetworkTransaction, and implements the HttpTransaction interface, just like | 320 HttpNetworkTransaction, and implements the HttpTransaction interface, just like |
303 the HttpNetworkTransaction. The HttpCache::Transaction checks if a request can | 321 the HttpNetworkTransaction. The HttpCache::Transaction checks if a request can |
304 be served out of the cache. If a request needs to be revalidated, it handles | 322 be served out of the cache. If a request needs to be revalidated, it handles |
305 sending a 204 revalidation request over the network. It may also break a range | 323 sending a 204 revalidation request over the network. It may also break a range |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
411 layer pools owns are actively in use, even when the higher layer pool considers | 429 layer pools owns are actively in use, even when the higher layer pool considers |
412 them idle. As a result, when a lower layer pool is at its connection limit and | 430 them idle. As a result, when a lower layer pool is at its connection limit and |
413 needs to make a new connection, it will ask any higher layer pools pools to | 431 needs to make a new connection, it will ask any higher layer pools pools to |
414 close an idle connection if they have one, so it can make a new connection. | 432 close an idle connection if they have one, so it can make a new connection. |
415 | 433 |
416 Since sockets in the higher layer pool are also in a group in the lower layer | 434 Since sockets in the higher layer pool are also in a group in the lower layer |
417 pool, they must have their own distinct group name. This is needed so that, for | 435 pool, they must have their own distinct group name. This is needed so that, for |
418 instance, SSL and HTTP connections won't be grouped together in the | 436 instance, SSL and HTTP connections won't be grouped together in the |
419 TcpClientSocketPool, which the SSLClientSocketPool sits on top of. | 437 TcpClientSocketPool, which the SSLClientSocketPool sits on top of. |
420 | 438 |
439 ### Socket Pool Class Relationships | |
440 | |
441 The relationships between the important classes in the socket pools is | |
442 shown diagrammatically for the lowest layer socket pool | |
443 (TransportSocketPool) below. | |
444 | |
445  | |
446 | |
447 The ClientSocketPoolBase is a template class templatized on the class | |
448 containing the parameters for the appropriate type of socket (in this | |
449 case TransportSocketParams). It contains a pointer to the | |
450 ClientSocketPoolBaseHelper, which contains all the type-independent | |
451 machinery of the socket pool. | |
452 | |
453 When socket pools are initialized, they in turn initialize their | |
454 templatized ClientSocketPoolBase member with an object with which it | |
455 should create connect jobs. That object must derive from | |
456 ClientSocketPoolBase::ConnectJobFactory templatized by the same type | |
457 as the ClientSocketPoolBase. (In the case of the diagram above, that | |
458 object is a TransportConnectJobFactory, which derives from | |
459 ClientSocketPoolBase::ConnectJobFactory<TransportSocketParams>.) | |
eroman
2016/04/06 17:41:17
Note that angle brackets are interpreted as HTML i
eroman
2016/04/06 18:11:07
(Another fix would be to make it a `codeblock`, si
Randy Smith (Not in Mondays)
2016/04/06 20:57:54
Done.
Randy Smith (Not in Mondays)
2016/04/06 20:57:55
Acknowledged.
| |
460 Internally, that object is wrapped in a type-unsafe wrapper | |
461 (ClientSocketPoolBase::ConnectJobFactoryAdaptor) so that it can be | |
462 passed to the initialization of the ClientSocketPoolBaseHelper. This | |
463 allows the helper to create connect jobs while preserving a type-safe | |
464 API to the initialization of the socket pool. | |
465 | |
421 ### SSL | 466 ### SSL |
422 | 467 |
423 When an SSL connection is needed, the ClientSocketPoolManager assembles the | 468 When an SSL connection is needed, the ClientSocketPoolManager assembles the |
424 parameters needed both to connect the TCP socket and establish an SSL | 469 parameters needed both to connect the TCP socket and establish an SSL |
425 connection. It then passes them to the SSLClientSocketPool, which creates | 470 connection. It then passes them to the SSLClientSocketPool, which creates |
426 an SSLConnectJob using them. The SSLConnectJob's first step is to call into the | 471 an SSLConnectJob using them. The SSLConnectJob's first step is to call into the |
427 TransportSocketPool to establish a TCP connection. | 472 TransportSocketPool to establish a TCP connection. |
428 | 473 |
429 Once a connection is established by the lower layered pool, the SSLConnectJob | 474 Once a connection is established by the lower layered pool, the SSLConnectJob |
430 then starts SSL negotiation. Once that's done, the SSL socket is passed back to | 475 then starts SSL negotiation. Once that's done, the SSL socket is passed back to |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
502 connection is established, the first usable connection goes to the highest | 547 connection is established, the first usable connection goes to the highest |
503 priority socket request. | 548 priority socket request. |
504 | 549 |
505 ## Non-HTTP Schemes | 550 ## Non-HTTP Schemes |
506 | 551 |
507 The URLRequestJobFactory has a ProtocolHander for each supported scheme. | 552 The URLRequestJobFactory has a ProtocolHander for each supported scheme. |
508 Non-HTTP URLRequests have their own ProtocolHandlers. Some are implemented in | 553 Non-HTTP URLRequests have their own ProtocolHandlers. Some are implemented in |
509 net/, (like FTP, file, and data, though the renderer handles some data URLs | 554 net/, (like FTP, file, and data, though the renderer handles some data URLs |
510 internally), and others are implemented in content/ or chrome (like blob, | 555 internally), and others are implemented in content/ or chrome (like blob, |
511 chrome, and chrome-extension). | 556 chrome, and chrome-extension). |
OLD | NEW |