[Top][All Lists]
[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [myserver-commit] [2926] Code refactoring: added `File::fastCopyToSocket()' function.,
Giuseppe Scrivano <=