Deleted Added
1
2/*
3 * Copyright (C) NGINX, Inc.
4 * Copyright (C) Valentin V. Bartenev
5 */
6
7#include <nxt_main.h>
8

--- 217 unchanged lines hidden (view full) ---

226 }
227
228 if (rp->method.start == p && (ch == NXT_CR || ch == NXT_LF)) {
229 rp->method.start++;
230 p++;
231 continue;
232 }
233
234 return NXT_HTTP_PARSE_INVALID;
235 }
236
237 p++;
238
239 if (nxt_slow_path(p == end)) {
240 return NXT_AGAIN;
241 }
242

--- 58 unchanged lines hidden (view full) ---

301 case NXT_HTTP_TARGET_HASH:
302 rp->complex_target = 1;
303 goto rest_of_target;
304
305 case NXT_HTTP_TARGET_AGAIN:
306 return NXT_AGAIN;
307
308 case NXT_HTTP_TARGET_BAD:
309 return NXT_HTTP_PARSE_INVALID;
310 }
311
312 nxt_unreachable();
313 }
314
315rest_of_target:
316
317 for ( ;; ) {

--- 9 unchanged lines hidden (view full) ---

327 case NXT_HTTP_TARGET_HASH:
328 rp->complex_target = 1;
329 continue;
330
331 case NXT_HTTP_TARGET_AGAIN:
332 return NXT_AGAIN;
333
334 case NXT_HTTP_TARGET_BAD:
335 return NXT_HTTP_PARSE_INVALID;
336
337 default:
338 continue;
339 }
340
341 nxt_unreachable();
342 }
343

--- 58 unchanged lines hidden (view full) ---

402 if (nxt_fast_path(p[9] == '\r')) {
403 p += 10;
404
405 if (nxt_slow_path(p == end)) {
406 return NXT_AGAIN;
407 }
408
409 if (nxt_slow_path(*p != '\n')) {
410 return NXT_HTTP_PARSE_INVALID;
411 }
412
413 *pos = p + 1;
414
415 } else {
416 *pos = p + 10;
417 }
418

--- 68 unchanged lines hidden (view full) ---

