First working upload streaming!

main
Jef Roosens 2022-01-09 22:18:04 +01:00
parent 5edbaf9b4b
commit 17038dc33c
Signed by: Jef Roosens
GPG Key ID: 955C0660072F691F
2 changed files with 21 additions and 25 deletions

View File

@ -6,6 +6,7 @@ import log
import io import io
const port = 8000 const port = 8000
const buf_size = 1_000_000 const buf_size = 1_000_000
struct App { struct App {
@ -21,7 +22,7 @@ fn exit_with_message(code int, msg string) {
exit(code) exit(code)
} }
fn reader_to_file(mut reader io.BufferedReader, path string) ? { fn reader_to_file(mut reader io.BufferedReader, length int, path string) ? {
// Open up a file for writing to // Open up a file for writing to
mut file := os.create(path) ? mut file := os.create(path) ?
defer { defer {
@ -29,36 +30,27 @@ fn reader_to_file(mut reader io.BufferedReader, path string) ? {
} }
mut buf := []byte{len: buf_size} mut buf := []byte{len: buf_size}
mut bytes_left := length
// Repeat as long as the stream still has data // Repeat as long as the stream still has data
for { for bytes_left > 0 {
// TODO don't just endlessly loop if reading keeps failing
println('heey')
// TODO check if just breaking here is safe // TODO check if just breaking here is safe
bytes_read := reader.read(mut &buf) or { bytes_read := reader.read(mut buf) or { break }
println('youre here') bytes_left -= bytes_read
break
}
println(bytes_read)
mut to_write := bytes_read mut to_write := bytes_read
for to_write > 0 { for to_write > 0 {
// TODO don't just loop infinitely here // TODO don't just loop infinitely here
bytes_written := file.write(buf[bytes_read - to_write..bytes_read]) or { bytes_written := file.write(buf[bytes_read - to_write..bytes_read]) or { continue }
println("$err.msg")
continue
}
println(bytes_written) println(bytes_written)
to_write = to_write - bytes_written to_write = to_write - bytes_written
} }
} }
println('File complete!')
} }
[put; '/pkgs/:pkg'] ['/pkgs/:pkg'; put]
fn (mut app App) put_package(pkg string) web.Result { fn (mut app App) put_package(pkg string) web.Result {
full_path := os.join_path_single(app.repo_dir, pkg) full_path := os.join_path_single(app.repo_dir, pkg)
@ -66,9 +58,13 @@ fn (mut app App) put_package(pkg string) web.Result {
return app.text('File already exists.') return app.text('File already exists.')
} }
reader_to_file(mut app.reader, full_path) or { if length := app.req.header.get(.content_length) {
reader_to_file(mut app.reader, length.int(), full_path) or {
return app.text('Failed to upload file.') return app.text('Failed to upload file.')
} }
} else {
return app.text("Content-Type header isn't set.")
}
return app.text('just stop') return app.text('just stop')
} }

View File

@ -447,13 +447,13 @@ fn handle_conn<T>(mut conn net.TcpConn, mut app T, routes map[string]Route) {
return return
} }
// req := http.parse_request(mut reader) or { // req := http.parse_request(mut reader) or {
// // Prevents errors from being thrown when BufferedReader is empty // // Prevents errors from being thrown when BufferedReader is empty
// if '$err' != 'none' { // if '$err' != 'none' {
// eprintln('error parsing request: $err') // eprintln('error parsing request: $err')
// } // }
// return // return
// } // }
// URL Parse // URL Parse
url := urllib.parse(head.url) or { url := urllib.parse(head.url) or {