[sr-dev] git:master: tcp: new parameter to accept messages without CL

Daniel-Constantin Mierla miconda at gmail.com
Tue May 25 16:24:02 CEST 2010


Module: sip-router
Branch: master
Commit: d4cc410326a5b0662f267ed5dc5bba3b67c901f6
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d4cc410326a5b0662f267ed5dc5bba3b67c901f6

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Tue May 25 10:48:54 2010 +0200

tcp: new parameter to accept messages without CL

- some non-sip messages with empty body do not carry content-length
- useful for http traffic handled locally
- global parameter name: tcp_accept_no_cl
- default is 0 (report error of CL is missing, default behaviour so far)
- value can be changed at runtime

---

 cfg.lex       |    3 +++
 cfg.y         |    9 +++++++++
 tcp_options.h |    1 +
 tcp_read.c    |   22 ++++++++++++++++------
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/cfg.lex b/cfg.lex
index b265559..e4b5486 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -418,6 +418,7 @@ TCP_OPT_KEEPIDLE	"tcp_keepidle"
 TCP_OPT_KEEPINTVL	"tcp_keepintvl"
 TCP_OPT_KEEPCNT		"tcp_keepcnt"
 TCP_OPT_CRLF_PING	"tcp_crlf_ping"
+TCP_OPT_ACCEPT_NO_CL	"tcp_accept_no_cl"
 DISABLE_TLS		"disable_tls"|"tls_disable"
 ENABLE_TLS		"enable_tls"|"tls_enable"
 TLSLOG			"tlslog"|"tls_log"
@@ -792,6 +793,8 @@ SUBST       subst
 									return TCP_OPT_KEEPCNT; }
 <INITIAL>{TCP_OPT_CRLF_PING}	{ count(); yylval.strval=yytext;
 									return TCP_OPT_CRLF_PING; }
+<INITIAL>{TCP_OPT_ACCEPT_NO_CL}	{ count(); yylval.strval=yytext;
+									return TCP_OPT_ACCEPT_NO_CL; }
 <INITIAL>{DISABLE_TLS}	{ count(); yylval.strval=yytext; return DISABLE_TLS; }
 <INITIAL>{ENABLE_TLS}	{ count(); yylval.strval=yytext; return ENABLE_TLS; }
 <INITIAL>{TLSLOG}		{ count(); yylval.strval=yytext; return TLS_PORT_NO; }
diff --git a/cfg.y b/cfg.y
index f4e32ed..5052078 100644
--- a/cfg.y
+++ b/cfg.y
@@ -461,6 +461,7 @@ extern char *finame;
 %token TCP_OPT_KEEPINTVL
 %token TCP_OPT_KEEPCNT
 %token TCP_OPT_CRLF_PING
+%token TCP_OPT_ACCEPT_NO_CL
 %token DISABLE_TLS
 %token ENABLE_TLS
 %token TLSLOG
@@ -1172,6 +1173,14 @@ assign_stm:
 		#endif
 	}
 	| TCP_OPT_CRLF_PING EQUAL error { yyerror("boolean value expected"); }
+	| TCP_OPT_ACCEPT_NO_CL EQUAL NUMBER {
+		#ifdef USE_TCP
+			tcp_default_cfg.accept_no_cl=$3;
+		#else
+			warn("tcp support not compiled in");
+		#endif
+	}
+	| TCP_OPT_ACCEPT_NO_CL EQUAL error { yyerror("boolean value expected"); }
 	| DISABLE_TLS EQUAL NUMBER {
 		#ifdef USE_TLS
 			tls_disable=$3;
diff --git a/tcp_options.h b/tcp_options.h
index a82a574..ae8215c 100644
--- a/tcp_options.h
+++ b/tcp_options.h
@@ -141,6 +141,7 @@ struct cfg_group_tcp{
 	/* internal, "fixed" vars */
 	unsigned int rd_buf_size; /* read buffer size (should be > max. datagram)*/
 	unsigned int wq_blk_size; /* async write block size (debugging use) */
+	int accept_no_cl;  /* on/off - accpet messages without content-lenght */
 };
 
 extern struct cfg_group_tcp tcp_default_cfg;
diff --git a/tcp_read.c b/tcp_read.c
index c5fc575..fc9552a 100644
--- a/tcp_read.c
+++ b/tcp_read.c
@@ -370,9 +370,17 @@ int tcp_read_headers(struct tcp_connection *c, int* read_flags)
 							goto skip;
 						}
 					}else{
-						DBG("tcp_read_headers: ERROR: no clen, p=%X\n",
+						if (cfg_get(tcp, tcp_cfg, accept_no_cl)!=0) {
+							r->body=p+1;
+							r->bytes_to_go=0;
+							r->flags|=F_TCP_REQ_COMPLETE;
+							p++;
+							goto skip;
+						} else {
+							DBG("tcp_read_headers: ERROR: no clen, p=%X\n",
 									*p);
-						r->error=TCP_REQ_BAD_LEN;
+							r->error=TCP_REQ_BAD_LEN;
+						}
 					}
 				}else r->state=H_SKIP;
 				p++;
@@ -719,11 +727,13 @@ again:
 				DBG("tcp_read_req: body:\n%.*s\n", req->content_len,req->body);
 #endif
 			}else{
-				req->error=TCP_REQ_BAD_LEN;
-				LOG(L_ERR, "ERROR: tcp_read_req: content length not present or"
+				if (cfg_get(tcp, tcp_cfg, accept_no_cl)==0) {
+					req->error=TCP_REQ_BAD_LEN;
+					LOG(L_ERR, "ERROR: tcp_read_req: content length not present or"
 						" unparsable\n");
-				resp=CONN_ERROR;
-				goto end_req;
+					resp=CONN_ERROR;
+					goto end_req;
+				}
 			}
 			/* if we are here everything is nice and ok*/
 			resp=CONN_RELEASE;




More information about the sr-dev mailing list