Logo
~Sockets~
~Examples~
~Contact~


HttpPutSocket.cpp

Go to the documentation of this file.
00001 
00005 /*
00006 Copyright (C) 2004-2007  Anders Hedstrom
00007 
00008 This library is made available under the terms of the GNU GPL.
00009 
00010 If you would like to use this library in a closed-source application,
00011 a separate license agreement is available. For information about 
00012 the closed-source license agreement for the C++ sockets library,
00013 please visit http://www.alhem.net/Sockets/license.html and/or
00014 email license@alhem.net.
00015 
00016 This program is free software; you can redistribute it and/or
00017 modify it under the terms of the GNU General Public License
00018 as published by the Free Software Foundation; either version 2
00019 of the License, or (at your option) any later version.
00020 
00021 This program is distributed in the hope that it will be useful,
00022 but WITHOUT ANY WARRANTY; without even the implied warranty of
00023 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00024 GNU General Public License for more details.
00025 
00026 You should have received a copy of the GNU General Public License
00027 along with this program; if not, write to the Free Software
00028 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00029 */
00030 #ifdef _WIN32
00031 #pragma warning(disable:4786)
00032 #else
00033 #include <errno.h>
00034 #endif
00035 #include "ISocketHandler.h"
00036 #include <sys/types.h>
00037 #include <sys/stat.h>
00038 
00039 #include "Utility.h"
00040 #include "Parse.h"
00041 
00042 #include "HttpPutSocket.h"
00043 
00044 
00045 #ifdef SOCKETS_NAMESPACE
00046 namespace SOCKETS_NAMESPACE {
00047 #endif
00048 
00049 
00050 HttpPutSocket::HttpPutSocket(ISocketHandler& h) : HttpClientSocket(h)
00051 {
00052 }
00053 
00054 
00055 HttpPutSocket::HttpPutSocket(ISocketHandler& h,const std::string& url_in) : HttpClientSocket(h, url_in)
00056 {
00057 }
00058 
00059 
00060 HttpPutSocket::~HttpPutSocket()
00061 {
00062 }
00063 
00064 
00065 void HttpPutSocket::SetFile(const std::string& file)
00066 {
00067         struct stat st;
00068         if (!stat(file.c_str(), &st))
00069         {
00070                 m_filename = file;
00071                 m_content_length = st.st_size;
00072         }
00073         else
00074         {
00075                 Handler().LogError(this, "SetFile", Errno, StrError(Errno), LOG_LEVEL_FATAL);
00076                 SetCloseAndDelete();
00077         }
00078 }
00079 
00080 
00081 void HttpPutSocket::SetContentType(const std::string& type)
00082 {
00083         m_content_type = type;
00084 }
00085 
00086 
00087 
00088 void HttpPutSocket::Open()
00089 {
00090         // why do I have to specify TcpSocket:: to get to the Open() method??
00091         TcpSocket::Open(GetUrlHost(), GetUrlPort());
00092 }
00093 
00094 
00095 void HttpPutSocket::OnConnect()
00096 {
00097         SetMethod( "PUT" );
00098         SetHttpVersion( "HTTP/1.1" );
00099         AddResponseHeader( "Host", GetUrlHost() );
00100         AddResponseHeader( "Content-type", m_content_type );
00101         AddResponseHeader( "Content-length", Utility::l2string(m_content_length) );
00102         AddResponseHeader( "User-agent", MyUseragent() );
00103         SendRequest();
00104 
00105         FILE *fil = fopen(m_filename.c_str(), "rb");
00106         if (fil)
00107         {
00108                 size_t n;
00109                 char buf[32768];
00110                 while ((n = fread(buf, 1, 32768, fil)) > 0)
00111                 {
00112                         SendBuf(buf, n);
00113                 }
00114                 fclose(fil);
00115         }
00116 }
00117 
00118 
00119 #ifdef SOCKETS_NAMESPACE
00120 }
00121 #endif
00122 
Page, code, and content Copyright (C) 2007 by Anders Hedström
Generated for C++ Sockets by  doxygen 1.4.4