refactor: clean up read_response function
parent
c8191a19e1
commit
7149c93b6f
39
docker.v
39
docker.v
|
@ -91,6 +91,20 @@ fn (mut d DockerConn) read_response_head() ! {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut d DockerConn) read_response_body() ! {
|
fn (mut d DockerConn) read_response_body() ! {
|
||||||
|
if d.head.status() == .no_content {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.head.header.get(http.CommonHeader.transfer_encoding) or { '' } == 'chunked' {
|
||||||
|
mut builder := strings.new_builder(1024)
|
||||||
|
mut body := d.get_chunked_response_reader()
|
||||||
|
|
||||||
|
util.reader_to_writer(mut body, mut builder)!
|
||||||
|
d.body = builder.str()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
content_length := d.head.header.get(.content_length)!.int()
|
content_length := d.head.header.get(.content_length)!.int()
|
||||||
|
|
||||||
if content_length == 0 {
|
if content_length == 0 {
|
||||||
|
@ -102,7 +116,7 @@ fn (mut d DockerConn) read_response_body() ! {
|
||||||
mut builder := strings.new_builder(docker.buf_len)
|
mut builder := strings.new_builder(docker.buf_len)
|
||||||
|
|
||||||
for builder.len < content_length {
|
for builder.len < content_length {
|
||||||
c = d.reader.read(mut buf) or { break }
|
c = d.reader.read(mut buf)!
|
||||||
|
|
||||||
builder.write(buf[..c])!
|
builder.write(buf[..c])!
|
||||||
}
|
}
|
||||||
|
@ -111,32 +125,21 @@ fn (mut d DockerConn) read_response_body() ! {
|
||||||
}
|
}
|
||||||
|
|
||||||
// read_response is a convenience function which always consumes the entire
|
// read_response is a convenience function which always consumes the entire
|
||||||
// response & returns it. It should only be used when we're certain that the
|
// response and loads it into memory. It should only be used when we're certain
|
||||||
// result isn't too large.
|
// that the result isn't too large, as even chunked responses will get fully
|
||||||
|
// loaded into memory.
|
||||||
fn (mut d DockerConn) read_response() ! {
|
fn (mut d DockerConn) read_response() ! {
|
||||||
d.read_response_head()!
|
d.read_response_head()!
|
||||||
d.check_error()!
|
d.check_error()!
|
||||||
|
|
||||||
// 204 means "No Content", so we can assume nothing follows after this
|
|
||||||
if d.head.status() == .no_content {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if d.head.header.get(http.CommonHeader.transfer_encoding) or { '' } == 'chunked' {
|
|
||||||
mut builder := strings.new_builder(1024)
|
|
||||||
mut body := d.get_chunked_response_reader()
|
|
||||||
|
|
||||||
util.reader_to_writer(mut body, mut builder)!
|
|
||||||
d.body = builder.str()
|
|
||||||
} else {
|
|
||||||
d.read_response_body()!
|
d.read_response_body()!
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// read_json_response<T> is a convenience function that runs read_response
|
||||||
|
// before parsing its contents, which is assumed to be JSON, into a struct.
|
||||||
fn (mut d DockerConn) read_json_response<T>() !T {
|
fn (mut d DockerConn) read_json_response<T>() !T {
|
||||||
d.read_response()!
|
d.read_response()!
|
||||||
|
|
||||||
mut data := json.decode(T, d.body)!
|
data := json.decode(T, d.body)!
|
||||||
|
|
||||||
//$for field in T.fields {
|
//$for field in T.fields {
|
||||||
//$if field.typ is time.Time {
|
//$if field.typ is time.Time {
|
||||||
|
|
Loading…
Reference in New Issue