@@ -31,38 +31,11 @@ class OkHttpClient
3131private constructor (private val okHttpClient: okhttp3.OkHttpClient , private val baseUrl: HttpUrl ) :
3232 HttpClient {
3333
34- private fun getClient (requestOptions : RequestOptions ): okhttp3.OkHttpClient {
35- val clientBuilder = okHttpClient.newBuilder()
36-
37- val logLevel =
38- when (System .getenv(" OPENAI_LOG" )?.lowercase()) {
39- " info" -> HttpLoggingInterceptor .Level .BASIC
40- " debug" -> HttpLoggingInterceptor .Level .BODY
41- else -> null
42- }
43- if (logLevel != null ) {
44- clientBuilder.addNetworkInterceptor(
45- HttpLoggingInterceptor ().setLevel(logLevel).apply { redactHeader(" Authorization" ) }
46- )
47- }
48-
49- val timeout = requestOptions.timeout
50- if (timeout != null ) {
51- clientBuilder
52- .connectTimeout(timeout)
53- .readTimeout(timeout)
54- .writeTimeout(timeout)
55- .callTimeout(if (timeout.seconds == 0L ) timeout else timeout.plusSeconds(30 ))
56- }
57-
58- return clientBuilder.build()
59- }
60-
6134 override fun execute (
6235 request : HttpRequest ,
6336 requestOptions : RequestOptions ,
6437 ): HttpResponse {
65- val call = getClient(requestOptions). newCall(request.toRequest() )
38+ val call = newCall(request, requestOptions )
6639
6740 return try {
6841 call.execute().toResponse()
@@ -81,18 +54,18 @@ private constructor(private val okHttpClient: okhttp3.OkHttpClient, private val
8154
8255 request.body?.run { future.whenComplete { _, _ -> close() } }
8356
84- val call = getClient(requestOptions). newCall(request.toRequest() )
85- call .enqueue(
86- object : Callback {
87- override fun onResponse (call : Call , response : Response ) {
88- future.complete(response.toResponse())
89- }
57+ newCall(request, requestOptions )
58+ .enqueue(
59+ object : Callback {
60+ override fun onResponse (call : Call , response : Response ) {
61+ future.complete(response.toResponse())
62+ }
9063
91- override fun onFailure (call : Call , e : IOException ) {
92- future.completeExceptionally(OpenAIIoException (" Request failed" , e))
64+ override fun onFailure (call : Call , e : IOException ) {
65+ future.completeExceptionally(OpenAIIoException (" Request failed" , e))
66+ }
9367 }
94- }
95- )
68+ )
9669
9770 return future
9871 }
@@ -103,7 +76,35 @@ private constructor(private val okHttpClient: okhttp3.OkHttpClient, private val
10376 okHttpClient.cache?.close()
10477 }
10578
106- private fun HttpRequest.toRequest (): Request {
79+ private fun newCall (request : HttpRequest , requestOptions : RequestOptions ): Call {
80+ val clientBuilder = okHttpClient.newBuilder()
81+
82+ val logLevel =
83+ when (System .getenv(" OPENAI_LOG" )?.lowercase()) {
84+ " info" -> HttpLoggingInterceptor .Level .BASIC
85+ " debug" -> HttpLoggingInterceptor .Level .BODY
86+ else -> null
87+ }
88+ if (logLevel != null ) {
89+ clientBuilder.addNetworkInterceptor(
90+ HttpLoggingInterceptor ().setLevel(logLevel).apply { redactHeader(" Authorization" ) }
91+ )
92+ }
93+
94+ val timeout = requestOptions.timeout
95+ if (timeout != null ) {
96+ clientBuilder
97+ .connectTimeout(timeout)
98+ .readTimeout(timeout)
99+ .writeTimeout(timeout)
100+ .callTimeout(if (timeout.seconds == 0L ) timeout else timeout.plusSeconds(30 ))
101+ }
102+
103+ val client = clientBuilder.build()
104+ return client.newCall(request.toRequest(client))
105+ }
106+
107+ private fun HttpRequest.toRequest (client : okhttp3.OkHttpClient ): Request {
107108 var body: RequestBody ? = body?.toRequestBody()
108109 // OkHttpClient always requires a request body for PUT and POST methods.
109110 if (body == null && (method == HttpMethod .PUT || method == HttpMethod .POST )) {
@@ -115,6 +116,21 @@ private constructor(private val okHttpClient: okhttp3.OkHttpClient, private val
115116 headers.values(name).forEach { builder.header(name, it) }
116117 }
117118
119+ if (
120+ ! headers.names().contains(" X-Stainless-Read-Timeout" ) && client.readTimeoutMillis != 0
121+ ) {
122+ builder.header(
123+ " X-Stainless-Read-Timeout" ,
124+ Duration .ofMillis(client.readTimeoutMillis.toLong()).seconds.toString()
125+ )
126+ }
127+ if (! headers.names().contains(" X-Stainless-Timeout" ) && client.callTimeoutMillis != 0 ) {
128+ builder.header(
129+ " X-Stainless-Timeout" ,
130+ Duration .ofMillis(client.callTimeoutMillis.toLong()).seconds.toString()
131+ )
132+ }
133+
118134 return builder.build()
119135 }
120136
0 commit comments