487 return NXT_OK;
488 }
489 }
490
491 /* absolute path or '*' */
492
493 /* TODO */
494
495 return NXT_HTTP_PARSE_INVALID;
496}
497
498
499static nxt_int_t
500nxt_http_parse_field_name(nxt_http_request_parse_t *rp, u_char **pos,
501 u_char *end)
502{
503 u_char *p, c;

--- 46 unchanged lines hidden (view full) ---

550
551 while (nxt_fast_path(p != end)) {
552 nxt_field_name_test_char(*p); p++;
553 }
554
555 len = p - *pos;
556
557 if (nxt_slow_path(len > NXT_HTTP_MAX_FIELD_NAME)) {
558 return NXT_HTTP_PARSE_TOO_LARGE_FIELD;
559 }
560
561 rp->field_hash = hash;
562 rp->field_name.length = len;
563
564 rp->handler = &nxt_http_parse_field_name;
565
566 return NXT_AGAIN;
567
568name_end:
569
570 if (nxt_fast_path(*p == ':')) {
571 if (nxt_slow_path(p == *pos)) {
572 return NXT_HTTP_PARSE_INVALID;
573 }
574
575 len = p - *pos;
576
577 if (nxt_slow_path(len > NXT_HTTP_MAX_FIELD_NAME)) {
578 return NXT_HTTP_PARSE_TOO_LARGE_FIELD;
579 }
580
581 rp->field_hash = hash;
582
583 rp->field_name.length = len;
584 rp->field_name.start = *pos;
585
586 *pos = p + 1;
587
588 return nxt_http_parse_field_value(rp, pos, end);
589 }
590
591 if (nxt_slow_path(p != *pos)) {
592 return NXT_HTTP_PARSE_INVALID;
593 }
594
595 return nxt_http_parse_field_end(rp, pos, end);
596}
597
598
599static nxt_int_t
600nxt_http_parse_field_value(nxt_http_request_parse_t *rp, u_char **pos,

--- 24 unchanged lines hidden (view full) ---

625
626 for ( ;; ) {
627 p = nxt_http_lookup_field_end(p, end);
628
629 if (nxt_slow_path(p == end)) {
630 len = p - *pos;
631
632 if (nxt_slow_path(len > NXT_HTTP_MAX_FIELD_VALUE)) {
633 return NXT_HTTP_PARSE_TOO_LARGE_FIELD;
634 }
635
636 rp->field_value.length = len;
637 rp->handler = &nxt_http_parse_field_value;
638 return NXT_AGAIN;
639 }
640
641 ch = *p;
642
643 if (nxt_fast_path(ch == '\r' || ch == '\n')) {
644 break;
645 }
646
647 if (ch == '\0') {
648 return NXT_HTTP_PARSE_INVALID;
649 }
650 }
651
652 if (nxt_fast_path(p != *pos)) {
653 while (p[-1] == ' ') {
654 p--;
655 }
656 }
657
658 len = p - *pos;
659
660 if (nxt_slow_path(len > NXT_HTTP_MAX_FIELD_VALUE)) {
661 return NXT_HTTP_PARSE_TOO_LARGE_FIELD;
662 }
663
664 rp->field_value.length = len;
665 rp->field_value.start = *pos;
666
667 *pos = p;
668
669 return nxt_http_parse_field_end(rp, pos, end);

--- 109 unchanged lines hidden (view full) ---

779
780 rp->handler = &nxt_http_parse_field_name;
781 return NXT_OK;
782 }
783
784 return NXT_DONE;
785 }
786
787 return NXT_HTTP_PARSE_INVALID;
788}
789
790
791#define \
792nxt_http_is_normal(c) \
793 (nxt_fast_path((nxt_http_normal[c / 8] & (1 << (c & 7))) != 0))
794
795

--- 175 unchanged lines hidden (view full) ---

971 }
972
973 switch (ch) {
974 case '/':
975 state = sw_slash;
976 u -= 5;
977 for ( ;; ) {
978 if (u < rp->path.start) {
979 return NXT_HTTP_PARSE_INVALID;
980 }
981 if (*u == '/') {
982 u++;
983 break;
984 }
985 u--;
986 }
987 break;

--- 29 unchanged lines hidden (view full) ---

1017
1018 c = (u_char) (ch | 0x20);
1019 if (c >= 'a' && c <= 'f') {
1020 high = (u_char) (c - 'a' + 10);
1021 state = sw_quoted_second;
1022 continue;
1023 }
1024
1025 return NXT_HTTP_PARSE_INVALID;
1026
1027 case sw_quoted_second:
1028 if (ch >= '0' && ch <= '9') {
1029 ch = (u_char) ((high << 4) + ch - '0');
1030
1031 if (ch == '%' || ch == '#') {
1032 state = sw_normal;
1033 *u++ = ch;
1034 continue;
1035
1036 } else if (ch == '\0') {
1037 return NXT_HTTP_PARSE_INVALID;
1038 }
1039
1040 state = saved_state;
1041 goto again;
1042 }
1043
1044 c = (u_char) (ch | 0x20);
1045 if (c >= 'a' && c <= 'f') {

--- 7 unchanged lines hidden (view full) ---

1053 } else if (ch == '+') {
1054 rp->plus_in_target = 1;
1055 }
1056
1057 state = saved_state;
1058 goto again;
1059 }
1060
1061 return NXT_HTTP_PARSE_INVALID;
1062 }
1063 }
1064
1065 if (state >= sw_quoted) {
1066 return NXT_HTTP_PARSE_INVALID;
1067 }
1068
1069args:
1070
1071 for (/* void */; p < rp->target_end; p++) {
1072 if (*p == '#') {
1073 break;
1074 }

--- 179 unchanged lines hidden ---