| #include	"wsIntrn.h" | 
 |  | 
 | static char_t	*websDefaultPage;			/* Default page name */ | 
 | static char_t	*websDefaultDir;			/* Default Web page directory */ | 
 |  | 
 | static void websCgiDownLoadWriteEvent(webs_t wp); | 
 | static void websDefaultWriteEvent(webs_t wp); | 
 |  | 
 | static int web_check_url(char *buf, char *nv_name, int is_ipv6) | 
 | { | 
 | 	if(buf && nv_name) { | 
 | 		char url[40] = {0}; | 
 | 		char full_url[50] = {0}; | 
 | 		sc_cfg_get(nv_name, url, sizeof(url)); | 
 | 		if (websSSLIsOpen()){ | 
 | 			if(is_ipv6) | 
 | 				snprintf(full_url, sizeof(full_url),"https://[%s]",url); | 
 | 			else | 
 | 				snprintf(full_url, sizeof(full_url),"https://%s",url); | 
 | 		} else { | 
 | 			if(is_ipv6) | 
 | 				snprintf(full_url, sizeof(full_url),"http://[%s]",url); | 
 | 			else | 
 | 				snprintf(full_url, sizeof(full_url),"http://%s",url); | 
 | 		} | 
 | 		if(strlen(buf) > strlen(full_url) && strstr(buf,full_url)) { | 
 | 			return 1; | 
 | 		} | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | int websDefaultHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, | 
 | 						char_t *url, char_t *path, char_t *query) | 
 | { | 
 | 	websStatType	sbuf; | 
 | 	char_t			*lpath, *tmp, *date; | 
 | 	int				bytes, flags, nchars; | 
 | 	char 			wifi_png__path[256] = {0}; | 
 | 	char 			*wifi_ptr = NULL; | 
 | 	char 			wifi_root_dir[20] = {0}; | 
 | 	a_assert(websValid(wp)); | 
 | 	a_assert(url && *url); | 
 | 	a_assert(path); | 
 | 	a_assert(query); | 
 | #ifdef WEBINSPECT_FIX	 | 
 | 	if (strstr(query,"txtPwd")) { | 
 | 		websDone(wp, 0); | 
 | 		return 1; | 
 | 	} | 
 | #ifdef WEBS_SECURITY | 
 | 	if (strstr(query,"_method")) { | 
 | 		printf("websDH: qry=%s\n",query); | 
 | 		websError(wp, 405, T("")); | 
 | 		return 1; | 
 | 	} | 
 | #endif | 
 | #endif	 | 
 |  | 
 | 	flags = websGetRequestFlags(wp); | 
 |  | 
 | 	if (websValidateUrl(wp, path) < 0)  | 
 |    { | 
 |       websError(wp, 500, T("Invalid URL")); | 
 | 		return 1; | 
 | 	} | 
 | 	lpath = websGetRequestLpath(wp); | 
 | 		 | 
 | //qrcode_ssid_wifikey.png   qrcode_multi_ssid_wifikey.png | 
 | 	if((strstr(lpath,"pic/qrcode_ssid_wifikey.png")!=NULL)||(strstr(lpath,"pic/qrcode_multi_ssid_wifikey.png")!=NULL)) | 
 | 	{ | 
 | 		sc_cfg_get("wifi_root_dir",wifi_root_dir,sizeof(wifi_root_dir)); | 
 | 		wifi_ptr=strstr(lpath,"pic/qrcode_"); | 
 | 		wifi_ptr+=4; | 
 | 		//printf("[wifi_png]wifi_ptr:%s\n",wifi_ptr); | 
 | 		snprintf(wifi_png__path,sizeof(wifi_png__path),"%s/wifi/%s",wifi_root_dir,wifi_ptr); | 
 | 		//printf("[wifi_png]wifi_png_path:%s\n",wifi_png__path); | 
 | 		lpath=wifi_png__path; | 
 | 	} | 
 | 	 | 
 |     if(strstr(lpath,"web/messages")) | 
 | 	{ | 
 | 		//lpath="/var/log/webshow_messages"; | 
 | 		snprintf(wifi_png__path,sizeof(wifi_png__path),"%s","/var/log/webshow_messages"); | 
 | 		lpath=wifi_png__path;// kw OVERWRITE_CONST_CHAR | 
 |     } | 
 | 	if(strstr(lpath,"/webshow_messages")) | 
 | 	{ | 
 | 		//lpath="/etc_ro/web/webshow_messages"; | 
 | 		snprintf(wifi_png__path,sizeof(wifi_png__path),"%s","/etc_ro/web/webshow_messages"); | 
 | 		lpath=wifi_png__path;// kw OVERWRITE_CONST_CHAR | 
 |     } | 
 | 	nchars = gstrlen(lpath) - 1; | 
 | 	if (lpath[nchars] == '/' || lpath[nchars] == '\\') { | 
 | 		lpath[nchars] = '\0'; | 
 | 	} | 
 | 	if(lpath != websGetRequestLpath(wp)) | 
 | 	{ | 
 | 		websSetRequestLpath(wp,lpath); | 
 | 		lpath = websGetRequestLpath(wp); | 
 | 	} | 
 |  | 
 | 	if (websPageIsDirectory(lpath)) { | 
 | 		nchars = gstrlen(path); | 
 | 		if (path[nchars-1] == '/' || path[nchars-1] == '\\') { | 
 | 			path[--nchars] = '\0'; | 
 | 		} | 
 | 		nchars += gstrlen(websDefaultPage) + 2; | 
 | 		fmtAlloc(&tmp, nchars, T("%s/%s"), path, websDefaultPage); | 
 | 		websRedirect(wp, tmp); | 
 | 		bfreeSafe(B_L, tmp); | 
 | 		return 1; | 
 | 	} | 
 | #ifdef WEBS_SECURITY	 | 
 | 	if (strstr(path,websDefaultPage)){ | 
 | 		if (!(wp->flags & WEBS_SECURE) && websSSLIsOpen()){ | 
 | 			printf("[goahead]no https Redirect\n"); | 
 | 			websRedirect(wp, zte_web_get_login_page(wp)); | 
 | 			return 1; | 
 | 		} | 
 | 	} else { | 
 | #if 0 | 
 | 		if(wp->cookie == NULL) { | 
 | 			printf("[goahead]no cookie Redirect\n"); | 
 | 			websRedirect(wp, zte_web_get_login_page(wp)); | 
 | 			return 1; | 
 | 		} | 
 | #endif		 | 
 | 		if(wp->referer) | 
 | 		{ | 
 | 			if(web_check_url(wp->referer, "LocalDomain", 0) == 0 | 
 | 				&& web_check_url(wp->referer, "lan_ipaddr", 0) == 0 | 
 | 				&& web_check_url(wp->referer, "lan_ipv6addr", 1) == 0) { | 
 | 				printf("[goahead]referer=%s Redirect\n",wp->referer); | 
 | 				websRedirect(wp, zte_web_get_login_page(wp)); | 
 | 				return 1; | 
 | 			} | 
 | 		} | 
 | 	} | 
 | #endif | 
 | /* | 
 |  *	Open the document. Stat for later use. | 
 |  */ | 
 |  | 
 | 	if (websPageOpen(wp, lpath, path, SOCKET_RDONLY | SOCKET_BINARY,  | 
 | 		0666) < 0)  | 
 |    { | 
 |       /*  | 
 |        * <http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html> | 
 |        */ | 
 |        | 
 | 		websError(wp, 404, T("Cannot open URL")); | 
 | 		return 1; | 
 | 	}  | 
 |  | 
 | 	if (websPageStat(wp, lpath, path, &sbuf) < 0) { | 
 | 		websError(wp, 400, T("Cannot stat page for URL")); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	websStats.localHits++; | 
 | #ifdef WEBS_IF_MODIFIED_SUPPORT | 
 | 	if (flags & WEBS_IF_MODIFIED && !(flags & WEBS_ASP)) { | 
 | 		if (sbuf.mtime <= wp->since) { | 
 | 			websWrite(wp, T("HTTP/1.0 304 Use local copy\r\n")); | 
 |  | 
 | 			websWrite(wp, T("Server: %s\r\n"), WEBS_NAME); | 
 |  | 
 | 			if (flags & WEBS_KEEP_ALIVE) { | 
 | 				websWrite(wp, T("Connection: keep-alive\r\n")); | 
 | 			} | 
 | 			websWrite(wp, T("\r\n")); | 
 | 			websSetRequestFlags(wp, flags |= WEBS_HEADER_DONE); | 
 | 			websDone(wp, 304); | 
 | 			return 1; | 
 | 		} | 
 | 	} | 
 | #endif | 
 |  | 
 | 	if ((date = websGetDateString(NULL)) != NULL) { | 
 | 		websWrite(wp, T("HTTP/1.0 200 OK\r\nDate: %s\r\n"), date); | 
 |  | 
 | 		websWrite(wp, T("Server: %s\r\n"), WEBS_NAME); | 
 | 		bfree(B_L, date); | 
 | 	} | 
 | 	flags |= WEBS_HEADER_DONE; | 
 |  | 
 | 	if (flags & WEBS_ASP) { | 
 | 		bytes = 0; | 
 | #ifndef WEBINSPECT_FIX	 | 
 | 		websWrite(wp, T("Pragma: no-cache\r\nCache-Control: no-cache\r\n")); | 
 | #endif | 
 | 	} else { | 
 | 		if ((date = websGetDateString(&sbuf)) != NULL) { | 
 | 			websWrite(wp, T("Last-modified: %s\r\n"), date); | 
 | 			bfree(B_L, date); | 
 | 		} | 
 | 		bytes = sbuf.size; | 
 | 	} | 
 | #ifdef WEBINSPECT_FIX		 | 
 | 	websWrite(wp, T("X-Frame-Options: SAMEORIGIN\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n")); | 
 | #endif | 
 | #ifdef WEBS_SECURITY | 
 | 	websWrite(wp, T("Expires: 0\n")); | 
 | 	if (strstr(path,websDefaultPage)){ | 
 | 		char id[33] = {0}; | 
 | 		int ret = web_make_salt_base64(id, sizeof(id)); | 
 | 		if(ret > 0) | 
 | 		{ | 
 | 			if (websSSLIsOpen()) | 
 | 				websWrite(wp, T("Set-Cookie: id=%s; secure; HttpOnly; SameSite=Lax;\r\n"),id); | 
 | 			else | 
 | 				websWrite(wp, T("Set-Cookie: id=%s; HttpOnly; SameSite=Lax;\r\n"),id); | 
 | 		} | 
 | 	} | 
 | #endif	 | 
 |  | 
 | 	if (bytes) { | 
 | #ifdef WEBINSPECT_FIX	 | 
 | 		if (strstr(path,"/tmpl/")) | 
 | 			websWrite(wp, T("Content-length: %d\r\n"), bytes+86); | 
 | 		else | 
 | #endif		 | 
 | 			websWrite(wp, T("Content-length: %d\r\n"), bytes); | 
 | 		websSetRequestBytes(wp, bytes); | 
 | 	} | 
 | 	websWrite(wp, T("Content-type: %s\r\n"), websGetRequestType(wp)); | 
 |  | 
 | 	if ((flags & WEBS_KEEP_ALIVE) && !(flags & WEBS_ASP)) { | 
 | 		websWrite(wp, T("Connection: keep-alive\r\n")); | 
 | 	} | 
 | 	websWrite(wp, T("\r\n")); | 
 |  | 
 | 	if (flags & WEBS_HEAD_REQUEST) { | 
 | 		websDone(wp, 200); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | #ifdef WEB_ASP		 | 
 | 	if (flags & WEBS_ASP) { | 
 | 		if (websAspRequest(wp, lpath) < 0) { | 
 | 			return 1; | 
 | 		} | 
 | 		websDone(wp, 200); | 
 | 		return 1; | 
 | 	} | 
 | #endif		 | 
 | #ifdef WEBINSPECT_FIX | 
 | 	if (strstr(path,"/tmpl/") && bytes) { | 
 | 		websWrite(wp, T("<script type=\"text/javascript\">if(self!=top){top.location = self.location;}</script>\r\n")); | 
 | 	} | 
 | #endif	 | 
 | #ifdef WEBS_SSL_SUPPORT | 
 | 	if (wp->flags & WEBS_SECURE) { | 
 | 		websDefaultWriteEvent(wp); | 
 | 	} else { | 
 | 		websSetRequestSocketHandler(wp, SOCKET_WRITABLE, websDefaultWriteEvent); | 
 | 	} | 
 | #else | 
 |  | 
 | 	websSetRequestSocketHandler(wp, SOCKET_WRITABLE, websDefaultWriteEvent); | 
 | #endif | 
 | 	return 1; | 
 | } | 
 |  | 
 | //#ifdef FEATURE_ZTE_WEB_TCARD | 
 | //added by guo shoupeng 10124224 for http share 20120110 start | 
 | int websCgiDownLoadHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg, | 
 | 						char_t *url, char_t *path, char_t *query) | 
 | { | 
 | 	//urlPrefix /mmc2 | 
 | 	//url /mmc2/test.file?.........    url = ALL | 
 | 	//path /mmc2/test.file | 
 | 	//query ...... | 
 | 	if (zte_check_downloading_file()) | 
 | 	{ | 
 | 		printf("[httpshare]call websCgiDownLoadHandler:system is downloading!.\n"); | 
 | 		websError(wp, 404, T("System is downloading file,please try later!")); | 
 | 		return 1; | 
 | 	} | 
 | 	websStatType	sbuf; | 
 | 	char_t			*lpath, *tmp, *date; | 
 | 	int				bytes, flags, nchars; | 
 |  | 
 | 	a_assert(websValid(wp)); | 
 | 	a_assert(url && *url); | 
 | 	a_assert(path); | 
 | 	a_assert(query); | 
 | 	char_t mmc2_path[4096+1] = {0}; | 
 |  | 
 | 	flags = websGetRequestFlags(wp); | 
 |  | 
 | 	if (websValidateUrl(wp, path) < 0)  | 
 |    { | 
 |       websError(wp, 500, T("Invalid URL")); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	lpath = websGetRequestLpath(wp); | 
 |  | 
 | 	nchars = gstrlen(lpath) - 1; | 
 | 	if (lpath[nchars] == '/' || lpath[nchars] == '\\') { | 
 | 		lpath[nchars] = '\0'; | 
 | 	} | 
 |  | 
 | 	if (websPageIsDirectory(lpath)) { | 
 | 		nchars = gstrlen(path); | 
 | 		if (path[nchars-1] == '/' || path[nchars-1] == '\\') { | 
 | 			path[--nchars] = '\0'; | 
 | 		} | 
 | 		nchars += gstrlen(websDefaultPage) + 2; | 
 | 		fmtAlloc(&tmp, nchars, T("%s/%s"), path, websDefaultPage); | 
 | 		websRedirect(wp, tmp); | 
 | 		bfreeSafe(B_L, tmp); | 
 | 		return 1; | 
 | 	} | 
 | //added for download file  start | 
 | 	 | 
 | 	if(strstr(lpath,"/mmc2")) | 
 | 	{		 | 
 | 		snprintf(mmc2_path,4096+1,"/etc_rw/config%s",path); | 
 | 		lpath = mmc2_path; | 
 | 		path = mmc2_path; | 
 | 		 | 
 | 		printf("[httpshare]insert download file->%s\n",mmc2_path); | 
 | 		zte_insert_download_file(mmc2_path); | 
 | 		websSetRequestLpath(wp,lpath); | 
 | 	} | 
 |  | 
 | //added for download file end | 
 |  | 
 | 	if (websPageOpen(wp, lpath, path, SOCKET_RDONLY | SOCKET_BINARY,  | 
 | 		0666) < 0)  | 
 |    { | 
 |       	printf("[httpshare]file is too big , can't open!\n"); | 
 | 	  	if(strstr(mmc2_path,"/mmc2") != NULL) | 
 | 		{ | 
 | 			zte_del_download_file(); | 
 | 			printf("[httpshare]websPageClose:del file->%s form sql download.\n",mmc2_path);			 | 
 | 		} | 
 | 		websError(wp, 404, T("Cannot open URL,File Error!")); | 
 | 		return 1; | 
 | 	}  | 
 |  | 
 | 	if (websPageStat(wp, lpath, path, &sbuf) < 0) { | 
 |  | 
 | 		if(strstr(mmc2_path,"/mmc2") != NULL) | 
 | 		{ | 
 | 			zte_del_download_file(); | 
 | 			printf("[httpshare]websPageClose:del file->%s form sql download.\n",mmc2_path);			 | 
 | 		} | 
 | 	  	websError(wp, 400, T("Cannot stat page for URL")); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	websStats.localHits++; | 
 | #ifdef WEBS_IF_MODIFIED_SUPPORT | 
 | 	if (flags & WEBS_IF_MODIFIED && !(flags & WEBS_ASP)) { | 
 | 		if (sbuf.mtime <= wp->since) { | 
 | 			websWrite(wp, T("HTTP/1.0 304 Use local copy\r\n")); | 
 |  | 
 | 			websWrite(wp, T("Server: %s\r\n"), WEBS_NAME); | 
 |  | 
 | 			if (flags & WEBS_KEEP_ALIVE) { | 
 | 				websWrite(wp, T("Connection: keep-alive\r\n")); | 
 | 			} | 
 | 			websWrite(wp, T("\r\n")); | 
 | 			websSetRequestFlags(wp, flags |= WEBS_HEADER_DONE); | 
 | 			websDone(wp, 304); | 
 | 			return 1; | 
 | 		} | 
 | 	} | 
 | #endif | 
 |  | 
 | 	if ((date = websGetDateString(NULL)) != NULL) { | 
 | 		websWrite(wp, T("HTTP/1.0 200 OK\r\nDate: %s\r\n"), date); | 
 |  | 
 | 		websWrite(wp, T("Server: %s\r\n"), WEBS_NAME); | 
 | 		bfree(B_L, date); | 
 | 	} | 
 | 	flags |= WEBS_HEADER_DONE; | 
 |  | 
 |  #if 0 | 
 | 	if (flags & WEBS_ASP) { | 
 | 		bytes = 0; | 
 | 		websWrite(wp, T("Pragma: no-cache\r\nCache-Control: no-cache\r\n")); | 
 |  | 
 | 	} else { | 
 | #endif	 | 
 | 		if ((date = websGetDateString(&sbuf)) != NULL) { | 
 | 			websWrite(wp, T("Last-modified: %s\r\n"), date); | 
 | 			bfree(B_L, date); | 
 | 		} | 
 | 		bytes = sbuf.size; | 
 | #if 0		 | 
 | 	} | 
 | #endif	 | 
 | #if 0 | 
 | 	if (bytes) { | 
 | #endif	 | 
 | 		websWrite(wp, T("Content-length: %d\r\n"), bytes);	        | 
 | 		websSetRequestBytes(wp, bytes);		 | 
 | #if 0		 | 
 | 	}	 | 
 | #endif	 | 
 | #if 0 | 
 | 	websWrite(wp, T("Content-type: %s\r\n"), websGetRequestType(wp)); | 
 | #else | 
 | 	char name[256] = {0}; | 
 | 	int k = 0; | 
 | 	int i = 0; | 
 | 	for(i = 0; i < gstrlen(lpath); i++){ | 
 | 		if((lpath[i] == '/') ||  (lpath[i] == '\\')){ | 
 | 			memset(name, 0, sizeof(name)); | 
 | 			k = 0; | 
 | 			continue; | 
 | 		}else{ | 
 | 			name[k] = lpath[i]; | 
 | 			k++; | 
 | 		}		 | 
 | 	} | 
 | 	name[k] = '\0'; | 
 |  | 
 | 	 | 
 | 	websWrite(wp, T("Content-type: application/octet-stream\r\n")); | 
 | 	websWrite(wp, T("Content-Disposition: attachment; filename\r\n"));		 | 
 | #endif | 
 |  | 
 | #if 0 | 
 | 	if ((flags & WEBS_KEEP_ALIVE)  | 
 | #if 0		 | 
 | 		&& !(flags & WEBS_ASP) | 
 | #endif		 | 
 | 		) { | 
 | 		websWrite(wp, T("Connection: keep-alive\r\n")); | 
 | 	} | 
 | #endif | 
 | 	websWrite(wp, T("\r\n")); | 
 |  | 
 | /* | 
 |  *	All done if the browser did a HEAD request | 
 |  */ | 
 | 	/*if (flags & WEBS_HEAD_REQUEST) { | 
 |  | 
 | 		printf("Head request:websDone\n"); | 
 | 		websDone(wp, 200); | 
 | 		return 1; | 
 | 	}*/ | 
 |  | 
 | /* | 
 |  *	Evaluate ASP requests | 
 |  */ | 
 |  #if 0 | 
 | 	if (flags & WEBS_ASP) { | 
 | 		if (websAspRequest(wp, lpath) < 0) { | 
 | 			return 1; | 
 | 		} | 
 | 		websDone(wp, 200); | 
 | 		return 1; | 
 | 	} | 
 | #endif	 | 
 |  | 
 | #ifdef WEBS_SSL_SUPPORT | 
 | 	if (wp->flags & WEBS_SECURE) { | 
 | 		websDefaultWriteEvent(wp); | 
 | 	} else { | 
 | 		websSetRequestSocketHandler(wp, SOCKET_WRITABLE, websCgiDownLoadWriteEvent); | 
 | 	} | 
 | #else | 
 | /* | 
 |  *	For normal web documents, return the data via background write | 
 |  */ | 
 | 	websSetRequestSocketHandler(wp, SOCKET_WRITABLE, websCgiDownLoadWriteEvent); | 
 | #endif | 
 | 	return 1; | 
 | } | 
 | //added by guo shoupeng 10124224 for http share 20120110 end | 
 | //#endif | 
 |  | 
 | #ifdef WIN32 | 
 |  | 
 | static int badPath(char_t* path, char_t* badPath, int badLen) | 
 | { | 
 |    int retval = 0; | 
 |    int len = gstrlen(path); | 
 |    int i = 0; | 
 |  | 
 |    if (len <= badLen +1) | 
 |    { | 
 |       for (i = 0; i < badLen; ++i) | 
 |       { | 
 |          if (badPath[i] != gtolower(path[i])) | 
 |          { | 
 |             return 0; | 
 |          } | 
 |       } | 
 |  | 
 |       retval = 1; | 
 |       if (badLen + 1 == len) | 
 |       { | 
 |          if (gisalnum(path[len-1])) | 
 |          { | 
 |             retval = 0; | 
 |          } | 
 |       } | 
 |    } | 
 |  | 
 |    return retval; | 
 | } | 
 |  | 
 |  | 
 | static int isBadWindowsPath(char_t** parts, int partCount) | 
 | { | 
 |    OSVERSIONINFO version; | 
 |    int i; | 
 |    version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); | 
 |    if (GetVersionEx(&version)) | 
 |    { | 
 |       if (VER_PLATFORM_WIN32_NT != version.dwPlatformId) | 
 |       { | 
 |          for (i = 0; i < partCount; ++i) | 
 |          { | 
 |             if (  | 
 |              (badPath(parts[i], T("con"), 3)) || | 
 |              (badPath(parts[i], T("nul"), 3)) || | 
 |              (badPath(parts[i], T("aux"), 3)) || | 
 |              (badPath(parts[i], T("clock$"), 6)) || | 
 |              (badPath(parts[i], T("config$"), 7)) ) | 
 |             { | 
 |                return 1; | 
 |             } | 
 |          } | 
 |       } | 
 |    } | 
 |  | 
 |    return 0; | 
 | } | 
 | #endif | 
 |  | 
 | int websValidateUrl(webs_t wp, char_t *path) | 
 | { | 
 | #define kMaxUrlParts 64 | 
 | 	char_t	*parts[kMaxUrlParts];	/* Array of ptr's to URL parts */ | 
 | 	char_t	*token, *dir, *lpath;  | 
 |    int	      i, len, npart; | 
 |  | 
 | 	a_assert(websValid(wp)); | 
 | 	a_assert(path); | 
 |  | 
 | 	dir = websGetRequestDir(wp); | 
 | 	if (/*dir == NULL ||*/ *dir == '\0') {  // kw 3 | 
 | 		return -1; | 
 | 	} | 
 |  | 
 | 	path = bstrdup(B_L, path); | 
 | 	websDecodeUrl(path, path, gstrlen(path)); | 
 |  | 
 | 	len = npart = 0; | 
 | 	parts[0] = NULL; | 
 |  | 
 |    token = gstrchr(path, '\\'); | 
 |    while (token != NULL) | 
 |    { | 
 |       *token = '/'; | 
 |       token = gstrchr(token, '\\'); | 
 |    } | 
 |     | 
 | 	token = gstrtok(path, T("/")); | 
 |  | 
 | 	while (token != NULL)  | 
 |    { | 
 |       if (npart >= kMaxUrlParts) | 
 |       { | 
 |          bfree(B_L, path); | 
 |          return -1; | 
 |       } | 
 | 		if (gstrcmp(token, T("..")) == 0)  | 
 |       { | 
 | 			if (npart > 0)  | 
 |          { | 
 | 				npart--; | 
 | 			} | 
 |  | 
 | 		}  | 
 |       else if (gstrcmp(token, T(".")) != 0)  | 
 |       { | 
 | 			parts[npart] = token; | 
 | 			len += gstrlen(token) + 1; | 
 | 			npart++; | 
 | 		} | 
 | 		token = gstrtok(NULL, T("/")); | 
 | 	} | 
 |  | 
 | #ifdef WIN32 | 
 |    if (isBadWindowsPath(parts, npart)) | 
 |    { | 
 |       bfree(B_L, path); | 
 |       return -1; | 
 |    } | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | 	if (npart || (gstrcmp(path, T("/")) == 0) || (path[0] == '\0'))  | 
 |    { | 
 | 		lpath = balloc(B_L, (gstrlen(dir) + 1 + len + 1) * sizeof(char_t)); | 
 | 		if(lpath == NULL){ | 
 | 			bfree(B_L, path); | 
 | 			return -1; | 
 | 		} | 
 | 		gstrcpy(lpath, dir); | 
 |  | 
 | 		for (i = 0; i < npart; i++)  | 
 |       { | 
 | 			gstrcat(lpath, T("/")); | 
 | 			gstrcat(lpath, parts[i]); | 
 | 		} | 
 | 		websSetRequestLpath(wp, lpath); | 
 | 		bfree(B_L, path); | 
 | 		bfree(B_L, lpath); | 
 | 	}  | 
 |    else  | 
 |    { | 
 | 		bfree(B_L, path); | 
 | 		return -1; | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | //#ifdef FEATURE_ZTE_WEB_TCARD | 
 | //added by guo shoupeng 10124224 for http share 20120110 start | 
 | int write_bytes = 0; | 
 | static void websCgiDownLoadWriteEvent(webs_t wp) | 
 | { | 
 |  //printf("websCgiDownLoadWriteEvent start\n"); | 
 | 	int		len = -1; | 
 | 	int wrote, flags, bytes, written; | 
 | 	char	*buf; | 
 | 	 | 
 | 	extern int errno; | 
 |  | 
 | 	a_assert(websValid(wp)); | 
 |  | 
 | 	flags = websGetRequestFlags(wp); | 
 |  | 
 | 	websSetTimeMark(wp); | 
 |  | 
 | 	wrote = bytes = 0; | 
 | 	written = websGetRequestWritten(wp); | 
 | 	static unsigned int timer = 0; | 
 |  | 
 | #if 0 | 
 | 	if ( !(flags & WEBS_ASP)) { | 
 | #endif		 | 
 | 		bytes = websGetRequestBytes(wp); | 
 |  | 
 | 		if ((buf = balloc(B_L, 16*PAGE_READ_BUFSIZE)) == NULL) { | 
 | 			websError(wp, 200, T("Can't get memory")); | 
 | 			return; //cov | 
 | 		} else { | 
 | 			while ((len = websPageReadData(wp, buf, 16*PAGE_READ_BUFSIZE)) > 0) { | 
 | 				if ((wrote = websWriteDataNonBlock(wp, buf, len)) < 0) { | 
 | 					break; | 
 | 				} | 
 | 				write_bytes += wrote; | 
 | 				written += wrote; | 
 | 				if (wrote != len) { | 
 | 					websPageSeek(wp, - (len - wrote)); | 
 | 					break; | 
 | 				} | 
 | 				if(write_bytes > DOWNLOAD_INTERVAL) | 
 | 				{ | 
 | 					write_bytes = 0; | 
 | 					break; | 
 | 				} | 
 |  | 
 | 				if( timer ==0) | 
 |                 { | 
 |                     websSetLoginTimemark(wp); | 
 | 					printf("[httpshare]download reset login state~\n"); | 
 |                 } | 
 | 				 | 
 | 				timer++; | 
 | 				timer=timer-(timer>>11<<11);  //timer%2^11 | 
 | 			} | 
 |  | 
 |  		    //EOF, done | 
 | 			if (len == 0) { | 
 | 				a_assert(written >= bytes); | 
 | 				written = bytes; | 
 | 			} | 
 | 			memset(buf, 0, 16*PAGE_READ_BUFSIZE);//kw | 
 | 			bfree(B_L, buf); | 
 | 		} | 
 | #if 0		 | 
 | 	} | 
 | #endif	 | 
 |  | 
 |  	if(len < 0) | 
 | 	{ | 
 | 		printf("[zyl-download-len-error]len->%d, errno->%d\n",len,errno); | 
 | 	} | 
 | 	websSetRequestWritten(wp, written); | 
 | 	if (wrote < 0 || written >= bytes|| len < 0) { | 
 | 	//if (wrote < 0 || written >= bytes) { | 
 | 		websDone(wp, 200); | 
 | 	} | 
 | } | 
 | //added by guo shoupeng 10124224 for http share 20120110 end | 
 | //#endif | 
 |  | 
 | static void websDefaultWriteEvent(webs_t wp) | 
 | { | 
 | 	int		len, wrote, flags, bytes, written; | 
 | 	char	*buf; | 
 |  | 
 | 	a_assert(websValid(wp)); | 
 |  | 
 | 	flags = websGetRequestFlags(wp); | 
 |  | 
 | 	websSetTimeMark(wp); | 
 |  | 
 | 	wrote = bytes = 0; | 
 | 	written = websGetRequestWritten(wp); | 
 |  | 
 | 	if ( !(flags & WEBS_ASP)) { | 
 | 		bytes = websGetRequestBytes(wp); | 
 |  | 
 | 		if ((buf = balloc(B_L, PAGE_READ_BUFSIZE)) == NULL) { | 
 | 			websError(wp, 200, T("Can't get memory")); | 
 | 			return; //cov | 
 | 		} else { | 
 | 			while ((len = websPageReadData(wp, buf, PAGE_READ_BUFSIZE)) > 0) { | 
 | 				if ((wrote = websWriteDataNonBlock(wp, buf, len)) < 0) { | 
 | 					break; | 
 | 				} | 
 | #ifdef _USE_WEBUI_ZIP | 
 | 				if (wrote != len) | 
 | 				{ | 
 | 					int tmplen; | 
 | 					int leftlen = (len - wrote); | 
 | 					while(leftlen > 0) | 
 | 					{ | 
 | 						if((get_sys_uptime() - wp->timestamp) > (WEBS_TIMEOUT/1000)) | 
 | 							break; | 
 | 						tmplen = websWriteDataNonBlock(wp, buf+wrote, leftlen); | 
 | 						if(tmplen >= 0) | 
 | 						{ | 
 | 							//printf("%s write=%d left=%d\n",wp->path,tmplen, leftlen); | 
 | 							wrote +=tmplen; | 
 | 							leftlen -=tmplen; | 
 | 							usleep(1000); | 
 | 						} | 
 | 						else | 
 | 						{ | 
 | 							break; | 
 | 						} | 
 | 					} | 
 |  | 
 | 				} | 
 | #endif				 | 
 | 				written += wrote; | 
 | 				if (wrote != len) { | 
 | 					websPageSeek(wp, - (len - wrote)); | 
 | 					break; | 
 | 				} | 
 | 			} | 
 |  | 
 | 			if (len == 0) { | 
 | 				a_assert(written >= bytes); | 
 | 				written = bytes; | 
 | 			 | 
 | 			} | 
 | 			memset(buf, 0, PAGE_READ_BUFSIZE);//kw | 
 | 			bfree(B_L, buf); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	websSetRequestWritten(wp, written); | 
 | 	if (wrote < 0 || written >= bytes) { | 
 | 		websDone(wp, 200); | 
 | 	} | 
 | } | 
 |  | 
 | void websDefaultClose() | 
 | { | 
 | 	if (websDefaultPage) { | 
 | 		bfree(B_L, websDefaultPage); | 
 | 		websDefaultPage = NULL; | 
 | 	} | 
 | 	if (websDefaultDir) { | 
 | 		bfree(B_L, websDefaultDir); | 
 | 		websDefaultDir = NULL; | 
 | 	} | 
 | } | 
 |  | 
 | char_t *websGetDefaultPage() | 
 | { | 
 | 	return websDefaultPage; | 
 | } | 
 |  | 
 | char_t *websGetDefaultDir() | 
 | { | 
 | 	return websDefaultDir; | 
 | } | 
 |  | 
 | void websSetDefaultPage(char_t *page) | 
 | { | 
 | 	a_assert(page && *page); | 
 |  | 
 | 	if (websDefaultPage) { | 
 | 		bfree(B_L, websDefaultPage); | 
 | 	} | 
 | 	websDefaultPage = bstrdup(B_L, page); | 
 | } | 
 |  | 
 | void websSetDefaultDir(char_t *dir) | 
 | { | 
 | 	a_assert(dir && *dir); | 
 | 	if (websDefaultDir) { | 
 | 		bfree(B_L, websDefaultDir); | 
 | 	} | 
 | 	websDefaultDir = bstrdup(B_L, dir); | 
 | } | 
 |  | 
 |  |