mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 13:32:45 +00:00 
			
		
		
		
	RequestServer+LibHTTP+LibGemini: Cache connections to the same host
This makes connections (particularly TLS-based ones) do the handshaking stuff only once. Currently the cache is configured to keep at most two connections evenly balanced in queue size, and with a grace period of 10s after the last queued job has finished (after which the connection will be dropped).
This commit is contained in:
		
							parent
							
								
									c5d7eb8618
								
							
						
					
					
						commit
						65f7e45a75
					
				
					 22 changed files with 295 additions and 51 deletions
				
			
		|  | @ -14,15 +14,11 @@ | |||
| 
 | ||||
| namespace Gemini { | ||||
| 
 | ||||
| void GeminiJob::start() | ||||
| void GeminiJob::start(NonnullRefPtr<Core::Socket> socket) | ||||
| { | ||||
|     VERIFY(!m_socket); | ||||
|     m_socket = TLS::TLSv12::construct(this); | ||||
|     m_socket->set_root_certificates(m_override_ca_certificates ? *m_override_ca_certificates : DefaultRootCACertificates::the().certificates()); | ||||
|     m_socket->on_tls_connected = [this] { | ||||
|         dbgln_if(GEMINIJOB_DEBUG, "GeminiJob: on_connected callback"); | ||||
|         on_socket_connected(); | ||||
|     }; | ||||
|     VERIFY(is<TLS::TLSv12>(*socket)); | ||||
|     m_socket = static_ptr_cast<TLS::TLSv12>(socket); | ||||
|     m_socket->on_tls_error = [this](TLS::AlertDescription error) { | ||||
|         if (error == TLS::AlertDescription::HandshakeFailure) { | ||||
|             deferred_invoke([this] { | ||||
|  | @ -45,11 +41,20 @@ void GeminiJob::start() | |||
|         if (on_certificate_requested) | ||||
|             on_certificate_requested(*this); | ||||
|     }; | ||||
|     bool success = ((TLS::TLSv12&)*m_socket).connect(m_request.url().host(), m_request.url().port_or_default()); | ||||
|     if (!success) { | ||||
|         deferred_invoke([this] { | ||||
|             return did_fail(Core::NetworkJob::Error::ConnectionFailed); | ||||
|         }); | ||||
| 
 | ||||
|     if (m_socket->is_established()) { | ||||
|         deferred_invoke([this] { on_socket_connected(); }); | ||||
|     } else { | ||||
|         m_socket->set_root_certificates(m_override_ca_certificates ? *m_override_ca_certificates : DefaultRootCACertificates::the().certificates()); | ||||
|         m_socket->on_tls_connected = [this] { | ||||
|             on_socket_connected(); | ||||
|         }; | ||||
|         bool success = ((TLS::TLSv12&)*m_socket).connect(m_request.url().host(), m_request.url().port_or_default()); | ||||
|         if (!success) { | ||||
|             deferred_invoke([this] { | ||||
|                 return did_fail(Core::NetworkJob::Error::ConnectionFailed); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -59,7 +64,6 @@ void GeminiJob::shutdown() | |||
|         return; | ||||
|     m_socket->on_tls_ready_to_read = nullptr; | ||||
|     m_socket->on_tls_connected = nullptr; | ||||
|     remove_child(*m_socket); | ||||
|     m_socket = nullptr; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ali Mohammad Pur
						Ali Mohammad Pur