Create and store a session object after successful handshake
(&self, vm: &VirtualMachine)
| 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 | }; |
no test coverage detected