11import { method } from './method.ts' ;
22import { SocketRequestInit } from './socket_request_init.ts' ;
33import { SocketOptions } from './socket_options.ts' ;
4- import { parseHttpResponse } from './parse_http_response.ts' ;
5- import * as error from './error/index.ts'
4+ import { parse } from './http/response/parse.ts' ;
65
76const textEncoder = new TextEncoder ( ) ;
87const textDecoder = new TextDecoder ( ) ;
@@ -61,62 +60,6 @@ export class Socket {
6160 return connection . write ( textEncoder . encode ( requestPayload ) ) ;
6261 }
6362
64- private decodeChunkedBody (
65- bodyStart : string ,
66- reader : ReadableStreamDefaultReader < Uint8Array >
67- ) : ReadableStream < Uint8Array > {
68- let buffer = bodyStart ;
69-
70- return new ReadableStream < Uint8Array > ( {
71- async pull ( controller ) : Promise < void > {
72- while ( true ) {
73- const chunkSizeEnd = buffer . indexOf ( "\r\n" ) ;
74-
75- if ( chunkSizeEnd === - 1 ) {
76- const { value, done } = await reader . read ( ) ;
77- if ( done ) {
78- controller . close ( ) ;
79- return ;
80- }
81- buffer += textDecoder . decode ( value ) ;
82- continue ;
83- }
84-
85- const chunkSizeHex = buffer . slice ( 0 , chunkSizeEnd ) . trim ( ) ;
86- const chunkSize = parseInt ( chunkSizeHex , 16 ) ;
87-
88- if ( chunkSize === 0 ) {
89- controller . close ( ) ;
90- return ;
91- }
92-
93- buffer = buffer . slice ( chunkSizeEnd + 2 ) ;
94-
95- while ( buffer . length < chunkSize + 2 ) {
96- const { value, done } = await reader . read ( ) ;
97- if ( done ) {
98- controller . close ( ) ;
99- return ;
100- }
101- buffer += textDecoder . decode ( value ) ;
102- }
103-
104- const chunkData = buffer . slice ( 0 , chunkSize ) ;
105- buffer = buffer . slice ( chunkSize + 2 ) ;
106-
107- controller . enqueue ( textEncoder . encode ( chunkData ) ) ;
108-
109- if ( buffer . length === 0 ) {
110- return ;
111- }
112- }
113- } ,
114- cancel ( ) : void {
115- reader . releaseLock ( ) ;
116- }
117- } ) ;
118- }
119-
12063 public async request (
12164 path : string ,
12265 init : SocketRequestInit = {
@@ -127,63 +70,11 @@ export class Socket {
12770 const connection = await this . connection ;
12871 await this . write ( path , init ) ;
12972
130- const reader = connection . readable . getReader ( ) ;
131- let buffer = '' ;
132-
133- const firstChunk = await reader . read ( ) ;
134- if ( firstChunk . done ) {
135- throw new error . ConnectionClosedError ( ) ;
136- }
137-
138- buffer = textDecoder . decode ( firstChunk . value ) ;
139-
140- while ( buffer . indexOf ( "\r\n\r\n" ) === - 1 ) {
141- const chunk = await reader . read ( ) ;
142- if ( chunk . done ) {
143- break
144- } ;
145- buffer += textDecoder . decode (
146- chunk . value ,
147- { stream : true }
148- ) ;
149- }
150-
151- const parsedResponse = parseHttpResponse ( buffer ) ;
152-
153- const isChunked = parsedResponse . headers [ 'transfer-encoding' ] === 'chunked' ;
154-
155- let bodyStream : ReadableStream < Uint8Array > ;
156-
157- if ( isChunked ) {
158- bodyStream = this . decodeChunkedBody ( parsedResponse . bodyStart , reader ) ;
159- } else {
160- bodyStream = new ReadableStream < Uint8Array > ( {
161- start ( controller ) : void {
162- if ( parsedResponse . bodyStart ) {
163- controller . enqueue ( textEncoder . encode ( parsedResponse ! . bodyStart ) ) ;
164- }
165- } ,
166- async pull ( controller ) : Promise < void > {
167- const { value, done } = await reader . read ( ) ;
168- if ( done ) {
169- controller . close ( ) ;
170- return ;
171- }
172- controller . enqueue ( value ) ;
173- } ,
174- cancel ( ) : void {
175- reader . releaseLock ( ) ;
176- }
177- } ) ;
73+ let buffer = new Uint8Array ( )
74+ for await ( const chunk of connection . readable ) {
75+ buffer = new Uint8Array ( [ ...buffer , ...chunk ] )
17876 }
17977
180- return new Response (
181- bodyStream ,
182- {
183- status : parsedResponse . statusCode ,
184- statusText : parsedResponse . statusText ,
185- headers : new Headers ( parsedResponse . headers )
186- }
187- ) ;
78+ return parse ( textDecoder . decode ( buffer ) ) ;
18879 }
18980}
0 commit comments