diff --git a/src/Tiny_httpd_buf.ml b/src/Tiny_httpd_buf.ml index e3e2faa2..30cc1a45 100644 --- a/src/Tiny_httpd_buf.ml +++ b/src/Tiny_httpd_buf.ml @@ -1,12 +1,19 @@ -type t = { mutable bytes: bytes; mutable i: int } +type t = { mutable bytes: bytes; mutable i: int; original: bytes } -let create ?(size = 4_096) () : t = { bytes = Bytes.make size ' '; i = 0 } -let size self = self.i -let bytes_slice self = self.bytes +let create ?(size = 4_096) () : t = + let bytes = Bytes.make size ' ' in + { bytes; i = 0; original = bytes } + +let[@inline] size self = self.i +let[@inline] bytes_slice self = self.bytes let clear self : unit = - if Bytes.length self.bytes > 4_096 * 1_024 then - self.bytes <- Bytes.make 4096 ' ' (* free big buffer *); + if + Bytes.length self.bytes > 500 * 1_024 + && Bytes.length self.bytes > Bytes.length self.original + then + (* free big buffer *) + self.bytes <- self.original; self.i <- 0 let resize self new_size : unit = @@ -14,6 +21,12 @@ let resize self new_size : unit = Bytes.blit self.bytes 0 new_buf 0 self.i; self.bytes <- new_buf +let add_char self c : unit = + if self.i + 1 >= Bytes.length self.bytes then + resize self (self.i + (self.i / 2) + 10); + Bytes.set self.bytes self.i c; + self.i <- 1 + self.i + let add_bytes (self : t) s i len : unit = if self.i + len >= Bytes.length self.bytes then resize self (self.i + (self.i / 2) + len + 10); diff --git a/src/Tiny_httpd_buf.mli b/src/Tiny_httpd_buf.mli index 2bcfe58b..702cc787 100644 --- a/src/Tiny_httpd_buf.mli +++ b/src/Tiny_httpd_buf.mli @@ -21,6 +21,10 @@ val contents_and_clear : t -> string (** Get contents of the buffer and clear it. @since 0.5 *) +val add_char : t -> char -> unit +(** Add a single char. + @since NEXT_RELEASE *) + val add_bytes : t -> bytes -> int -> int -> unit (** Append given bytes slice to the buffer. @since 0.5 *)