Skip to content

Commit ebab6d5

Browse files
authored
x.vweb: fix large payload (#20155)
1 parent 4e213f2 commit ebab6d5

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

vlib/x/vweb/vweb.v

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import picoev
1111

1212
// max read and write limits in bytes
1313
const max_read = 8096
14-
1514
const max_write = 8096 * 2
1615

1716
// 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) {
307306

308307
if params.file_responses[fd].open {
309308
handle_write_file(mut pv, mut params, fd)
310-
} else {
309+
} else if params.string_responses[fd].open {
311310
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)
312315
}
313316
} else {
314317
$if trace_picoev_callback ? {
@@ -461,6 +464,7 @@ fn handle_read[A, X](mut pv picoev.Picoev, mut params RequestParams, fd int) {
461464
eprintln('[vweb] error parsing request: ${err}')
462465
pv.close_conn(fd)
463466
params.incomplete_requests[fd] = http.Request{}
467+
params.idx[fd] = 0
464468
return
465469
}
466470

@@ -476,18 +480,21 @@ fn handle_read[A, X](mut pv picoev.Picoev, mut params RequestParams, fd int) {
476480
value: 'text/plain'
477481
).join(vweb.headers_close)
478482
)) or {}
483+
479484
pv.close_conn(fd)
480485
params.incomplete_requests[fd] = http.Request{}
486+
params.idx[fd] = 0
481487
return
482488
} else if n < bytes_to_read || params.idx[fd] + n < content_length.int() {
483489
// request is incomplete wait until the socket becomes ready to read again
484490
params.idx[fd] += n
485491
// TODO: change this to a memcpy function?
486-
req.data += buf.bytestr()
492+
req.data += buf[0..n].bytestr()
487493
params.incomplete_requests[fd] = req
488494
return
489495
} else {
490496
// request is complete: n = bytes_to_read
497+
params.idx[fd] += n
491498
req.data += buf[0..n].bytestr()
492499
}
493500
}
@@ -522,6 +529,7 @@ fn handle_read[A, X](mut pv picoev.Picoev, mut params RequestParams, fd int) {
522529
fast_send_resp(mut conn, completed_context.res) or {}
523530
pv.close_conn(fd)
524531
} else {
532+
params.string_responses[fd].open = true
525533
params.string_responses[fd].str = completed_context.res.body
526534
res := pv.add(fd, picoev.picoev_write, params.timeout_in_seconds,
527535
picoev.raw_callback)
@@ -587,7 +595,7 @@ fn handle_request[A, X](mut conn net.TcpConn, req http.Request, params &RequestP
587595

588596
// parse the URL, query and form data
589597
mut url := urllib.parse(req.url) or {
590-
eprintln('[vweb] error parsing path: ${err}')
598+
eprintln('[vweb] error parsing path "${req.url}": ${err}')
591599
return none
592600
}
593601
query := parse_query_from_url(url)

0 commit comments

Comments
 (0)