I have made done parse and lookup, and the result for check50 after completing these two functions gives 2 fails in getting cat.exe and a non-existant file. The error for both is
\ expected output, but not "HTTP/1.1 301 Moved Permanently\r\nLocat..."
After many trials, I have searched online to find some posts here that talk about abs_path not being terminated properly when using strncpy(). I think I have terminated it as needed, but the two red errors are still there unchanged. I hope for any hint.
lookup
const char* lookup(const char* path) {
char * ext = strchr(path,'.');
if (strcasestr(ext,".css") != NULL)
return "txt/css";
else if(strcasestr(ext,".html") != NULL)
return "txt/html";
else if(strcasestr(ext, ".gif") != NULL)
return "image/gif";
else if(strcasestr(ext, ".ico") != NULL)
return "image/x-ico";
else if(strcasestr(ext, ".jpg") != NULL)
return "image/jpeg";
else if(strcasestr(ext,".js") != NULL)
return "text/javascript";
else if(strcasestr(ext,".php") != NULL)
return "text/x-php";
else if(strcasestr(ext, ".png") != NULL)
return "image/png";
else
return NULL;
}
parse
bool parse(const char* line, char* abs_path, char* query)
{
// TODO
int i = 0, spaceReg = 0, indxSecSpc = 0, indxFirstSpc;
int j = 0;
size_t sizeOfReq = strlen(line);
int sizeOfReqInt = sizeOfReq;
bool flagQ = true;
char * method;
char * request_target = calloc(sizeOfReq,sizeof(char));
method = "GET ";
char * request_targetL = calloc(sizeOfReq,sizeof(char));
/*Start of Operation*/
if(strstr(line,method) == NULL || line[0] !='G'){
error(405);
return false;
}
for(i = 0; i <sizeOfReq; i++) {
if (line[i] == ' ') {
spaceReg++;
if(spaceReg == 1)
indxFirstSpc = i;
else if(spaceReg == 2)
indxSecSpc = i;
}
}
if (spaceReg > 2) {
error(400);
return false;
}
else if (spaceReg < 2) {
return false;
}
else if(line[sizeOfReq-1] != '\n' && line[sizeOfReq-2] != '\r') {
return false;
}
else if(line[indxFirstSpc+1] != '/') {
error(501);
return false;
}
else {
int indxReqTar = indxFirstSpc+1;
size_t reqTarSize = indxSecSpc-indxReqTar;
request_targetL = strchr(line,'/');
strncpy(request_target,request_targetL,reqTarSize);
j = 0;
flagQ = true;
if(strchr(request_target,'"') != NULL) {
error(400);
return false;
}
/*Store query*/
bool flagV = true;
j =0;
int indxOfQuery = 0;
if(strstr(request_target,"q=") == NULL) {
query[0]='\0';
}
else {
while(flagV){
if(request_target[j] == '=') {
indxOfQuery = j-1;
flagV = false;
}
j++;
}
size_t absPathSize = indxOfQuery - indxFirstSpc-1;
strncpy(abs_path,request_target,absPathSize);
abs_path[absPathSize+1] = '\0';
free(request_target);
query = strstr(request_target,"q=");
query[LimitRequestLine + 1] = '\0';
}
j=0;
flagV = true;
int indxHTTPver = indxSecSpc+1;
char * httpVer = calloc(sizeOfReq,sizeof(char));
while(flagV) {
httpVer[j] = line[indxHTTPver+j];
j++;
if (indxHTTPver+j == sizeOfReqInt)
flagV=false;
}
if(strcasestr(httpVer,"HTTP/1.1") == NULL ) {
error(505);
free(httpVer);
return false;
}
}
free(request_target);
return true;
}