瀏覽代碼

Merge pull request #2132 from kamailio/grumvalski/http2_replies_parsing

core: add support for parsing http/2 replies parsing
Federico Cabiddu 5 年之前
父節點
當前提交
6b1c266a62
共有 3 個文件被更改,包括 29 次插入16 次删除
  1. 5 2
      src/core/parser/msg_parser.h
  2. 21 14
      src/core/parser/parse_fline.c
  3. 3 0
      src/core/parser/parse_fline.h

+ 5 - 2
src/core/parser/msg_parser.h

@@ -146,9 +146,12 @@ if (  (*tmp==(firstchar) || *tmp==((firstchar) | 32)) &&                  \
 		SIP_VERSION, SIP_VERSION_LEN))
 
 #define IS_HTTP_REPLY(rpl)                                                \
-	((rpl)->first_line.u.reply.version.len >= HTTP_VERSION_LEN && \
+	(((rpl)->first_line.u.reply.version.len >= HTTP_VERSION_LEN && \
 	!strncasecmp((rpl)->first_line.u.reply.version.s,             \
-		HTTP_VERSION, HTTP_VERSION_LEN))
+		HTTP_VERSION, HTTP_VERSION_LEN)) ||                         \
+	((rpl)->first_line.u.reply.version.len >= HTTP2_VERSION_LEN && \
+	!strncasecmp((rpl)->first_line.u.reply.version.s,             \
+		HTTP2_VERSION, HTTP2_VERSION_LEN)))
 
 #define IS_SIP_REPLY(rpl)                                                \
 	((rpl)->first_line.u.reply.version.len >= SIP_VERSION_LEN && \

+ 21 - 14
src/core/parser/parse_fline.c

@@ -96,21 +96,28 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start* fl)
 			fl->flags|=FLINE_FLAG_PROTO_SIP;
 			fl->u.reply.version.len=SIP_VERSION_LEN;
 			tmp=buffer+SIP_VERSION_LEN;
-	} else if (http_reply_parse != 0 &&
-		 	(*tmp=='H' || *tmp=='h') &&
+	} else if (http_reply_parse != 0 && (*tmp=='H' || *tmp=='h')) {
 			/* 'HTTP/1.' */
-			strncasecmp( tmp+1, HTTP_VERSION+1, HTTP_VERSION_LEN-1)==0 &&
-			/* [0|1] */
-			((*(tmp+HTTP_VERSION_LEN)=='0') || (*(tmp+HTTP_VERSION_LEN)=='1')) &&
-			(*(tmp+HTTP_VERSION_LEN+1)==' ')  ){ 
-			/* ugly hack to be able to route http replies
-			 * Note: - the http reply must have a via
-			 *       - the message is marked as SIP_REPLY (ugly)
-			 */
-				fl->type=SIP_REPLY;
-				fl->flags|=FLINE_FLAG_PROTO_HTTP;
-				fl->u.reply.version.len=HTTP_VERSION_LEN+1 /*include last digit*/;
-				tmp=buffer+HTTP_VERSION_LEN+1 /* last digit */;
+			if (strncasecmp( tmp+1, HTTP_VERSION+1, HTTP_VERSION_LEN-1)==0 &&
+			  /* [0|1] */
+			  ((*(tmp+HTTP_VERSION_LEN)=='0') || (*(tmp+HTTP_VERSION_LEN)=='1')) &&
+			  (*(tmp+HTTP_VERSION_LEN+1)==' ')  ){ 
+			    /* ugly hack to be able to route http replies
+			    * Note: - the http reply must have a via
+			    *       - the message is marked as SIP_REPLY (ugly)
+			    */
+				  fl->type=SIP_REPLY;
+				  fl->flags|=FLINE_FLAG_PROTO_HTTP;
+				  fl->u.reply.version.len=HTTP_VERSION_LEN+1 /*include last digit*/;
+          tmp=buffer+HTTP_VERSION_LEN+1 /* last digit */;
+			/* 'HTTP/2' */
+			} else if (strncasecmp( tmp+1, HTTP2_VERSION+1, HTTP2_VERSION_LEN-1)==0 &&
+						(*(tmp+HTTP2_VERSION_LEN)==' ')) {
+					fl->type=SIP_REPLY;
+					fl->flags|=FLINE_FLAG_PROTO_HTTP;
+					fl->u.reply.version.len=HTTP2_VERSION_LEN;
+					tmp=buffer+HTTP2_VERSION_LEN;
+			}
 	} else IFISMETHOD( INVITE, 'I' )
 	else IFISMETHOD( CANCEL, 'C')
 	else IFISMETHOD( ACK, 'A' )

+ 3 - 0
src/core/parser/parse_fline.h

@@ -49,6 +49,9 @@
 #define HTTP_VERSION "HTTP/1."
 #define HTTP_VERSION_LEN (sizeof(HTTP_VERSION)-1)
 
+#define HTTP2_VERSION "HTTP/2"
+#define HTTP2_VERSION_LEN (sizeof(HTTP2_VERSION)-1)
+
 #define CANCEL "CANCEL"
 #define ACK    "ACK"
 #define INVITE "INVITE"