refactor: improve error handling a bit

v-0.3.3
Jef Roosens 2022-12-15 11:17:51 +01:00
parent 2dcee45406
commit 598597f726
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
3 changed files with 25 additions and 26 deletions

View File

@ -115,8 +115,17 @@ fn (mut d DockerConn) read_response_body(length int) !string {
fn (mut d DockerConn) read_response() !(http.Response, string) {
head := d.read_response_head()!
if head.status().is_error() {
content_length := head.header.get(.content_length)!.int()
body := d.read_response_body(content_length)!
mut err := json.decode(DockerError, body)!
err.status = head.status_code
return err
}
// 204 means "No Content", so we can assume nothing follows after this
if head.status_code == 204 {
if head.status() == .no_content {
return head, ''
}
@ -130,9 +139,9 @@ fn (mut d DockerConn) read_response() !(http.Response, string) {
}
content_length := head.header.get(http.CommonHeader.content_length)!.int()
res := d.read_response_body(content_length)!
body := d.read_response_body(content_length)!
return head, res
return head, body
}
fn (mut d DockerConn) read_json_response<T>() !T {

View File

@ -1,6 +1,7 @@
module docker
struct DockerError {
pub mut:
status int [skip]
message string
}
@ -13,9 +14,9 @@ fn (err DockerError) msg() string {
return err.message
}
fn docker_error(status int, message string) IError {
return IError(DockerError{
fn docker_error(status int, message string) DockerError {
return DockerError{
status: status
message: message
})
}
}

View File

@ -13,12 +13,13 @@ pub fn (mut d DockerConn) pull_image(image string, tag string) ! {
d.send_request(Method.post, '/images/create?fromImage=$image&tag=$tag')!
head := d.read_response_head()!
if head.status_code != 200 {
content_length := head.header.get(http.CommonHeader.content_length)!.int()
if head.status().is_error() {
content_length := head.header.get(.content_length)!.int()
body := d.read_response_body(content_length)!
data := json.decode(DockerError, body)!
mut err := json.decode(DockerError, body)!
err.status = head.status_code
return error(data.message)
return err
}
// Keep reading the body until the pull has completed
@ -33,14 +34,8 @@ pub fn (mut d DockerConn) pull_image(image string, tag string) ! {
// create_image_from_container creates a new image from a container.
pub fn (mut d DockerConn) create_image_from_container(id string, repo string, tag string) !Image {
d.send_request(Method.post, '/commit?container=$id&repo=$repo&tag=$tag')!
head, body := d.read_response()!
if head.status_code != 201 {
data := json.decode(DockerError, body)!
return error(data.message)
}
d.send_request(.post, '/commit?container=$id&repo=$repo&tag=$tag')!
_, body := d.read_response()!
data := json.decode(Image, body)!
@ -49,12 +44,6 @@ pub fn (mut d DockerConn) create_image_from_container(id string, repo string, ta
// remove_image removes the image with the given id.
pub fn (mut d DockerConn) remove_image(id string) ! {
d.send_request(Method.delete, '/images/$id')!
head, body := d.read_response()!
if head.status_code != 200 {
data := json.decode(DockerError, body)!
return error(data.message)
}
d.send_request(.delete, '/images/$id')!
d.read_response()!
}