@@ -386,7 +386,7 @@ NonnullOwnPtr<Request> Request::connect(
386386{
387387 auto request = adopt_own (*new Request { request_id, client, curl_multi, resolver, move (url) });
388388 request->m_connect_cache_level = cache_level;
389- request->transition_to_state (State::DNSLookup );
389+ request->transition_to_network_lookup ( );
390390 return request;
391391}
392392
@@ -583,6 +583,25 @@ void Request::process()
583583 }
584584}
585585
586+ void Request::transition_to_network_lookup ()
587+ {
588+ if (Proxy::use_system_proxy ()) {
589+ auto proxies = Proxy::get_proxies_for_url (m_url);
590+ if (!proxies.is_empty ()) {
591+ m_proxy_data = proxies.first (); // FIXME: Support multiple proxies (e.g. fallback proxies).
592+ if (!m_proxy_data.is_direct ()) {
593+ if (m_type == RequestType::Connect)
594+ transition_to_state (State::Connect);
595+ else
596+ transition_to_state (State::RetrieveCookie);
597+ return ;
598+ }
599+ }
600+ }
601+
602+ transition_to_state (State::DNSLookup);
603+ }
604+
586605void Request::handle_initial_state ()
587606{
588607 // Check for resource substitution before anything else.
@@ -610,7 +629,7 @@ void Request::handle_initial_state()
610629 m_client.start_revalidation_request ({}, m_method, m_url, m_request_headers, m_request_body, m_include_credentials);
611630
612631 if (is_revalidation_request ())
613- transition_to_state (State::DNSLookup );
632+ transition_to_network_lookup ( );
614633 else
615634 transition_to_state (State::ReadCache);
616635 } else if (m_type == RequestType::BackgroundRevalidation) {
@@ -651,19 +670,7 @@ void Request::handle_initial_state()
651670 return ;
652671 }
653672
654- if (Proxy::use_system_proxy ()) {
655- auto proxies = Proxy::get_proxies_for_url (m_url);
656- if (!proxies.is_empty ()) {
657- m_proxy_data = proxies.first (); // FIXME: Support multiple proxies (e.g. fallback proxies).
658- if (!m_proxy_data.is_direct ()) {
659- dbgln (" Using system proxy {}:{} for {}" , m_proxy_data.host , m_proxy_data.port , m_url.serialize ());
660- transition_to_state (State::RetrieveCookie);
661- return ;
662- }
663- }
664- }
665-
666- transition_to_state (State::DNSLookup);
673+ transition_to_network_lookup ();
667674}
668675
669676void Request::handle_read_cache_state ()
@@ -867,16 +874,40 @@ void Request::handle_connect_state()
867874 set_option (CURLOPT_CONNECTTIMEOUT , s_connect_timeout_seconds);
868875 set_option (CURLOPT_CONNECT_ONLY , 1L );
869876
870- // Pre-populate the multi's hostcache so libcurl skips its threaded resolver entirely.
871- VERIFY (m_dns_result);
872- auto formatted_address = build_curl_resolve_list (*m_dns_result, m_url.serialized_host (), m_url.port_or_default ());
873- if (curl_slist* resolve_list = curl_slist_append (nullptr , formatted_address.characters ())) {
874- set_option (CURLOPT_RESOLVE , resolve_list);
875- m_curl_string_lists.append (resolve_list);
876- } else {
877+ switch (m_proxy_data.type ) {
878+ case Proxy::ProxyData::Type::Direct:
879+ break ;
880+ case Proxy::ProxyData::Type::HTTP :
881+ set_option (CURLOPT_PROXYTYPE , CURLPROXY_HTTP );
882+ set_option (CURLOPT_PROXY , m_proxy_data.host .to_byte_string ().characters ());
883+ set_option (CURLOPT_PROXYPORT , static_cast <long >(m_proxy_data.port ));
884+ break ;
885+ case Proxy::ProxyData::Type::HTTPS :
886+ set_option (CURLOPT_PROXYTYPE , CURLPROXY_HTTPS );
887+ set_option (CURLOPT_PROXY , m_proxy_data.host .to_byte_string ().characters ());
888+ set_option (CURLOPT_PROXYPORT , static_cast <long >(m_proxy_data.port ));
889+ break ;
890+ case Proxy::ProxyData::Type::SOCKS5 :
891+ set_option (CURLOPT_PROXYTYPE , CURLPROXY_SOCKS5_HOSTNAME );
892+ set_option (CURLOPT_PROXY , m_proxy_data.host .to_byte_string ().characters ());
893+ set_option (CURLOPT_PROXYPORT , static_cast <long >(m_proxy_data.port ));
894+ break ;
895+ default :
877896 VERIFY_NOT_REACHED ();
878897 }
879898
899+ if (m_proxy_data.is_direct ()) {
900+ // Pre-populate the multi's hostcache so libcurl skips its threaded resolver entirely.
901+ VERIFY (m_dns_result);
902+ auto formatted_address = build_curl_resolve_list (*m_dns_result, m_url.serialized_host (), m_url.port_or_default ());
903+ if (curl_slist* resolve_list = curl_slist_append (nullptr , formatted_address.characters ())) {
904+ set_option (CURLOPT_RESOLVE , resolve_list);
905+ m_curl_string_lists.append (resolve_list);
906+ } else {
907+ VERIFY_NOT_REACHED ();
908+ }
909+ }
910+
880911 mark_lifecycle_event (this , &WireStats::curl_added_at);
881912 auto result = curl_multi_add_handle (m_curl_multi_handle, m_curl_easy_handle);
882913 VERIFY (result == CURLM_OK );
0 commit comments