Skip to content
This repository was archived by the owner on Nov 6, 2022. It is now read-only.

Commit 8b1d652

Browse files
Hywanindutny
authored andcommitted
src: support BIND/REBIND/UNBIND (WebDAV, RFC5842)
Support BIND/REBIND/UNBIND methods, see sections 4, 5, 6 of RFC5842. PR-URL: #242 Reviewed-By: Fedor Indutny <[email protected]>
1 parent 7d75dd7 commit 8b1d652

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

http_parser.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,7 @@ size_t http_parser_execute (http_parser *parser,
959959
parser->method = (enum http_method) 0;
960960
parser->index = 1;
961961
switch (ch) {
962+
case 'B': parser->method = HTTP_BIND; break;
962963
case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
963964
case 'D': parser->method = HTTP_DELETE; break;
964965
case 'G': parser->method = HTTP_GET; break;
@@ -970,10 +971,10 @@ size_t http_parser_execute (http_parser *parser,
970971
case 'P': parser->method = HTTP_POST;
971972
/* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
972973
break;
973-
case 'R': parser->method = HTTP_REPORT; break;
974+
case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break;
974975
case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;
975976
case 'T': parser->method = HTTP_TRACE; break;
976-
case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break;
977+
case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND */ break;
977978
default:
978979
SET_ERRNO(HPE_INVALID_METHOD);
979980
goto error;
@@ -1029,6 +1030,13 @@ size_t http_parser_execute (http_parser *parser,
10291030
SET_ERRNO(HPE_INVALID_METHOD);
10301031
goto error;
10311032
}
1033+
} else if (parser->method == HTTP_REPORT) {
1034+
if (parser->index == 2 && ch == 'B') {
1035+
parser->method = HTTP_REBIND;
1036+
} else {
1037+
SET_ERRNO(HPE_INVALID_METHOD);
1038+
goto error;
1039+
}
10321040
} else if (parser->index == 1 && parser->method == HTTP_POST) {
10331041
if (ch == 'R') {
10341042
parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */
@@ -1051,6 +1059,8 @@ size_t http_parser_execute (http_parser *parser,
10511059
} else if (parser->method == HTTP_UNLOCK) {
10521060
if (ch == 'S') {
10531061
parser->method = HTTP_UNSUBSCRIBE;
1062+
} else if(ch == 'B') {
1063+
parser->method = HTTP_UNBIND;
10541064
} else {
10551065
SET_ERRNO(HPE_INVALID_METHOD);
10561066
goto error;

http_parser.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ typedef int (*http_cb) (http_parser*);
9595
XX(5, CONNECT, CONNECT) \
9696
XX(6, OPTIONS, OPTIONS) \
9797
XX(7, TRACE, TRACE) \
98-
/* webdav */ \
98+
/* WebDAV */ \
9999
XX(8, COPY, COPY) \
100100
XX(9, LOCK, LOCK) \
101101
XX(10, MKCOL, MKCOL) \
@@ -104,21 +104,24 @@ typedef int (*http_cb) (http_parser*);
104104
XX(13, PROPPATCH, PROPPATCH) \
105105
XX(14, SEARCH, SEARCH) \
106106
XX(15, UNLOCK, UNLOCK) \
107+
XX(16, BIND, BIND) \
108+
XX(17, REBIND, REBIND) \
109+
XX(18, UNBIND, UNBIND) \
107110
/* subversion */ \
108-
XX(16, REPORT, REPORT) \
109-
XX(17, MKACTIVITY, MKACTIVITY) \
110-
XX(18, CHECKOUT, CHECKOUT) \
111-
XX(19, MERGE, MERGE) \
111+
XX(19, REPORT, REPORT) \
112+
XX(20, MKACTIVITY, MKACTIVITY) \
113+
XX(21, CHECKOUT, CHECKOUT) \
114+
XX(22, MERGE, MERGE) \
112115
/* upnp */ \
113-
XX(20, MSEARCH, M-SEARCH) \
114-
XX(21, NOTIFY, NOTIFY) \
115-
XX(22, SUBSCRIBE, SUBSCRIBE) \
116-
XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \
116+
XX(23, MSEARCH, M-SEARCH) \
117+
XX(24, NOTIFY, NOTIFY) \
118+
XX(25, SUBSCRIBE, SUBSCRIBE) \
119+
XX(26, UNSUBSCRIBE, UNSUBSCRIBE) \
117120
/* RFC-5789 */ \
118-
XX(24, PATCH, PATCH) \
119-
XX(25, PURGE, PURGE) \
121+
XX(27, PATCH, PATCH) \
122+
XX(28, PURGE, PURGE) \
120123
/* CalDAV */ \
121-
XX(26, MKCALENDAR, MKCALENDAR) \
124+
XX(29, MKCALENDAR, MKCALENDAR) \
122125

123126
enum http_method
124127
{

test.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3744,6 +3744,9 @@ main (void)
37443744
"PROPFIND",
37453745
"PROPPATCH",
37463746
"UNLOCK",
3747+
"BIND",
3748+
"REBIND",
3749+
"UNBIND",
37473750
"REPORT",
37483751
"MKACTIVITY",
37493752
"CHECKOUT",

0 commit comments

Comments
 (0)