(
&self,
value: Option<PyObjectRef>,
vm: &VirtualMachine,
)
| 1719 | |
| 1720 | #[pygetset(setter)] |
| 1721 | fn set_sni_callback( |
| 1722 | &self, |
| 1723 | value: Option<PyObjectRef>, |
| 1724 | vm: &VirtualMachine, |
| 1725 | ) -> PyResult<()> { |
| 1726 | // Check if this is a server context |
| 1727 | if self.protocol == SslVersion::TlsClient { |
| 1728 | return Err(vm.new_value_error("sni_callback cannot be set on TLS_CLIENT context")); |
| 1729 | } |
| 1730 | |
| 1731 | let mut callback_guard = self.sni_callback.lock(); |
| 1732 | |
| 1733 | if let Some(callback_obj) = value { |
| 1734 | if !vm.is_none(&callback_obj) { |
| 1735 | // Check if callable |
| 1736 | if !callback_obj.is_callable() { |
| 1737 | return Err(vm.new_type_error("not a callable object")); |
| 1738 | } |
| 1739 | |
| 1740 | // Set the callback |
| 1741 | *callback_guard = Some(callback_obj); |
| 1742 | |
| 1743 | // Set OpenSSL callback |
| 1744 | unsafe { |
| 1745 | sys::SSL_CTX_set_tlsext_servername_callback__fixed_rust( |
| 1746 | self.ctx().as_ptr(), |
| 1747 | Some(_servername_callback), |
| 1748 | ); |
| 1749 | sys::SSL_CTX_set_tlsext_servername_arg( |
| 1750 | self.ctx().as_ptr(), |
| 1751 | self as *const _ as *mut _, |
| 1752 | ); |
| 1753 | } |
| 1754 | } else { |
| 1755 | // Clear callback |
| 1756 | *callback_guard = None; |
| 1757 | unsafe { |
| 1758 | sys::SSL_CTX_set_tlsext_servername_callback__fixed_rust( |
| 1759 | self.ctx().as_ptr(), |
| 1760 | None, |
| 1761 | ); |
| 1762 | } |
| 1763 | } |
| 1764 | } else { |
| 1765 | // Clear callback |
| 1766 | *callback_guard = None; |
| 1767 | unsafe { |
| 1768 | sys::SSL_CTX_set_tlsext_servername_callback__fixed_rust( |
| 1769 | self.ctx().as_ptr(), |
| 1770 | None, |
| 1771 | ); |
| 1772 | } |
| 1773 | } |
| 1774 | |
| 1775 | Ok(()) |
| 1776 | } |
| 1777 | |
| 1778 | #[pymethod] |
no test coverage detected