int buffer_replace2(struct buffer *b, char *pos, char *end, const char *str, int len);
int buffer_insert_line2(struct buffer *b, char *pos, const char *str, int len);
void buffer_dump(FILE *o, struct buffer *b, int from, int to);
+void buffer_slow_realign(struct buffer *buf);
void buffer_bounce_realign(struct buffer *buf);
unsigned long long buffer_forward(struct buffer *buf, unsigned long long bytes);
}
+/* This function realigns input data in a possibly wrapping buffer so that it
+ * becomes contiguous and starts at the beginning of the buffer area. The
+ * function may only be used when the buffer's output is empty.
+ */
+void buffer_slow_realign(struct buffer *buf)
+{
+ /* two possible cases :
+ * - the buffer is in one contiguous block, we move it in-place
+ * - the buffer is in two blocks, we move it via the swap_buffer
+ */
+ if (buf->i) {
+ int block1 = buf->i;
+ int block2 = 0;
+ if (buf->p + buf->i > buf->data + buf->size) {
+ /* non-contiguous block */
+ block1 = buf->data + buf->size - buf->p;
+ block2 = buf->p + buf->i - (buf->data + buf->size);
+ }
+ if (block2)
+ memcpy(swap_buffer, buf->data, block2);
+ memmove(buf->data, buf->p, block1);
+ if (block2)
+ memcpy(buf->data + block1, swap_buffer, block2);
+ }
+
+ buf->p = buf->data;
+}
+
/* Realigns a possibly non-contiguous buffer by bouncing bytes from source to
* destination. It does not use any intermediate buffer and does the move in
* place, though it will be slower than a simple memmove() on contiguous data,
return 1;
}
-/* This function realigns a possibly wrapping http message at the beginning
- * of its buffer. The function may only be used when the buffer's tail is
- * empty.
- */
-void http_message_realign(struct http_msg *msg)
-{
- struct buffer *buf = msg->buf;
-
- /* two possible cases :
- * - the buffer is in one contiguous block, we move it in-place
- * - the buffer is in two blocks, we move it via the swap_buffer
- */
- if (buf->i) {
- int block1 = buf->i;
- int block2 = 0;
- if (buf->p + buf->i > buf->data + buf->size) {
- /* non-contiguous block */
- block1 = buf->data + buf->size - buf->p;
- block2 = buf->p + buf->i - (buf->data + buf->size);
- }
- if (block2)
- memcpy(swap_buffer, buf->data, block2);
- memmove(buf->data, buf->p, block1);
- if (block2)
- memcpy(buf->data + block1, swap_buffer, block2);
- }
-
- /* adjust all known pointers */
- buf->p = buf->data;
- buf->flags &= ~BF_FULL;
- if (bi_full(buf))
- buf->flags |= BF_FULL;
-}
-
/* This stream analyser waits for a complete HTTP request. It returns 1 if the
* processing can continue on next analysers, or zero if it either needs more
* data or wants to immediately abort the request (eg: timeout, error, ...). It
}
if (bi_end(req) < b_ptr(req, msg->next) ||
bi_end(req) > req->data + req->size - global.tune.maxrewrite)
- http_message_realign(msg);
+ buffer_slow_realign(msg->buf);
}
/* Note that we have the same problem with the response ; we
return 0;
}
if (rep->i <= rep->size - global.tune.maxrewrite)
- http_message_realign(msg);
+ buffer_slow_realign(msg->buf);
}
if (likely(msg->next < rep->i))