int Service_Request(int conn) { struct ReqInfo reqinfo; int resource = 0; InitReqInfo(&reqinfo); /* Get HTTP request */ if ( Get_Request(conn, &reqinfo) < 0 ) return -1; /* Check whether resource exists, whether we have permission to access it, and update status code accordingly. */ if ( reqinfo.status == 200 ) if ( (resource = Check_Resource(&reqinfo)) < 0 ) { if ( errno == EACCES ) reqinfo.status = 401; else reqinfo.status = 404; } /* Output HTTP response headers if we have a full request */ if ( reqinfo.type == FULL ) Output_HTTP_Headers(conn, &reqinfo); /* Service the HTTP request */ if ( reqinfo.status == 200 ) { if ( Return_Resource(conn, resource, &reqinfo) ) Error_Quit("Something wrong returning resource."); } else Return_Error_Msg(conn, &reqinfo); if ( resource > 0 ) if ( close(resource) < 0 ) Error_Quit("Error closing resource."); FreeReqInfo(&reqinfo); return 0; }
void *Service_Request(void *f) { int conn = (intptr_t)f; FILE *resource; struct ReqInfo reqinfo; InitReqInfo(&reqinfo); /* Get HTTP request */ if ( Get_Request(conn, &reqinfo) < 0 ) printf("error"); //return -1; if (reqinfo.method == POST){ handlePost(conn,&reqinfo); } if (strlen(reqinfo.resource) == 1) sprintf(reqinfo.resource,"/index.html"); /* Check whether resource exists, whether we have permission to access it, and update status code accordingly. */ if ( reqinfo.status == 200 ){ if ( (resource = Check_Resource(&reqinfo)) < 0 ) { if ( errno == EACCES ) reqinfo.status = 401; else reqinfo.status = 404; } } /* Output HTTP response headers if we have a full request */ if ( reqinfo.type == FULL ) Output_HTTP_Headers(conn, &reqinfo); /* Service the HTTP request */ if ( reqinfo.status == 200 ) { if ( Return_Resource(conn, resource, &reqinfo) ) syslog(LOG_NOTICE,"Something wrong returning resource."); } else Return_Error_Msg(conn, &reqinfo); if ( resource > 0 ) if ( fclose(resource) < 0 ) syslog(LOG_NOTICE,"Error closing resource."); FreeReqInfo(&reqinfo); close(conn); }