1 // Copyright 2024 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_QUIC_QUIC_SESSION_POOL_PROXY_JOB_H_ 6 #define NET_QUIC_QUIC_SESSION_POOL_PROXY_JOB_H_ 7 8 #include <memory> 9 10 #include "net/base/http_user_agent_settings.h" 11 #include "net/base/request_priority.h" 12 #include "net/log/net_log_with_source.h" 13 #include "net/quic/quic_session_pool.h" 14 #include "net/quic/quic_session_pool_job.h" 15 #include "net/quic/quic_session_pool_session_attempt.h" 16 #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h" 17 #include "net/traffic_annotation/network_traffic_annotation.h" 18 19 namespace net { 20 21 // A ProxyJob is a QuicSessionPool::Job that handles connections to the 22 // destination over a (QUIC) proxy. 23 class QuicSessionPool::ProxyJob : public QuicSessionPool::Job { 24 public: 25 ProxyJob(QuicSessionPool* pool, 26 quic::ParsedQuicVersion quic_version, 27 const QuicSessionAliasKey& key, 28 NetworkTrafficAnnotationTag proxy_annotation_tag, 29 const HttpUserAgentSettings* http_user_agent_settings, 30 std::unique_ptr<CryptoClientConfigHandle> client_config_handle, 31 RequestPriority priority, 32 int cert_verify_flags, 33 const NetLogWithSource& net_log); 34 35 ~ProxyJob() override; 36 37 // QuicSessionPool::Job implementation. 38 int Run(CompletionOnceCallback callback) override; 39 void SetRequestExpectations(QuicSessionRequest* request) override; 40 void PopulateNetErrorDetails(NetErrorDetails* details) const override; 41 42 private: 43 int DoLoop(int rv); 44 int DoCreateProxySession(); 45 int DoCreateProxySessionComplete(int rv); 46 int DoCreateProxyStream(); 47 int DoCreateProxyStreamComplete(int rv); 48 int DoAttemptSession(); 49 50 void OnIOComplete(int rv); 51 void OnSessionAttemptComplete(int rv); 52 GetWeakPtr()53 base::WeakPtr<ProxyJob> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } 54 55 enum IoState { 56 STATE_NONE, 57 STATE_CREATE_PROXY_SESSION, 58 STATE_CREATE_PROXY_SESSION_COMPLETE, 59 STATE_CREATE_PROXY_STREAM, 60 STATE_CREATE_PROXY_STREAM_COMPLETE, 61 STATE_ATTEMPT_SESSION, 62 }; 63 64 CompletionRepeatingCallback io_callback_; 65 IoState io_state_ = STATE_CREATE_PROXY_SESSION; 66 67 std::unique_ptr<QuicSessionRequest> proxy_session_request_; 68 std::unique_ptr<QuicChromiumClientSession::Handle> proxy_session_; 69 std::unique_ptr<QuicChromiumClientStream::Handle> proxy_stream_; 70 NetErrorDetails net_error_details_; 71 quic::ParsedQuicVersion quic_version_; 72 quic::ParsedQuicVersion quic_version_used_ = 73 quic::ParsedQuicVersion::Unsupported(); 74 NetworkTrafficAnnotationTag proxy_annotation_tag_; 75 const int cert_verify_flags_; 76 raw_ptr<const HttpUserAgentSettings> http_user_agent_settings_; 77 CompletionOnceCallback callback_; 78 std::unique_ptr<SessionAttempt> session_attempt_; 79 base::WeakPtrFactory<ProxyJob> weak_factory_{this}; 80 }; 81 82 } // namespace net 83 84 #endif // NET_QUIC_QUIC_SESSION_POOL_PROXY_JOB_H_ 85