@@ -11,7 +11,6 @@ import picoev
11
11
12
12
// max read and write limits in bytes
13
13
const max_read = 8096
14
-
15
14
const max_write = 8096 * 2
16
15
17
16
// A type which doesn't get filtered inside templates
@@ -307,8 +306,12 @@ fn ev_callback[A, X](mut pv picoev.Picoev, fd int, events int) {
307
306
308
307
if params.file_responses[fd].open {
309
308
handle_write_file (mut pv, mut params, fd)
310
- } else {
309
+ } else if params.string_responses[fd].open {
311
310
handle_write_string (mut pv, mut params, fd)
311
+ } else {
312
+ // this should never happen
313
+ eprintln ('[vweb] error: write event on connection should be closed' )
314
+ pv.close_conn (fd)
312
315
}
313
316
} else {
314
317
$if trace_picoev_callback ? {
@@ -461,6 +464,7 @@ fn handle_read[A, X](mut pv picoev.Picoev, mut params RequestParams, fd int) {
461
464
eprintln ('[vweb] error parsing request: ${err} ' )
462
465
pv.close_conn (fd)
463
466
params.incomplete_requests[fd] = http.Request{}
467
+ params.idx[fd] = 0
464
468
return
465
469
}
466
470
@@ -476,18 +480,21 @@ fn handle_read[A, X](mut pv picoev.Picoev, mut params RequestParams, fd int) {
476
480
value: 'text/plain'
477
481
).join (vweb.headers_close)
478
482
)) or {}
483
+
479
484
pv.close_conn (fd)
480
485
params.incomplete_requests[fd] = http.Request{}
486
+ params.idx[fd] = 0
481
487
return
482
488
} else if n < bytes_to_read || params.idx[fd] + n < content_length.int () {
483
489
// request is incomplete wait until the socket becomes ready to read again
484
490
params.idx[fd] + = n
485
491
// TODO: change this to a memcpy function?
486
- req.data + = buf.bytestr ()
492
+ req.data + = buf[ 0 ..n] .bytestr ()
487
493
params.incomplete_requests[fd] = req
488
494
return
489
495
} else {
490
496
// request is complete: n = bytes_to_read
497
+ params.idx[fd] + = n
491
498
req.data + = buf[0 ..n].bytestr ()
492
499
}
493
500
}
@@ -522,6 +529,7 @@ fn handle_read[A, X](mut pv picoev.Picoev, mut params RequestParams, fd int) {
522
529
fast_send_resp (mut conn, completed_context.res) or {}
523
530
pv.close_conn (fd)
524
531
} else {
532
+ params.string_responses[fd].open = true
525
533
params.string_responses[fd].str = completed_context.res.body
526
534
res := pv.add (fd, picoev.picoev_write, params.timeout_in_seconds,
527
535
picoev.raw_callback)
@@ -587,7 +595,7 @@ fn handle_request[A, X](mut conn net.TcpConn, req http.Request, params &RequestP
587
595
588
596
// parse the URL, query and form data
589
597
mut url := urllib.parse (req.url) or {
590
- eprintln ('[vweb] error parsing path: ${err} ' )
598
+ eprintln ('[vweb] error parsing path " ${req.url} " : ${err} ' )
591
599
return none
592
600
}
593
601
query := parse_query_from_url (url)
0 commit comments