package com.bitchat.android.net import okhttp3.OkHttpClient import java.net.InetSocketAddress import java.net.Proxy import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicReference /** * Centralized OkHttp provider to ensure all network traffic honors Tor settings. */ object OkHttpProvider { private val httpClientRef = AtomicReference(null) private val wsClientRef = AtomicReference(null) fun reset() { httpClientRef.set(null) wsClientRef.set(null) } fun httpClient(): OkHttpClient { httpClientRef.get()?.let { return it } val client = baseBuilderForCurrentProxy() .callTimeout(15, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .build() httpClientRef.set(client) return client } fun webSocketClient(): OkHttpClient { wsClientRef.get()?.let { return it } val client = baseBuilderForCurrentProxy() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(0, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build() wsClientRef.set(client) return client } private fun baseBuilderForCurrentProxy(): OkHttpClient.Builder { val builder = OkHttpClient.Builder() val socks: InetSocketAddress? = TorManager.currentSocksAddress() if (socks != null && TorManager.isProxyEnabled()) { val proxy = Proxy(Proxy.Type.SOCKS, socks) builder.proxy(proxy) } return builder } }