Below are my parse() and lookup() functions for server.c pset6. I have gone over and over but maybe I didn't understand what lookup does. Any help is highly welcome and appreciated. My check50 for server2 is all red while that for server1 is red only at the request for non existant file. Hope I am clear enough for good help. Thank you.
const char* lookup(const char* path) { // TODO if(path == NULL) { error(404); }
else
{
{
for( int i = 0, n = strlen(path); i <= n; i++)
{
char * ext = 0;
char c = '.';
ext = strchr (path, c);
int k = atoi(ext);
if(strcmp(".css",ext) == 0)
k = 0;
if(strcmp(".html",ext) == 0)
k = 1;
if(strcmp(".gif",ext) == 0)
k = 2;
if(strcmp(".ico",ext) == 0)
k = 3;
if(strcmp(".jpg",ext) == 0)
k = 4;
if(strcmp(".jv",ext) == 0)
k = 5;
if(strcmp(".png",ext) == 0)
k = 6;
switch(k)
{
case 0: return "text/css";
case 1: return "text/html";
case 2: return "image/gif";
case 3: return "image/x-icon";
case 4: return "image/jpeg";
case 5: return "text/javascript";
case 6: return "image/png";
default: return NULL;
}
}
}
}
return NULL;
}
and here is parse
bool parse(const char* line, char* abs_path, char* query) { // TODO
if(line[0] == 0)
{
error(404);
}
// declaring delimiters for future call to strtok().
const char * space = " ";
const char * marker = "?";
// generates modifiable string from const char* line.
int l = strlen(line);
char string[l + 1];
for(int i = 0; i <= l; i++)
{
string[i] = line[i];
string[l] = '\0';
}
// creating tokens from string for method, target and version.
char * method = strtok(string, space);
char * target = strtok(NULL, space);
char * version = strtok(NULL, space);
// creating copy of target, storing it in duplicate.
int n = strlen(target);
char duplicate[n + 1];
for (int a = 0; a <= n; a++)
{
duplicate[a] = target[a];
duplicate[n] = '\0';
if(duplicate[0] == 0)
{
error(404);
}
}
// generating abs_path and query from target.
abs_path = strtok(duplicate, marker);
query = strtok(NULL, marker);
// ensure method is "GET"
if(strcmp(method, "GET") != 0)
{
error(405);
}
// ensures request-target starts with '/' and has no '"'.
for(int j = 0; j <= n; j++)
{
if(target[0] != '/')
{
error(501);
}
if(target[j] == '"')
{
error(400);
}
if(!target)
{
error(400);
}
}
// ensures abs_path has a '.'
if(strchr(abs_path, '.') == NULL)
{
error(501);
}
// ensures version is "HTTP/1.1".
if(strncmp(version, "HTTP/1.1", 8) != 0)
{
error(505);
}
error(501);
return false;
}