Skip to content

Commit 3451c9a

Browse files
committed
Handle empty header value and linear whitespace
Fixes #131
1 parent 68f283e commit 3451c9a

File tree

1 file changed

+34
-6
lines changed

1 file changed

+34
-6
lines changed

Replete/http.c

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,40 @@ size_t header_to_object_callback(char *buffer, size_t size, size_t nitems, void
5353

5454
JSStringRef key_str = JSStringCreateWithUTF8CString(key);
5555

56-
int val_start = key_end + 2;
57-
size_t val_len = val_end - val_start;
58-
char val[val_len + 1];
59-
strncpy(val, buffer + val_start, val_len);
60-
val[val_len] = '\0';
61-
JSStringRef val_str = JSStringCreateWithUTF8CString(val);
56+
int val_start = key_end + 1;
57+
58+
// Trim whitespace from beginning of val
59+
for (i = val_start; i < val_end; i++) {
60+
if (buffer[i] == ' ' || buffer[i] == '\t') {
61+
val_start++;
62+
} else {
63+
break;
64+
}
65+
}
66+
67+
// Trim whitespace from end of val
68+
for (i = val_end - 1; i > val_start; i--) {
69+
if (buffer[i] == ' ' || buffer[i] == '\t') {
70+
val_end--;
71+
} else {
72+
break;
73+
}
74+
}
75+
76+
size_t val_len;
77+
JSStringRef val_str;
78+
79+
if (val_start < val_end) {
80+
val_len = val_end - val_start;
81+
char val[val_len + 1];
82+
strncpy(val, buffer + val_start, val_len);
83+
val[val_len] = '\0';
84+
val_str = JSStringCreateWithUTF8CString(val);
85+
} else {
86+
char val[1];
87+
val[0] = '\0';
88+
val_str = JSStringCreateWithUTF8CString(val);
89+
}
6290
JSValueRef val_ref = JSValueMakeString(ctx, val_str);
6391

6492
JSObjectSetProperty(ctx, *state->headers, key_str, val_ref, kJSPropertyAttributeReadOnly, NULL);

0 commit comments

Comments
 (0)