forked from vieter-v/vieter
refactor(docker): split stream separator code into own function
parent
ce67208fbd
commit
97cdaa18e1
|
@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
* Web API for adding & querying build logs
|
* Web API for adding & querying build logs
|
||||||
* CLI commands to access build logs API
|
* CLI commands to access build logs API
|
||||||
* Cron build logs are uploaded to above API
|
* Cron build logs are uploaded to above API
|
||||||
|
* Proper ASCII table output in CLI
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
* Official Arch packages are now split between `vieter` & `vieter-git`
|
* Official Arch packages are now split between `vieter` & `vieter-git`
|
||||||
* `vieter` is the latest release
|
* `vieter` is the latest release
|
||||||
* `vieter-git` is the latest commit on the dev branch
|
* `vieter-git` is the latest commit on the dev branch
|
||||||
|
* Full refactor of Docker socket code
|
||||||
|
|
||||||
## [0.3.0-alpha.1](https://git.rustybever.be/vieter/vieter/src/tag/0.3.0-alpha.1)
|
## [0.3.0-alpha.1](https://git.rustybever.be/vieter/vieter/src/tag/0.3.0-alpha.1)
|
||||||
|
|
||||||
|
|
|
@ -71,30 +71,9 @@ pub fn (mut d DockerDaemon) send_request_with_json<T>(method string, url urllib.
|
||||||
// Importantly, this function never consumes the reader past the HTTP
|
// Importantly, this function never consumes the reader past the HTTP
|
||||||
// separator, so the body can be read fully later on.
|
// separator, so the body can be read fully later on.
|
||||||
pub fn (mut d DockerDaemon) read_response_head() ?http.Response {
|
pub fn (mut d DockerDaemon) read_response_head() ?http.Response {
|
||||||
mut c := 0
|
|
||||||
mut buf := []u8{len: 4}
|
|
||||||
mut res := []u8{}
|
mut res := []u8{}
|
||||||
|
|
||||||
for {
|
util.read_until_separator(mut d.reader, mut res, http_separator) ?
|
||||||
c = d.reader.read(mut buf)?
|
|
||||||
res << buf[..c]
|
|
||||||
|
|
||||||
match_len := util.match_array_in_array(buf[..c], docker.http_separator)
|
|
||||||
|
|
||||||
if match_len == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if match_len > 0 {
|
|
||||||
mut buf2 := []u8{len: 4 - match_len}
|
|
||||||
c2 := d.reader.read(mut buf2)?
|
|
||||||
res << buf2[..c2]
|
|
||||||
|
|
||||||
if buf2 == docker.http_separator[match_len..] {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return http.parse_response(res.bytestr())
|
return http.parse_response(res.bytestr())
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,6 @@ pub fn (mut r ChunkedResponseReader) read(mut buf []u8) ?int {
|
||||||
// completely consumed.
|
// completely consumed.
|
||||||
fn (mut r ChunkedResponseReader) read_chunk_size() ?u64 {
|
fn (mut r ChunkedResponseReader) read_chunk_size() ?u64 {
|
||||||
mut buf := []u8{len: 2}
|
mut buf := []u8{len: 2}
|
||||||
mut res := []u8{}
|
|
||||||
|
|
||||||
if r.started {
|
if r.started {
|
||||||
// Each chunk ends with a `\r\n` which we want to skip first
|
// Each chunk ends with a `\r\n` which we want to skip first
|
||||||
|
@ -68,26 +67,8 @@ fn (mut r ChunkedResponseReader) read_chunk_size() ?u64 {
|
||||||
|
|
||||||
r.started = true
|
r.started = true
|
||||||
|
|
||||||
for {
|
mut res := []u8{}
|
||||||
c := r.reader.read(mut buf)?
|
util.read_until_separator(mut r.reader, mut res, http_chunk_separator) ?
|
||||||
res << buf[..c]
|
|
||||||
|
|
||||||
match_len := util.match_array_in_array(buf[..c], http_chunk_separator)
|
|
||||||
|
|
||||||
if match_len == http_chunk_separator.len {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if match_len > 0 {
|
|
||||||
mut buf2 := []u8{len: 2 - match_len}
|
|
||||||
c2 := r.reader.read(mut buf2)?
|
|
||||||
res << buf2[..c2]
|
|
||||||
|
|
||||||
if buf2 == http_chunk_separator[match_len..] {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The length of the next chunk is provided as a hexadecimal
|
// The length of the next chunk is provided as a hexadecimal
|
||||||
mut num_data := hex.decode(res#[..-2].bytestr())?
|
mut num_data := hex.decode(res#[..-2].bytestr())?
|
||||||
|
|
|
@ -28,9 +28,14 @@ pub fn reader_to_writer(mut reader io.Reader, mut writer io.Writer) ? {
|
||||||
mut buf := []u8{len: 10 * 1024}
|
mut buf := []u8{len: 10 * 1024}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
reader.read(mut buf) or { break }
|
bytes_read := reader.read(mut buf) or { break }
|
||||||
|
mut bytes_written := 0
|
||||||
|
|
||||||
writer.write(buf) or { break }
|
for bytes_written < bytes_read {
|
||||||
|
c := writer.write(buf[bytes_written..bytes_read]) or { break }
|
||||||
|
|
||||||
|
bytes_written += c
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,3 +127,30 @@ pub fn match_array_in_array<T>(a1 []T, a2 []T) int {
|
||||||
|
|
||||||
return match_len
|
return match_len
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// read_until_separator consumes an io.Reader until it encounters some
|
||||||
|
// separator array. The data read is stored inside the provided res array.
|
||||||
|
pub fn read_until_separator(mut reader io.Reader, mut res []u8, sep []u8) ? {
|
||||||
|
mut buf := []u8{len: sep.len}
|
||||||
|
|
||||||
|
for {
|
||||||
|
c := reader.read(mut buf)?
|
||||||
|
res << buf[..c]
|
||||||
|
|
||||||
|
match_len := match_array_in_array(buf[..c], sep)
|
||||||
|
|
||||||
|
if match_len == sep.len {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if match_len > 0 {
|
||||||
|
match_left := sep.len - match_len
|
||||||
|
c2 := reader.read(mut buf[..match_left])?
|
||||||
|
res << buf[..c2]
|
||||||
|
|
||||||
|
if buf[..c2] == sep[match_len..] {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue