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
|
||||
* CLI commands to access build logs API
|
||||
* Cron build logs are uploaded to above API
|
||||
* Proper ASCII table output in CLI
|
||||
|
||||
### 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`
|
||||
* `vieter` is the latest release
|
||||
* `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)
|
||||
|
||||
|
|
|
@ -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
|
||||
// separator, so the body can be read fully later on.
|
||||
pub fn (mut d DockerDaemon) read_response_head() ?http.Response {
|
||||
mut c := 0
|
||||
mut buf := []u8{len: 4}
|
||||
mut res := []u8{}
|
||||
|
||||
for {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
util.read_until_separator(mut d.reader, mut res, http_separator) ?
|
||||
|
||||
return http.parse_response(res.bytestr())
|
||||
}
|
||||
|
|
|
@ -59,7 +59,6 @@ pub fn (mut r ChunkedResponseReader) read(mut buf []u8) ?int {
|
|||
// completely consumed.
|
||||
fn (mut r ChunkedResponseReader) read_chunk_size() ?u64 {
|
||||
mut buf := []u8{len: 2}
|
||||
mut res := []u8{}
|
||||
|
||||
if r.started {
|
||||
// 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
|
||||
|
||||
for {
|
||||
c := r.reader.read(mut buf)?
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
mut res := []u8{}
|
||||
util.read_until_separator(mut r.reader, mut res, http_chunk_separator) ?
|
||||
|
||||
// The length of the next chunk is provided as a hexadecimal
|
||||
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}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// 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