enhanced htrd to extract the anchor part from the requested URI.
added mio_htre_getqanchor()
This commit is contained in:
		
							
								
								
									
										145
									
								
								mio/lib/htrd.c
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								mio/lib/htrd.c
									
									
									
									
									
								
							| @ -292,125 +292,66 @@ static mio_bch_t* parse_initial_line (mio_htrd_t* htrd, mio_bch_t* line) | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| #if 0 | ||||
| 		mio_bch_t* out; | ||||
| #endif | ||||
| 		mio_bcs_t param; | ||||
| 		mio_bcs_t anchor; | ||||
|  | ||||
| 		/* skip spaces */ | ||||
| 		do p++; while (is_space_octet(*p)); | ||||
|  | ||||
| 		/* process the url part */ | ||||
| 		tmp.ptr = p; /* remember the beginning of path*/ | ||||
| 		param.ptr = MIO_NULL; | ||||
| #if 0 | ||||
| 		out = p; | ||||
| 		while (*p != '\0' && !is_space_octet(*p))  | ||||
| 		tmp.ptr = p; tmp.len = 0; | ||||
| 		param.ptr = MIO_NULL; param.len = 0; | ||||
| 		anchor.ptr = MIO_NULL; anchor.len = 0; | ||||
|  | ||||
| 		while (1) | ||||
| 		{ | ||||
| 			if (*p == '%' && param.ptr == MIO_NULL) | ||||
| 			if (MIO_UNLIKELY(*p == '\0')) goto badre; | ||||
| 			else if (is_space_octet(*p) || *p == '?' || *p == '#') | ||||
| 			{ | ||||
| 				/* decode percent-encoded charaters in the  | ||||
| 				 * path part. if we're in the parameter string | ||||
| 				 * part, we don't decode them. */ | ||||
|  | ||||
| 				int q = xdigit_to_num(*(p+1)); | ||||
| 				int w = xdigit_to_num(*(p+2)); | ||||
|  | ||||
| 				if (q >= 0 && w >= 0) | ||||
| 				{ | ||||
| 					int t = (q << 4) + w; | ||||
| 					if (t == 0) | ||||
| 					{ | ||||
| 						/* percent enconding contains a null character */ | ||||
| 						goto badre; | ||||
| 					} | ||||
|  | ||||
| 					*out++ = t; | ||||
| 					p += 3; | ||||
|  | ||||
| 					htrd->re.flags |= MIO_HTRE_QPATH_PERDEC; | ||||
| 				} | ||||
| 				else *out++ = *p++; | ||||
| 			} | ||||
| 			else if (*p == '?') | ||||
| 			{ | ||||
| 				if (param.ptr == MIO_NULL) | ||||
| 				{ | ||||
| 					/* ? must be explicit to be an argument instroducer.  | ||||
| 					 * %3f is just a literal. */ | ||||
| 					tmp.len = out - tmp.ptr; | ||||
| 					*out++ = '\0'; /* null-terminate the path part */ | ||||
| 					param.ptr = out; | ||||
| 					p++; | ||||
| 				} | ||||
| 				else *out++ = *p++; | ||||
| 			} | ||||
| 			else *out++ = *p++; | ||||
| 		} | ||||
|  | ||||
| 		/* the url must be followed by a space */ | ||||
| 		if (!is_space_octet(*p)) goto badre; | ||||
| 	 | ||||
| 		/* null-terminate the url part though we know the length */ | ||||
| 		*out = '\0';  | ||||
|  | ||||
| 		if (htrd->re.flags & MIO_HTRE_QPATH_PERDEC) | ||||
| 		{ | ||||
| 			/* TODO: build the original qpath */ | ||||
| 			htrd->re.orgpqath.ptr = XXX; | ||||
| 			htrd->re.orgpath.len = XXXX; | ||||
| 		} | ||||
|  | ||||
| 		if (param.ptr) | ||||
| 		{ | ||||
| 			param.len = out - param.ptr; | ||||
| 			htrd->re.u.q.path = tmp; | ||||
| 			htrd->re.u.q.param = param; | ||||
| 		} | ||||
| 		else  | ||||
| 		{ | ||||
| 			tmp.len = out - tmp.ptr; | ||||
| 			htrd->re.u.q.path = tmp; | ||||
| 			htrd->re.u.q.param.ptr = MIO_NULL; | ||||
| 			htrd->re.u.q.param.len = 0; | ||||
| 		} | ||||
| #else | ||||
| 		while (*p != '\0' && !is_space_octet(*p))  | ||||
| 		{ | ||||
| 			if (*p == '?' && !param.ptr) | ||||
| 			{ | ||||
| 				tmp.len = p - tmp.ptr; /* length of the path part */ | ||||
| 				*p++ = '\0'; /* null-terminate the path part */ | ||||
| 				param.ptr = p; | ||||
| 				tmp.len = p - tmp.ptr;  | ||||
| 				if (tmp.len <= 0) goto badre; | ||||
| 				break; | ||||
| 			} | ||||
| 			else p++; | ||||
| 		} | ||||
|  | ||||
| 		/* the url must be followed by a space */ | ||||
| 		if (!is_space_octet(*p)) goto badre; | ||||
| 		if (param.ptr)  | ||||
| 		if (*p == '?') | ||||
| 		{ | ||||
| 			param.len = p - param.ptr; /* length of the param part */ | ||||
| 			param.ptr = ++p; | ||||
| 			while (1) | ||||
| 			{ | ||||
| 				if (MIO_UNLIKELY(*p == '\0')) goto badre; | ||||
| 				else if (is_space_octet(*p) || *p == '#') | ||||
| 				{ | ||||
| 					param.len = p - param.ptr; | ||||
| 					break; | ||||
| 				} | ||||
| 				else p++; | ||||
| 			} | ||||
| 		} | ||||
| 		else  | ||||
| 		{ | ||||
| 			tmp.len = p - tmp.ptr; | ||||
| 			param.len = 0; | ||||
| 		} | ||||
| 		*p = '\0';  /* null-terminate the path or param part */ | ||||
|  | ||||
| 		if (param.ptr) | ||||
| 		if (*p == '#') | ||||
| 		{ | ||||
| 			htrd->re.u.q.path = tmp; | ||||
| 			htrd->re.u.q.param = param; | ||||
| 			anchor.ptr = ++p; | ||||
| 			while (1) | ||||
| 			{ | ||||
| 				if (MIO_UNLIKELY(*p == '\0')) goto badre; | ||||
| 				else if (is_space_octet(*p)) | ||||
| 				{ | ||||
| 					anchor.len = p - anchor.ptr; | ||||
| 					break; | ||||
| 				} | ||||
| 				else p++; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			htrd->re.u.q.path = tmp; | ||||
| 			htrd->re.u.q.param.ptr = MIO_NULL; | ||||
| 			htrd->re.u.q.param.len = 0; | ||||
| 		} | ||||
| #endif | ||||
|  | ||||
| 		tmp.ptr[tmp.len] = '\0'; | ||||
| 		if (param.ptr) param.ptr[param.len] = '\0'; | ||||
| 		if (anchor.ptr) anchor.ptr[anchor.len] = '\0'; | ||||
|  | ||||
| 		htrd->re.u.q.path = tmp; | ||||
| 		htrd->re.u.q.param = param; | ||||
| 		htrd->re.u.q.anchor = anchor; | ||||
|  | ||||
| 		if (htrd->option & MIO_HTRD_CANONQPATH) | ||||
| 		{ | ||||
|  | ||||
| @ -152,6 +152,7 @@ struct mio_htre_t | ||||
| 			} method; | ||||
| 			mio_bcs_t path; | ||||
| 			mio_bcs_t param; | ||||
| 			mio_bcs_t anchor; | ||||
| 		} q; | ||||
| 		struct | ||||
| 		{ | ||||
| @ -216,6 +217,7 @@ struct mio_htre_t | ||||
|  | ||||
| #define mio_htre_getqpath(re) ((re)->u.q.path.ptr) | ||||
| #define mio_htre_getqparam(re) ((re)->u.q.param.ptr) | ||||
| #define mio_htre_getqanchor(re) ((re)->u.q.anchor.ptr) | ||||
| #define mio_htre_getorgqpath(re) ((re)->orgqpath.ptr) | ||||
|  | ||||
| #define mio_htre_getscodeval(re) ((re)->u.s.code.val) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user