@@ -79,28 +79,6 @@ public class CRTClientEngine: HttpClientEngine {
7979 return connectionPool
8080 }
8181
82- private func addHttpHeaders( endpoint: Endpoint , request: SdkHttpRequest ) -> HttpRequest {
83-
84- var headers = request. headers
85-
86- let contentLength : Int64 = {
87- switch request. body {
88- case . data( let data) :
89- return Int64 ( data? . count ?? 0 )
90- case . streamSource( let stream) :
91- // TODO: implement dynamic streaming with transfer-encoded-chunk header
92- return stream. unwrap ( ) . contentLength
93- case . none, . streamSink:
94- return 0
95- }
96- } ( )
97-
98- headers. update ( name: CONTENT_LENGTH_HEADER, value: " \( contentLength) " )
99-
100- request. headers = headers
101- return request. toHttpRequest ( bufferSize: windowSize)
102- }
103-
10482 public func executeWithClosure( request: SdkHttpRequest , completion: @escaping NetworkResult ) {
10583 execute ( request: request) . then { ( result) in
10684 completion ( result)
@@ -110,7 +88,7 @@ public class CRTClientEngine: HttpClientEngine {
11088 public func execute( request: SdkHttpRequest ) -> Future < HttpResponse > {
11189 let isStreaming = { ( ) -> Bool in
11290 switch request. body {
113- case . streamSink , . streamSource : return true
91+ case . stream : return true
11492 default : return false
11593 }
11694 } ( )
@@ -151,15 +129,16 @@ public class CRTClientEngine: HttpClientEngine {
151129
152130 public func makeHttpRequestStreamOptions( _ request: SdkHttpRequest ) -> ( HttpRequestOptions , Future < HttpResponse > ) {
153131 let future = Future < HttpResponse > ( )
154- let requestWithHeaders = addHttpHeaders ( endpoint : request. endpoint , request : request )
132+ let crtRequest = request. toHttpRequest ( bufferSize : windowSize )
155133 let response = HttpResponse ( )
156134
157- var streamSink : StreamSink ?
158- if case let HttpBody . streamSink ( unwrappedStream) = request. body {
159- // we know they want to receive a stream via their request body type
160- streamSink = unwrappedStream . unwrap ( )
135+ var streamReader : StreamReader ?
136+ if case let HttpBody . stream ( unwrappedStream) = request. body,
137+ case let ByteStream . reader ( reader ) = unwrappedStream {
138+ streamReader = reader
161139 }
162- let requestOptions = HttpRequestOptions ( request: requestWithHeaders) { [ self ] ( stream, _, httpHeaders) in
140+
141+ let requestOptions = HttpRequestOptions ( request: crtRequest) { [ self ] ( stream, _, httpHeaders) in
163142 logger. debug ( " headers were received " )
164143 response. statusCode = HttpStatusCode ( rawValue: Int ( stream. getResponseStatusCode ( ) ) )
165144 ?? HttpStatusCode . notFound
@@ -171,28 +150,25 @@ public class CRTClientEngine: HttpClientEngine {
171150 } onIncomingBody: { [ self ] ( _, data) in
172151 logger. debug ( " incoming data " )
173152
174- if let streamSink = streamSink {
153+ if let streamReader = streamReader {
175154 let byteBuffer = ByteBuffer ( data: data)
176- streamSink . receiveData ( readFrom : byteBuffer)
155+ streamReader . write ( buffer : byteBuffer)
177156 }
178157 } onStreamComplete: { [ self ] ( _, error) in
179158 logger. debug ( " stream completed " )
180159 if case let CRTError . crtError( unwrappedError) = error {
181160 if unwrappedError. errorCode != 0 {
182161 logger. error ( " Response encountered an error: \( error) " )
183- if let streamSink = streamSink {
184- streamSink . onError ( error: StreamError . unknown ( error) )
162+ if let streamReader = streamReader {
163+ streamReader . onError ( error: ClientError . crtError ( error) )
185164 }
186165 future. fail ( error)
187166 }
188167 }
189-
190- if let streamSink = streamSink {
191- response. body = HttpBody . streamSink ( . provider( streamSink) )
192- } else {
193- response. body = HttpBody . none
168+ if let streamReader = streamReader {
169+ streamReader. hasFinishedWriting = true
170+ response. body = . stream( . reader( streamReader) )
194171 }
195-
196172 future. fulfill ( response)
197173 }
198174
@@ -201,12 +177,12 @@ public class CRTClientEngine: HttpClientEngine {
201177
202178 public func makeHttpRequestOptions( _ request: SdkHttpRequest ) -> ( HttpRequestOptions , Future < HttpResponse > ) {
203179 let future = Future < HttpResponse > ( )
204- let requestWithHeaders = addHttpHeaders ( endpoint : request. endpoint , request : request )
180+ let crtRequest = request. toHttpRequest ( bufferSize : windowSize )
205181
206182 let response = HttpResponse ( )
207- let incomingByteBuffer = ByteBuffer ( size : 0 )
183+ var incomingData = Data ( )
208184
209- let requestOptions = HttpRequestOptions ( request: requestWithHeaders ) { [ self ] ( stream, _, httpHeaders) in
185+ let requestOptions = HttpRequestOptions ( request: crtRequest ) { [ self ] ( stream, _, httpHeaders) in
210186 logger. debug ( " headers were received " )
211187 response. statusCode = HttpStatusCode ( rawValue: Int ( stream. getResponseStatusCode ( ) ) )
212188 ?? HttpStatusCode . notFound
@@ -216,8 +192,8 @@ public class CRTClientEngine: HttpClientEngine {
216192 response. statusCode = HttpStatusCode ( rawValue: Int ( stream. getResponseStatusCode ( ) ) )
217193 ?? HttpStatusCode . notFound
218194 } onIncomingBody: { [ self ] ( _, data) in
219- logger. debug ( " incoming data " )
220- incomingByteBuffer . put ( data)
195+ logger. debug ( " incoming data: \( data . count ) bytes " )
196+ incomingData . append ( data)
221197 } onStreamComplete: { [ self ] ( _, error) in
222198 logger. debug ( " stream completed " )
223199 if case let CRTError . crtError( unwrappedError) = error {
@@ -227,7 +203,7 @@ public class CRTClientEngine: HttpClientEngine {
227203 }
228204 }
229205
230- response. body = HttpBody . data ( incomingByteBuffer . toData ( ) )
206+ response. body = HttpBody . data ( incomingData )
231207 future. fulfill ( response)
232208 }
233209
0 commit comments