Exemple #1
0
void decideAboutHowToHandleRequestedResource
            (
              struct AmmServer_Instance * instance,
              struct HTTPTransaction * transaction,
              char * servefile,
              int * resource_is_a_directory,
              int * resource_is_a_file ,
              int * resource_is_a_template ,
              int * generate_directory_list
            )
{
      *resource_is_a_template=0;

      // STEP 0 : Is the resource an obvious directory , or obvious file ? Check for it..!
      if ( isResourceADirectory(transaction->incomingHeader.resource , strlen(transaction->incomingHeader.resource) ) )
      {
          *resource_is_a_directory=1;
      }

      strncpy(servefile,transaction->incomingHeader.verified_local_resource,MAX_FILE_PATH);
      //servefile variable now contains just the verified_local_resource as generated by http_header_analysis.c
      //we have checked transaction->incomingHeader.verified_local_resource for .. , weird ascii characters etc, so it should be safe for usage from now on..!

      //There are some virtual files we want to re-route to their real path..!
      if (cache_ChangeRequestIfTemplateRequested(instance,servefile,MAX_FILE_PATH/*,instance->templates_root*/) )
      { //Skip disk access times for checking for directories and other stuff..!
        //We know that the resource is a file from our cache indexes..!
          *resource_is_a_directory=0;
          *resource_is_a_file=1;
          *resource_is_a_template=1;
      }


      //STEP 0 : Check with cache!
      if (cache_ResourceExists(instance,servefile,&transaction->resourceCacheID) )
      { //Skip disk access times for checking for directories and other stuff..!
        //We know that the resource is a file from our cache indexes..!
        //Bonus points we now have the index id of the cached instance of the file for future use..
          *resource_is_a_directory=0;
          *resource_is_a_file=1;
      } else
      {//Start of file not in cache scenario
      // STEP 1 : If we can't obviously determine if the request is a directory ,  lets check on disk to find out if it is a directory after all..!
      if (!*resource_is_a_directory)
       {
         if (DirectoryExistsAmmServ(servefile))
         {
           *resource_is_a_directory=1;

           //If the resource had an  / in the string end we would have already come to the conclusion that this was a directory
           // so lets append the slash now on the request to help the code that follows work as intended
           strcat(transaction->incomingHeader.resource,"/");
           strcat(servefile,"/");
           fprintf(stderr,"TODO: this path is a little problematic because the web browser on the client will think\n");
           fprintf(stderr,"that we are on the / directory , a location field in the response header will clarify things\n");
         }
       }

      // STEP 2 : If we are sure that we dont have a directory then we have to find out accessing disk , could it be that our client wants a file ?
      if ( (!*resource_is_a_directory) && (FileExistsAmmServ(servefile)) )
       {
           *resource_is_a_file=1;
       }

      // STEP 3 : If after these steps the resource turned out to be a directory , we cant serve raw directories , so we will either look for an index.html
      // and if an index file cannot be found we will generate a directory list and send that instead..!
      if (*resource_is_a_directory)
           {
             // *resource_is_a_directory means we got something like directory1/directory2/ so we should check for index file at the path given..!
             if ( FindIndexFile(instance,instance->webserver_root,transaction->incomingHeader.resource,servefile,MAX_FILE_PATH) )
                {
                   /*servefile should contain a valid index file ,
                     lets make it look like it was a file we wanted all along :P! */
                   *resource_is_a_directory=0;
                   *resource_is_a_file=1;
                } else
                {
                 *generate_directory_list=1;
                }
           }
      } //End of file not in cache scenario
}
Exemple #2
0
int AmmServer_DirectoryExists(const char * filename)
{
 return DirectoryExistsAmmServ(filename);
}