Andrei Pelinescu-Onciul 23 éve
szülő
commit
c0c6207a49
3 módosított fájl, 33 hozzáadás és 11 törlés
  1. 1 1
      Makefile.defs
  2. 5 3
      tcp_conn.h
  3. 27 7
      tcp_read.c

+ 1 - 1
Makefile.defs

@@ -143,7 +143,7 @@ DEFS+= -DNAME='"$(NAME)"' -DVERSION='"$(RELEASE)"' -DARCH='"$(ARCH)"' \
 	 -DDNS_IP_HACK \
 	 -DUSE_IPV6 \
 	 -DDBG_QM_MALLOC \
-	 #-DUSE_TCP \
+	 # -DUSE_TCP \
 	 #-DF_MALLOC \
 	 #-DNO_DEBUG \
 	 #-DNO_LOG

+ 5 - 3
tcp_conn.h

@@ -43,7 +43,7 @@
 
 enum tcp_req_errors {	TCP_REQ_INIT, TCP_REQ_OK, TCP_READ_ERROR,
 						TCP_REQ_OVERRUN, TCP_REQ_BAD_LEN };
-enum tcp_req_states {	H_SKIP, H_LF, H_LFCR,  H_BODY, H_STARTWS,
+enum tcp_req_states {	H_SKIP_EMPTY, H_SKIP, H_LF, H_LFCR,  H_BODY, H_STARTWS,
 		H_CONT_LEN1, H_CONT_LEN2, H_CONT_LEN3, H_CONT_LEN4, H_CONT_LEN5,
 		H_CONT_LEN6, H_CONT_LEN7, H_CONT_LEN8, H_CONT_LEN9, H_CONT_LEN10,
 		H_CONT_LEN11, H_CONT_LEN12, H_CONT_LEN13, H_L_COLON, 
@@ -58,6 +58,8 @@ struct tcp_req{
 	struct tcp_req* next;
 	/* sockaddr ? */
 	char buf[TCP_BUF_SIZE]; /* bytes read so far*/
+	char* start; /* where the message starts, after alll the empty lines are
+					skipped*/
 	char* pos; /* current position in buf */
 	char* parsed; /* last parsed position */
 	char* body; /* body position */
@@ -99,9 +101,9 @@ struct tcp_connection{
 #define init_tcp_req( r) \
 	do{ \
 		memset( (r), 0, sizeof(struct tcp_req)); \
-		(r)->parsed=(r)->pos=(r)->buf; \
+		(r)->parsed=(r)->pos=(r)->start=(r)->buf; \
 		(r)->error=TCP_REQ_OK;\
-		(r)->state=H_STARTWS; \
+		(r)->state=H_SKIP_EMPTY; \
 	}while(0)
 
 

+ 27 - 7
tcp_read.c

@@ -139,7 +139,7 @@ int tcp_read_headers(struct tcp_req *r, int fd)
 	p=r->parsed;
 	
 	while(p<r->pos && r->error==TCP_REQ_OK){
-		switch(r->state){
+		switch((unsigned char)r->state){
 			case H_BODY: /* read the body*/
 				remaining=r->pos-p;
 				if (remaining>r->bytes_to_go) remaining=r->bytes_to_go;
@@ -214,7 +214,25 @@ int tcp_read_headers(struct tcp_req *r, int fd)
 				}
 				p++;
 				break;
-			
+			case H_SKIP_EMPTY:
+				switch (*p){
+					case '\n':
+					case '\r':
+					case ' ':
+					case '\t':
+						/* skip empty lines */
+						break;
+					case 'C': 
+					case 'c': 
+						r->state=H_CONT_LEN1; 
+						r->start=p;
+						break;
+					default:
+						r->state=H_SKIP;
+						r->start=p;
+				};
+				p++;
+				break;
 			change_state_case(H_CONT_LEN1,  'O', 'o', H_CONT_LEN2);
 			change_state_case(H_CONT_LEN2,  'N', 'n', H_CONT_LEN3);
 			change_state_case(H_CONT_LEN3,  'T', 't', H_CONT_LEN4);
@@ -277,6 +295,7 @@ int tcp_read_headers(struct tcp_req *r, int fd)
 					case '6':
 					case '7':
 					case '8':
+					case '9':
 						r->content_len=r->content_len*10+(*p-'0');
 						break;
 					case '\r':
@@ -364,24 +383,25 @@ int tcp_read_req(struct tcp_connection* con)
 			resp=CONN_RELEASE;
 			/* just for debugging use sendipv4 as receiving socket */
 			DBG("calling receive_msg(%p, %d, )\n",
-					req->buf, (int)(req->parsed-req->buf));
+					req->buf, (int)(req->parsed-req->start));
 			bind_address=sendipv4; /*&tcp_info[con->sock_idx];*/
 			con->rcv.proto_reserved1=con->id; /* copy the id */
-			if (receive_msg(req->buf, req->parsed-req->buf, &con->rcv)<0){
+			if (receive_msg(req->start, req->parsed-req->start, &con->rcv)<0){
 				resp=CONN_ERROR;
 				goto end_req;
 			}
 			
 			/* prepare for next request */
-			size=req->pos-req->body;
-			if (size) memmove(req->buf, req->body, size);
+			size=req->pos-req->parsed;
+			if (size) memmove(req->buf, req->parsed, size);
 			DBG("tcp_read_req: preparing for new request, kept %ld bytes\n",
 					size);
 			req->pos=req->buf+size;
 			req->parsed=req->buf;
+			req->start=req->buf;
 			req->body=0;
 			req->error=TCP_REQ_OK;
-			req->state=H_STARTWS;
+			req->state=H_SKIP_EMPTY;
 			req->complete=req->content_len=req->has_content_len=0;
 			req->bytes_to_go=0;