@@ -226,14 +226,16 @@ class Http1Socket(private val conn:Socket):HttpSocket{
226
226
227
227
override fun readClient ():HttpClient {
228
228
if (! read_head){
229
- val head= read_until(" \r\n\r\n " .encodeToByteArray()).decodeToString().replace(" \r\n " ," \n " ).split(" \n " )
229
+ val head= read_until(" \r\n\r\n " .encodeToByteArray()).decodeToString()/* .replace("\r\n","\n")*/ .split(" \r \n" )
230
230
val (method,path,version)= head[0 ].split(" " )
231
231
_client ._method = method
232
232
_client ._path = path
233
233
_client ._version = version
234
234
235
235
for (i in 1 until head.size){
236
- val (headerb,value)= head[i].split(" :" ,limit= 2 )
236
+ val col= head[i].split(" :" ,limit= 2 )
237
+ if (col.size< 2 )continue
238
+ val (headerb,value)= col
237
239
val header= headerb.lowercase()
238
240
if (header in _client ._headers ){
239
241
_client ._headers [header]!! .add(value.trim())
@@ -242,11 +244,28 @@ class Http1Socket(private val conn:Socket):HttpSocket{
242
244
}
243
245
}
244
246
read_head= true
247
+ _client ._ready = true
245
248
}; if (! read_body) {
246
- // TODO: support chunked transfer encoding
247
- val cl= _client ._headers [" content-length" ]?.get(0 )?.toInt()? : 0
248
- _client ._body = read_certain(cl)
249
- read_body= true
249
+ if (_client ._headers [" content-length" ]?.get(0 )!= null ){
250
+
251
+ val cl= _client ._headers [" content-length" ]!! .get(0 ).toInt()
252
+ _client ._body .writeBytes(read_certain(cl))
253
+ read_body= true
254
+ _client ._bodyComplete = true
255
+
256
+ } else if (_client ._headers [" transfer-encoding" ]?.get(0 )== " chunked" ){
257
+
258
+ val chunk= read_until(" \r\n " .encodeToByteArray()).decodeToString().trim().toInt(16 )
259
+ if (chunk== 0 ){
260
+ _client ._bodyComplete = true
261
+ read_body= true
262
+ }
263
+ else _client ._body .write(read_certain(chunk+ 2 ),0 ,chunk)
264
+
265
+ } else {
266
+ _client ._bodyComplete = true
267
+ read_body= true
268
+ }
250
269
}
251
270
252
271
// val buff=read_all()
@@ -336,14 +355,18 @@ class Http1Client(override val address:SocketAddress):HttpClient{
336
355
internal var _method = " "
337
356
internal var _version = " "
338
357
internal var _path = " "
339
- internal var _body = ByteArray (0 )
358
+ internal var _body = ByteArrayOutputStream ()
359
+ internal var _ready = false
360
+ internal var _bodyComplete = false
340
361
341
362
override val headers: Map <String ,List <String >> get()= _headers
342
363
override val method: String get()= _method
343
364
override val version: String get()= _version
344
365
override val path: String get()= _path
345
366
override val host: String get()= _headers [" host" ]?.get(0 )? : " about:blank"
346
- override val body: ByteArray get()= _body
367
+ override val body: ByteArray get()= _body .toByteArray()
368
+ override val isReady get()= _ready
369
+ override val isComplete get()= _bodyComplete
347
370
}
348
371
349
372
// fun ByteArray.indexOfSequence(sequence:ByteArray):Int{
0 commit comments