[sr-dev] git:master:bb1a7d9a: core: parse first line - detect http/2 also for requests

Daniel-Constantin Mierla miconda at gmail.com
Mon Oct 12 09:20:19 CEST 2020


Module: kamailio
Branch: master
Commit: bb1a7d9a70501ddb89073564ec49d343a75faa27
URL: https://github.com/kamailio/kamailio/commit/bb1a7d9a70501ddb89073564ec49d343a75faa27

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2020-10-11T12:48:28+02:00

core: parse first line - detect http/2 also for requests

- it was done for replies
- set additional flag to differentiate on http/2 version

---

Modified: src/core/parser/parse_fline.c
Modified: src/core/parser/parse_fline.h

---

Diff:  https://github.com/kamailio/kamailio/commit/bb1a7d9a70501ddb89073564ec49d343a75faa27.diff
Patch: https://github.com/kamailio/kamailio/commit/bb1a7d9a70501ddb89073564ec49d343a75faa27.patch

---

diff --git a/src/core/parser/parse_fline.c b/src/core/parser/parse_fline.c
index dac891fad7..43afd723d8 100644
--- a/src/core/parser/parse_fline.c
+++ b/src/core/parser/parse_fline.c
@@ -35,10 +35,6 @@
 #include "../mem/mem.h"
 #include "../ut.h"
 
-/* flags for first line
- * - stored on a short field (16 flags) */
-#define FLINE_FLAG_PROTO_SIP	(1<<0)
-#define FLINE_FLAG_PROTO_HTTP	(1<<1)
 
 int http_reply_parse = 0;
 
@@ -110,7 +106,7 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start* fl)
 		} 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->flags|=(FLINE_FLAG_PROTO_HTTP | FLINE_FLAG_PROTO_HTTP2);
 			fl->u.reply.version.len=HTTP2_VERSION_LEN;
 			tmp=buffer+HTTP2_VERSION_LEN;
 		}
@@ -235,15 +231,24 @@ char* parse_first_line(char* buffer, unsigned int len, struct msg_start* fl)
 				&& !strncasecmp(fl->u.request.version.s+1,
 					&SIP_VERSION[1], SIP_VERSION_LEN-1)) {
 			fl->flags|=FLINE_FLAG_PROTO_SIP;
-		} else if(fl->u.request.version.len >= HTTP_VERSION_LEN
+		} else if(fl->u.request.version.len >= 4
 				&& (fl->u.request.version.s[0]=='H'
-					|| fl->u.request.version.s[0]=='h')
-				&& !strncasecmp(fl->u.request.version.s+1,
-					&HTTP_VERSION[1], HTTP_VERSION_LEN-1)) {
-			fl->flags|=FLINE_FLAG_PROTO_HTTP;
+					|| fl->u.request.version.s[0]=='h')) {
+			if(fl->u.request.version.len >= HTTP_VERSION_LEN
+					&& !strncasecmp(fl->u.request.version.s+1,
+						&HTTP_VERSION[1], HTTP_VERSION_LEN-1)) {
+				fl->flags|=FLINE_FLAG_PROTO_HTTP;
+			} else if(fl->u.request.version.len >= HTTP2_VERSION_LEN
+					&& !strncasecmp(fl->u.request.version.s+1,
+						&HTTP2_VERSION[1], HTTP2_VERSION_LEN-1)) {
+				fl->flags|=(FLINE_FLAG_PROTO_HTTP | FLINE_FLAG_PROTO_HTTP2);
+			}
 		}
 	}
 
+	LM_DBG("first line type %d (%s) flags %d\n", (int)fl->type,
+		(fl->type==SIP_REPLY)?"reply(status)":"request", (int)fl->flags);
+
 	return nl;
 
 error:
diff --git a/src/core/parser/parse_fline.h b/src/core/parser/parse_fline.h
index 63f74ececf..d65b04bdbb 100644
--- a/src/core/parser/parse_fline.h
+++ b/src/core/parser/parse_fline.h
@@ -34,14 +34,24 @@
 
 #include "../str.h"
 
+
+/* Invalid message */
+#define SIP_INVALID 0
+#define MSG_INVALID 0
+
 /* Message is request */
 #define SIP_REQUEST 1
+#define MSG_REQUEST 1
 
 /* Message is reply */
 #define SIP_REPLY   2
+#define MSG_REPLY   2
 
-/* Invalid message */
-#define SIP_INVALID 0
+/* flags for first line
+ * - stored on a short field (16 flags) */
+#define FLINE_FLAG_PROTO_SIP	(1<<0) /* sip 2.0 protocol */
+#define FLINE_FLAG_PROTO_HTTP	(1<<1) /* any http protocol */
+#define FLINE_FLAG_PROTO_HTTP2	(1<<2) /* additional for http 2 */
 
 #define SIP_VERSION "SIP/2.0"
 #define SIP_VERSION_LEN 7
@@ -85,7 +95,7 @@ typedef struct msg_start {
 			str method;			/*!< Method string */
 			str uri;			/*!< Request URI */
 			str version;		/*!< SIP version */
-			int method_value;
+			int method_value;	/*!< Method id value */
 		} request;
 		struct {
 			str version;		/*!< SIP version */




More information about the sr-dev mailing list