myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [2926] Code refactoring: added `File::fastCopyToSocket


From: Giuseppe Scrivano
Subject: [myserver-commit] [2926] Code refactoring: added `File::fastCopyToSocket()' function.
Date: Sat, 01 Nov 2008 18:41:03 +0000

Revision: 2926
          http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=2926
Author:   gscrivano
Date:     2008-11-01 18:41:03 +0000 (Sat, 01 Nov 2008)

Log Message:
-----------
Code refactoring: added `File::fastCopyToSocket()' function.

Modified Paths:
--------------
    trunk/myserver/include/base/file/file.h
    trunk/myserver/include/base/files_cache/cached_file.h
    trunk/myserver/include/protocol/http/http_thread_context.h
    trunk/myserver/src/base/file/file.cpp
    trunk/myserver/src/base/files_cache/cached_file.cpp
    trunk/myserver/src/http_handler/cgi/cgi.cpp
    trunk/myserver/src/http_handler/fastcgi/fastcgi.cpp
    trunk/myserver/src/http_handler/http_dir/http_dir.cpp
    trunk/myserver/src/http_handler/http_file/http_file.cpp
    trunk/myserver/src/http_handler/isapi/isapi.cpp
    trunk/myserver/src/http_handler/mscgi/mscgi.cpp
    trunk/myserver/src/http_handler/scgi/scgi.cpp
    trunk/myserver/src/http_handler/wincgi/wincgi.cpp
    trunk/myserver/src/protocol/http/http.cpp

Modified: trunk/myserver/include/base/file/file.h
===================================================================
--- trunk/myserver/include/base/file/file.h     2008-10-30 20:39:49 UTC (rev 
2925)
+++ trunk/myserver/include/base/file/file.h     2008-11-01 18:41:03 UTC (rev 
2926)
@@ -23,6 +23,9 @@
 #include <include/filter/stream.h>
 #include <string>
 
+#include <include/base/socket/socket.h>
+#include <include/base/mem_buff/mem_buff.h>
+
 using namespace std;
 
 class File : public Stream
@@ -66,6 +69,9 @@
   /*! Inherithed from Stream. */
   virtual int read(char* buffer, u_long len, u_long *nbr);
   virtual int write(const char* buffer, u_long len, u_long *nbw);
+
+  virtual int fastCopyToSocket (Socket *dest, u_long offset, 
+                                MemBuf *buf, u_long *nbw);
 protected:
        FileHandle handle;
        string filename;

Modified: trunk/myserver/include/base/files_cache/cached_file.h
===================================================================
--- trunk/myserver/include/base/files_cache/cached_file.h       2008-10-30 
20:39:49 UTC (rev 2925)
+++ trunk/myserver/include/base/files_cache/cached_file.h       2008-11-01 
18:41:03 UTC (rev 2926)
@@ -47,7 +47,9 @@
        virtual int operator =(CachedFile);
        virtual int close();
 
-  /*! Inherithed from Stream. */
+  virtual int fastCopyToSocket (Socket *dest, u_long offset, 
+                                MemBuf *buf, u_long *nbw);
+
   virtual int write(const char* buffer, u_long len, u_long *nbw);
 protected:
        u_long fseek;

Modified: trunk/myserver/include/protocol/http/http_thread_context.h
===================================================================
--- trunk/myserver/include/protocol/http/http_thread_context.h  2008-10-30 
20:39:49 UTC (rev 2925)
+++ trunk/myserver/include/protocol/http/http_thread_context.h  2008-11-01 
18:41:03 UTC (rev 2926)
@@ -85,6 +85,7 @@
        MimeRecord *mime;
        int sentData;
   SecurityToken securityToken;
+  int permissions;
 
        const char* getVhostDir();
        const char* getVhostSys();

Modified: trunk/myserver/src/base/file/file.cpp
===================================================================
--- trunk/myserver/src/base/file/file.cpp       2008-10-30 20:39:49 UTC (rev 
2925)
+++ trunk/myserver/src/base/file/file.cpp       2008-11-01 18:41:03 UTC (rev 
2926)
@@ -34,6 +34,18 @@
 #include <string.h>
 #include <math.h>
 #include <time.h>
+
+#ifdef SENDFILE
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/sendfile.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+
 }
 #endif
 
@@ -159,7 +171,7 @@
   else/*! Open the file. */
   {
     if(opt & File::MYSERVER_OPEN_APPEND)
-      ret = setFilePointer(getFileSize());
+      ret = setFilePointer(getFileSize ());
     else
       ret = setFilePointer(0);
       if(ret)
@@ -453,3 +465,51 @@
   return (ret == -1) ;
 #endif
 }
+
+/*!
+ *Copy the file directly to the socket.
+ *\param dest Destination socket.
+ *\param firstByte File offset.
+ *\param buf Temporary buffer that can be used by this function.
+ *\param nbw Number of bytes sent.
+ */
+int File::fastCopyToSocket (Socket *dest, u_long firstByte, MemBuf *buf, 
u_long *nbw)
+{
+#ifdef SENDFILE
+  off_t offset = firstByte;
+  int ret = sendfile (dest->getHandle(), 
+                      getHandle(), &offset, getFileSize () - firstByte);
+
+  if (ret < 0)
+    return ret;
+
+  *nbw = ret;
+  return 0;
+#else
+  const char *buffer = buf->getBuffer ();
+  u_long size = buf->getRealSize ();
+  *nbw = 0;
+
+       if (setFilePointer (firstByte))
+    return 0;
+
+  for (;;)
+  {
+    u_long nbr;
+    u_long tmpNbw;
+
+    if (read (buffer, size, &nbr))
+      return -1;
+
+    if (nbr == 0)
+      break;
+
+    if (dest->write (buffer, nbr, tmpNbw))
+      return -1;
+
+    *nbw += tmpNbw;
+  }
+ 
+  return 0;
+#endif
+}

Modified: trunk/myserver/src/base/files_cache/cached_file.cpp
===================================================================
--- trunk/myserver/src/base/files_cache/cached_file.cpp 2008-10-30 20:39:49 UTC 
(rev 2925)
+++ trunk/myserver/src/base/files_cache/cached_file.cpp 2008-11-01 18:41:03 UTC 
(rev 2926)
@@ -191,3 +191,17 @@
 {
   return -1;
 }
+
+/*!
+ *Copy the file directly to the socket.
+ *\param dest Destination socket.
+ *\param firstByte File offset.
+ *\param buf Temporary buffer that can be used by this function.
+ *\param nbw Number of bytes sent.
+ */
+int CachedFile::fastCopyToSocket (Socket *dest, u_long firstByte, 
+                                  MemBuf *buf, u_long *nbw)
+{
+  return dest->write (&(this->buffer->getBuffer()[firstByte]), 
+                      buffer->getFileSize() - firstByte, nbw);
+}

Modified: trunk/myserver/src/http_handler/cgi/cgi.cpp
===================================================================
--- trunk/myserver/src/http_handler/cgi/cgi.cpp 2008-10-30 20:39:49 UTC (rev 
2925)
+++ trunk/myserver/src/http_handler/cgi/cgi.cpp 2008-11-01 18:41:03 UTC (rev 
2926)
@@ -86,6 +86,9 @@
   int len = strlen (cgipath);
   int i;
 
+  if (!(td->permissions & MYSERVER_PERMISSION_EXECUTE))
+    return td->http->sendAuth();
+
   td->scriptPath.assign (scriptpath);
   
   

Modified: trunk/myserver/src/http_handler/fastcgi/fastcgi.cpp
===================================================================
--- trunk/myserver/src/http_handler/fastcgi/fastcgi.cpp 2008-10-30 20:39:49 UTC 
(rev 2925)
+++ trunk/myserver/src/http_handler/fastcgi/fastcgi.cpp 2008-11-01 18:41:03 UTC 
(rev 2926)
@@ -85,6 +85,11 @@
 
   td->scriptPath.assign(scriptpath);
 
+
+  if (!(td->permissions & MYSERVER_PERMISSION_EXECUTE))
+    return td->http->sendAuth();
+
+
   {
     string tmp;
     tmp.assign(cgipath);

Modified: trunk/myserver/src/http_handler/http_dir/http_dir.cpp
===================================================================
--- trunk/myserver/src/http_handler/http_dir/http_dir.cpp       2008-10-30 
20:39:49 UTC (rev 2925)
+++ trunk/myserver/src/http_handler/http_dir/http_dir.cpp       2008-11-01 
18:41:03 UTC (rev 2926)
@@ -321,6 +321,10 @@
   chain.setProtocol(td->http);
   chain.setProtocolData(td);
   chain.setStream(td->connection->socket);
+
+  if ( !(td->permissions & MYSERVER_PERMISSION_BROWSE))
+    return td->http->sendAuth ();
+
   if(td->mime && Server::getInstance()->getFiltersFactory()->chain(&chain, 
                                                         td->mime->filters, 
                                              td->connection->socket, &nbw, 1))

Modified: trunk/myserver/src/http_handler/http_file/http_file.cpp
===================================================================
--- trunk/myserver/src/http_handler/http_file/http_file.cpp     2008-10-30 
20:39:49 UTC (rev 2925)
+++ trunk/myserver/src/http_handler/http_file/http_file.cpp     2008-11-01 
18:41:03 UTC (rev 2926)
@@ -37,16 +37,7 @@
 #ifdef NOT_WIN
 #include <string.h>
 #include <errno.h>
-#ifdef SENDFILE
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/sendfile.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
 #endif
-#endif
 }
 
 /*!
@@ -90,6 +81,9 @@
   try
   {
 
+    if ( !(td->permissions & MYSERVER_PERMISSION_READ))
+      return td->http->sendAuth ();
+
     if (!FilesUtility::fileExists (filenamePath))
       return td->http->raiseHTTPError(404);
 
@@ -323,6 +317,7 @@
  
     HttpHeaders::buildHTTPResponseHeader(td->buffer->getBuffer(), 
                                          &td->response);
+
     td->buffer->setLength((u_long)strlen(td->buffer->getBuffer()));
     if(!td->appendOutputs)
     {
@@ -349,30 +344,26 @@
       return 0;
     }
 
-#ifdef SENDFILE
     /* 
      * Check if there are all the conditions to use a direct copy from the 
-     * file to the socket.  The sendfile syscall copy from a descriptor to
-     * another directly in the kernel space without performs an extra copy
-     * to an userspace buffer.
+     * file to the socket.
      */
     if(!useChunks && chain.isEmpty() && 
-       !td->appendOutputs && (file->getHandle() != -1) && 
+       !td->appendOutputs &&
        !(td->http->getProtocolOptions() & PROTOCOL_USES_SSL))
     {
-      off_t offset = firstByte;
-      ret = sendfile(s->socket->getHandle(), file->getHandle(),
-                     &offset, bytesToSend);
+      u_long nbw = 0;
+      int ret = file->fastCopyToSocket (s->socket, firstByte, td->buffer, 
&nbw);
+
       file->close();
       delete file;
+
       chain.clearAllFilters();
 
-      /* For logging activity.  */
-      td->sentData += ret;
+      td->sentData += nbw;
 
-      return 0;
+      return ret;
     }
-#endif
 
     if(td->appendOutputs)
       chain.setStream(&(td->outputData));

Modified: trunk/myserver/src/http_handler/isapi/isapi.cpp
===================================================================
--- trunk/myserver/src/http_handler/isapi/isapi.cpp     2008-10-30 20:39:49 UTC 
(rev 2925)
+++ trunk/myserver/src/http_handler/isapi/isapi.cpp     2008-11-01 18:41:03 UTC 
(rev 2926)
@@ -65,7 +65,7 @@
     return 0;
   }
 
-   switch (dwHSERRequest) 
+  switch (dwHSERRequest) 
   {
     case HSE_REQ_MAP_URL_TO_PATH_EX:
       HSE_URL_MAPEX_INFO  *mapInfo;
@@ -776,6 +776,7 @@
   int retvalue = 0;
   /*! Under windows there is MAX_PATH then we can use it. */
   char fullpath[MAX_PATH * 2];
+
   if(!execute)
   {
     if(cgipath && strlen(cgipath))
@@ -788,8 +789,11 @@
     sprintf(fullpath, "%s", cgipath);
   }
 
-    td->inputData.setFilePointer(0);
+  if (!(td->permissions & MYSERVER_PERMISSION_EXECUTE))
+    return td->http->sendAuth();
 
+  td->inputData.setFilePointer(0);
+
   EnterCriticalSection(&GetTableEntryCritSec);
   connIndex = 0;
   Isapi::isapiMutex->lock();

Modified: trunk/myserver/src/http_handler/mscgi/mscgi.cpp
===================================================================
--- trunk/myserver/src/http_handler/mscgi/mscgi.cpp     2008-10-30 20:39:49 UTC 
(rev 2925)
+++ trunk/myserver/src/http_handler/mscgi/mscgi.cpp     2008-11-01 18:41:03 UTC 
(rev 2926)
@@ -86,8 +86,11 @@
   data.keepAlive = false;
   data.useChunks = false;
 
-   td->scriptPath.assign(exec);
+  if (!(td->permissions & MYSERVER_PERMISSION_EXECUTE))
+    return td->http->sendAuth();
 
+  td->scriptPath.assign(exec);
+
   {
     string tmp;
     tmp.assign(exec);

Modified: trunk/myserver/src/http_handler/scgi/scgi.cpp
===================================================================
--- trunk/myserver/src/http_handler/scgi/scgi.cpp       2008-10-30 20:39:49 UTC 
(rev 2925)
+++ trunk/myserver/src/http_handler/scgi/scgi.cpp       2008-11-01 18:41:03 UTC 
(rev 2926)
@@ -61,6 +61,9 @@
 
   td->scriptPath.assign(scriptpath);
 
+  if (!(td->permissions & MYSERVER_PERMISSION_EXECUTE))
+    return td->http->sendAuth();
+
   {
     string tmp;
     tmp.assign(cgipath);

Modified: trunk/myserver/src/http_handler/wincgi/wincgi.cpp
===================================================================
--- trunk/myserver/src/http_handler/wincgi/wincgi.cpp   2008-10-30 20:39:49 UTC 
(rev 2925)
+++ trunk/myserver/src/http_handler/wincgi/wincgi.cpp   2008-11-01 18:41:03 UTC 
(rev 2926)
@@ -106,6 +106,9 @@
   u_long nbw = 0;
   ostringstream stream;
 
+  if (!(td->permissions & MYSERVER_PERMISSION_EXECUTE))
+    return td->http->sendAuth();
+
   if(!FilesUtility::fileExists(scriptpath))
     return td->http->raiseHTTPError(404);
 

Modified: trunk/myserver/src/protocol/http/http.cpp
===================================================================
--- trunk/myserver/src/protocol/http/http.cpp   2008-10-30 20:39:49 UTC (rev 
2925)
+++ trunk/myserver/src/protocol/http/http.cpp   2008-11-01 18:41:03 UTC (rev 
2926)
@@ -795,7 +795,6 @@
    *that we must send over the HTTP.
    */
   string filename;
-  int permissions;
   const char *cgiManager;
   int mimecmd;
   int ret;
@@ -804,7 +803,7 @@
   HttpDataHandler *manager;
 
   /*! By default allows only few actions. */
-  permissions = MYSERVER_PERMISSION_READ | MYSERVER_PERMISSION_BROWSE ;
+  td->permissions = MYSERVER_PERMISSION_READ | MYSERVER_PERMISSION_BROWSE ;
 
   try
   {
@@ -816,12 +815,12 @@
       td->filenamePath.assign(uri);
 
       getFilePermissions(filename, directory, file, 
-                         td->filenamePath, 1, &permissions);
+                         td->filenamePath, 1, &td->permissions);
 
     }
     else
     {
-      ret = Http::preprocessHttpRequest(filename, yetmapped, &permissions);
+      ret = Http::preprocessHttpRequest(filename, yetmapped, &td->permissions);
 
       if(ret != 200)
         return raiseHTTPError(ret);
@@ -829,7 +828,7 @@
 
     if(!td->mime && FilesUtility::isDirectory(td->filenamePath.c_str()))
     {
-      return processDefaultFile (uri, permissions, onlyHeader);
+      return processDefaultFile (uri, td->permissions, onlyHeader);
     }
 
     td->response.contentType[0] = '\0';
@@ -851,9 +850,6 @@
     {
       if (manager)
       {
-        if (!(permissions & MYSERVER_PERMISSION_EXECUTE))
-            return sendAuth();
-
         return manager->send (td,
                               td->connection,
                               td->filenamePath.c_str(),
@@ -864,7 +860,7 @@
     }
 
 
-    if (!(permissions & MYSERVER_PERMISSION_READ))
+    if (!(td->permissions & MYSERVER_PERMISSION_READ))
       return sendAuth ();
 
     manager = staticHttp.dynManagerList.getHttpManager ("FILE");
@@ -1908,9 +1904,6 @@
         }
     }
 
-  if( !(permissions & MYSERVER_PERMISSION_BROWSE) )
-      return sendAuth();
-
   HttpDataHandler *handler = staticHttp.dynManagerList.getHttpManager ("DIR");
 
   if (!handler)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]