MCPcopy Index your code
hub / github.com/RustPython/RustPython / create_session_after_handshake

Method create_session_after_handshake

crates/stdlib/src/ssl.rs:2430–2494  ·  view source on GitHub ↗

Create and store a session object after successful handshake

(&self, vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

2428
2429 // Create and store a session object after successful handshake
2430 fn create_session_after_handshake(&self, vm: &VirtualMachine) -> PyResult<()> {
2431 // Only create session for client-side connections
2432 if self.server_side {
2433 return Ok(());
2434 }
2435
2436 // Check if session already exists
2437 let session_opt = self.session.read().clone();
2438 if let Some(ref s) = session_opt {
2439 if vm.is_none(s) {
2440 } else {
2441 return Ok(());
2442 }
2443 }
2444
2445 // Get server hostname
2446 let server_name = self.server_hostname.read().clone();
2447
2448 // Try to get session data from context's session cache
2449 // IMPORTANT: Acquire and release locks quickly to avoid deadlock
2450 let context = self.context.read();
2451 let session_cache_arc = context.client_session_cache.clone();
2452 drop(context); // Release context lock ASAP
2453
2454 let (session_id, creation_time, lifetime) = if let Some(ref name) = server_name {
2455 let key = name.as_bytes().to_vec();
2456
2457 // Clone the data we need while holding the lock, then immediately release
2458 let session_data_opt = {
2459 let cache_guard = session_cache_arc.read();
2460 cache_guard.get(&key).cloned() // Clone Arc<PyMutex<SessionData>>
2461 }; // Lock released here
2462
2463 if let Some(session_data_arc) = session_data_opt {
2464 let data = session_data_arc.lock();
2465 let result = (data.session_id.clone(), data.creation_time, data.lifetime);
2466 drop(data); // Explicit unlock
2467 result
2468 } else {
2469 // Create new session ID if not in cache
2470 let time = std::time::SystemTime::now();
2471 (generate_session_id_from_metadata(name, &time), time, 7200)
2472 }
2473 } else {
2474 // No server name, use defaults
2475 let time = std::time::SystemTime::now();
2476 (vec![0; 16], time, 7200)
2477 };
2478
2479 // Create a new SSLSession object with real metadata
2480 let session = PySSLSession {
2481 // Use dummy session data to indicate we have a ticket
2482 // TLS 1.2+ always uses session tickets/resumption
2483 session_data: vec![1], // Non-empty to indicate has_ticket=True
2484 session_id,
2485 creation_time,
2486 lifetime,
2487 };

Callers 1

complete_handshakeMethod · 0.80

Calls 11

to_vecMethod · 0.80
SomeClass · 0.50
cloneMethod · 0.45
readMethod · 0.45
is_noneMethod · 0.45
as_bytesMethod · 0.45
getMethod · 0.45
lockMethod · 0.45
into_pyobjectMethod · 0.45
writeMethod · 0.45

Tested by

no test coverage detected