When I try to run server.c
, it's returning the 505 error, which is very confusing to me. I built the code separating everything out in a separate .c
file to make sure everything works correctly, and I used a couple test request-lines, and those spit out the correct HTTP version HTTP/1.1
without any trouble, but now I'm seeing this error.
For completeness, here is all of my code from validate request-line
to extract path's extension
just in case there is a glaring error somewhere else:
//validate request-line
//check if request-line matches template, else return error(400)
if(strchr(line, ' ') == NULL)
printf("error(400)");
//future indexes of spaces inside line[]
int spaceOne = 0;
int spaceTwo = 0;
int clfloc = 0;
//find index of first space
while(line[spaceOne] != ' ')
{
spaceOne++;
}
spaceTwo = spaceOne + 1;
//find index of second space
while(line[spaceTwo] != ' ')
{
spaceTwo++;
}
clfloc = spaceTwo + 1;
//find index of CRLF
while(line[clfloc] != '\r')
{
clfloc++;
}
//separate out method
int metLen = (spaceOne + 1);
char method[metLen];
for(int i = 0; i < spaceOne; i++)
{
method[i] = line[i];
}
method[metLen - 1] = '\0';
//separate out request-target
int rTarLen = (spaceTwo - spaceOne);
char requestTarget[rTarLen];
//separate counter variable to initialize to zero
int count = spaceOne + 1;
for(int i = 0; i < rTarLen; i++)
{
requestTarget[i] = line[count];
count++;
}
requestTarget[rTarLen - 1] = '\0';
//separate out HTTP-version
int HTTPvLen = (clfloc - spaceTwo) + 1;
char HTTPv[HTTPvLen];
count = 0;
for(int i =spaceTwo + 1; i < clfloc; i++)
{
HTTPv[count] = line[i];
count++;
}
HTTPv[HTTPvLen - 2] = '\r';
HTTPv[HTTPvLen - 1] = '\0';
//separate out absolute-path
int sSqBr = 0;
if(strstr(line, "[") != NULL)
{
while(requestTarget[sSqBr] != '[')
{
sSqBr++;
}
}
else
sSqBr = strlen(requestTarget);
int abPathLen = sSqBr + 1;
char abPath[abPathLen];
for(int i = 0; i < sSqBr; i++)
{
abPath[i] = requestTarget[i];
}
abPath[abPathLen - 1] = '\0';
//various errors returned
if(method == NULL || strcmp(method, "GET") != 0)
{
error(405);
continue;
}
else if(requestTarget == NULL || requestTarget[0] != '/')
{
error(501);
continue;
}
else if(strstr(HTTPv, "HTTP/1.1") != 0)
{
error(505);
continue;
}
else if(strchr(abPath, '.') == NULL)
{
error(501);
continue;
}
for(int i = 0; i < rTarLen; i++)
{
if(requestTarget[i] == '"')
{
error(400);
continue;
}
}
//extract query from request-target
int eQMrk = sSqBr + 2;
count = eQMrk;
int queryLen = 0;
if(strstr(line, "]") != NULL)
{
while(requestTarget[count] != ']')
{
count++;
queryLen++;
}
queryLen++;
}
else
queryLen = 1;
char query[queryLen];
if(queryLen != 1)
{
count = 0;
for(int i = eQMrk; i < ((eQMrk + queryLen) - 1); i++)
{
query[count] = requestTarget[i];
count++;
}
query[queryLen - 1] = '\0';
}
else
query[0] = '\0';
//concatenate root and absolute-path
char root[5] = {"root\0"};
int pathLen = strlen(root) + strlen(abPath) + 1;
char path[pathLen];
strcpy(path, root);
count = 0;
for(int i = strlen(root); i < pathLen - 1; i++)
{
path[i] = abPath[count];
count++;
}
path[pathLen - 1] = '\0';
//ensure path exists
if(access(path, F_OK) != 0)
error(404);
//ensure path is readable
if(access(path, R_OK) != 0)
error(403);
//extract path's extension
int lPer = strlen(path);
while(path[lPer] != '.')
{
lPer--;
}
int extLen = strlen(path) - lPer;
char extension[extLen];
count=0;
for(int i = lPer+1; i < strlen(path); i++)
{
extension[count] = path[i];
count++;
}
extension[extLen] = '\0';
As always, thank you in advance!!!