void Ns_FreeRequest(Ns_Request * request) { if (request != NULL) { ns_free(request->line); ns_free(request->method); ns_free(request->protocol); ns_free(request->host); ns_free(request->query); FreeUrl(request); ns_free(request); } }
void Ns_SetRequestUrl(Ns_Request * request, char *url) { Ns_DString ds; Ns_MutexLock(&reqlock); FreeUrl(request); Ns_DStringInit(&ds); Ns_DStringAppend(&ds, url); SetUrl(request, ds.string, NULL); Ns_MutexUnlock(&reqlock); Ns_DStringFree(&ds); }
/* ** Resolve a sequence of URLs. Return the result in space obtained ** from malloc(). */ char *ResolveUrl( char *zBase, /* The base URL */ const char **azSeries /* A list of relatives. NULL terminated */ ){ Url *base; Url *term; char *z; base = ParseUrl(zBase); while( azSeries[0] ){ term = ParseUrl(azSeries[0]); azSeries++; if( term->zScheme==0 && term->zAuthority==0 && term->zPath==0 && term->zQuery==0 && term->zFragment ){ ReplaceStr(&base->zFragment, term->zFragment); }else if( term->zScheme ){ Url temp; temp = *term; *term = *base; *base = temp; }else if( term->zAuthority ){ ReplaceStr(&base->zAuthority, term->zAuthority); ReplaceStr(&base->zPath, term->zPath); ReplaceStr(&base->zQuery, term->zQuery); ReplaceStr(&base->zFragment, term->zFragment); }else if( term->zPath && term->zPath[0]=='/' ){ ReplaceStr(&base->zPath, term->zPath); ReplaceStr(&base->zQuery, term->zQuery); ReplaceStr(&base->zFragment, term->zFragment); }else if( term->zPath && base->zPath ){ char *zBuf; int i, j; zBuf = malloc( strlen(base->zPath) + strlen(term->zPath) + 2 ); if( zBuf ){ sprintf(zBuf,"%s", base->zPath); for(i=strlen(zBuf)-1; i>=0 && zBuf[i]!='/'; i--){ zBuf[i] = 0; } strcat(zBuf, term->zPath); for(i=0; zBuf[i]; i++){ if( zBuf[i]=='/' && zBuf[i+1]=='.' && zBuf[i+2]=='/' ){ strcpy(&zBuf[i+1], &zBuf[i+3]); i--; continue; } if( zBuf[i]=='/' && zBuf[i+1]=='.' && zBuf[i+2]==0 ){ zBuf[i+1] = 0; continue; } if( i>0 && zBuf[i]=='/' && zBuf[i+1]=='.' && zBuf[i+2]=='.' && (zBuf[i+3]=='/' || zBuf[i+3]==0) ){ for(j=i-1; j>=0 && zBuf[j]!='/'; j--){} if( zBuf[i+3] ){ strcpy(&zBuf[j+1], &zBuf[i+4]); }else{ zBuf[j+1] = 0; } i = j-1; if( i<-1 ) i = -1; continue; } } free(base->zPath); base->zPath = zBuf; } ReplaceStr(&base->zQuery, term->zQuery); ReplaceStr(&base->zFragment, term->zFragment); } FreeUrl(term); } z = BuildUrl(base); FreeUrl(base); return z; }