43 #define CONTAINER_URLRANGE_HASH_SIZE 256
65 static int ContainerUrlRangeSet(
void *
dst,
void *
src)
71 if (dst_s->
key == NULL)
73 memcpy(dst_s->
key, src_s->
key, dst_s->
len);
75 if (dst_s->
files == NULL) {
88 static bool ContainerUrlRangeCompare(
void *a,
void *b)
99 if (SCBufferCmp(as->
key, as->
len, bs->
key, bs->
len) == 0) {
105 static uint32_t ContainerUrlRangeHash(
void *s)
113 static void ContainerUrlRangeFree(
void *s)
130 static inline bool ContainerValueRangeTimeout(
void *data,
const SCTime_t ts)
146 #define HTTP_RANGE_DEFAULT_TIMEOUT 60
147 #define HTTP_RANGE_DEFAULT_MEMCAP 100 * 1024 * 1024
152 const char *
str = NULL;
155 if (
ConfGet(
"app-layer.protocols.http.byterange.memcap", &
str) == 1) {
158 " resetting to default",
163 if (
ConfGet(
"app-layer.protocols.http.byterange.timeout", &
str) == 1) {
164 size_t slen = strlen(
str);
167 " resetting to default",
175 ContainerUrlRangeHash, ContainerUrlRangeCompare, ContainerValueRangeTimeout, NULL,
195 static void *HttpRangeContainerUrlGet(
const uint8_t *key, uint32_t keylen,
const Flow *f)
199 memset(&lookup, 0,
sizeof(lookup));
201 lookup.
key = (uint8_t *)key;
217 uint16_t name_len, uint16_t
flags)
241 const uint64_t buflen = end - start + 1;
258 }
else if (start < c->lastsize && c->
lastsize - start >= buflen) {
263 }
else if (start < c->lastsize && c->
lastsize - start < buflen && c->files != NULL) {
290 if (range->
buffer == NULL) {
298 range->
start = start;
307 uint16_t name_len, uint16_t
flags,
const uint8_t *
data, uint32_t
len)
310 HttpRangeOpenFileAux(c, start, end, total, sbcfg, name, name_len,
flags);
313 SCLogDebug(
"Failed to append data while opening");
321 const uint8_t *name, uint16_t name_len, uint16_t
flags,
const uint8_t *
data,
325 if (file_range_container == NULL) {
329 file_range_container->
sbcfg = sbcfg;
332 crparsed->end, crparsed->size, sbcfg, name, name_len,
flags,
data, data_len);
338 THashDataUnlock(file_range_container->
hdata);
351 THashDataUnlock(file_range_container->
hdata);
356 const uint8_t *
data, uint32_t
len)
391 SCLogDebug(
"update current: adding %u bytes to block %p",
len, c);
414 static void HttpRangeFileClose(
473 SCLogDebug(
"c->current was set, file incomplete so return NULL");
474 }
else if (c->
toskip > 0) {
503 if (range->
gap > 0) {
505 uint32_t gap = range->
gap <= UINT32_MAX ? (uint32_t)range->
gap : UINT32_MAX;
513 if (range->
offset > UINT32_MAX) {
519 (uint32_t)range->
offset) != 0) {
527 uint64_t overlap = f->
size - range->
start;
528 if (overlap < range->
offset) {
529 if (range->
gap > 0) {
531 uint32_t gap = range->
gap <= UINT32_MAX ? (uint32_t)range->
gap : UINT32_MAX;
541 if (range->
offset - overlap > UINT32_MAX) {
547 (uint32_t)(range->
offset - overlap)) != 0) {
591 HttpRangeBlockDerefContainer(b);
600 if (b->
files != NULL) {