00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #include "stdafx.h"
00037 #include "TCPRelayHTTP.h"
00038 
00039 #include "ErrorHandlerMacros.h"
00040 
00041 #ifdef _MEMORY_DEBUG 
00042     #define new    DEBUG_NEW  
00043     #define malloc DEBUG_MALLOC  
00044     static char THIS_FILE[] = __FILE__;  
00045 #endif
00046 
00047 KOMODIA_NAMESPACE_START
00048 
00049 #define CTCPRelayHTTP_Class "CTCPRelayHTTP"
00050 
00051 CTCPRelayHTTP::CTCPRelayHTTP() : CTCPRelay()
00052 {
00053     try
00054     {
00055         
00056         SetName(CTCPRelayHTTP_Class);
00057     }
00058     ERROR_HANDLER("CTCPRelayHTTP")
00059 }
00060 
00061 CTCPRelayHTTP::~CTCPRelayHTTP()
00062 {
00063 }
00064 
00065 BOOL CTCPRelayHTTP::Relay(const std::string& rBindAddress,
00066                           unsigned short usBindPort,
00067                           const std::string& rDestinationAddress,
00068                           unsigned short usDestinationPort)
00069 {
00070     try
00071     {
00072         
00073         return CTCPRelay::Relay(rBindAddress,
00074                                 usBindPort,
00075                                 rDestinationAddress,
00076                                 usDestinationPort);
00077     }
00078     ERROR_HANDLER_RETURN("Relay",FALSE)
00079 }
00080 
00081 BOOL CTCPRelayHTTP::Relay(IP aBindAddress,
00082                           unsigned short usBindPort,
00083                           IP aDestinationAddress,
00084                           unsigned short usDestinationPort)
00085 {
00086     try
00087     {
00088         
00089         if (IsRunning())
00090             return FALSE;
00091 
00092         
00093         m_sBindAddress=CSocketBase::LongToStdString(aBindAddress);
00094         m_sTargetAddress=CSocketBase::LongToStdString(aDestinationAddress);
00095 
00096         
00097         return CTCPRelay::Relay(aBindAddress,
00098                                 usBindPort,
00099                                 aDestinationAddress,
00100                                 usDestinationPort);
00101     }
00102     ERROR_HANDLER_RETURN("Relay",FALSE)
00103 }
00104 
00105 std::string CTCPRelayHTTP::ModifyReceiveString(BOOL bIncoming,
00106                                                const char* pBuffer,
00107                                                unsigned short usBufferSize)const
00108 {
00109     try
00110     {
00111         
00112         if (!bIncoming)
00113             return "";
00114 
00115         
00116         std::string sData;
00117         sData=pBuffer;
00118 
00119         
00120         int iModifyCount;
00121         iModifyCount=0;
00122 
00123         
00124         while (ReplaceString(sData))
00125             ++iModifyCount;
00126 
00127         
00128         if (iModifyCount)
00129             return sData;
00130         else
00131             return "";
00132     }
00133     ERROR_HANDLER_RETURN("ModifyReceiveString","")
00134 }
00135 
00136 BOOL CTCPRelayHTTP::ReplaceString(std::string& rString)const
00137 {
00138     try
00139     {
00140         
00141         std::string::size_type aPos;
00142         aPos=rString.find(m_sBindAddress,
00143                           0);
00144 
00145         
00146         if (aPos!=std::string::npos)
00147         {
00148             std::string sNewString;
00149             sNewString.reserve(rString.size()+30);
00150 
00151             
00152             sNewString=rString.substr(0,
00153                                       aPos);
00154 
00155             
00156             sNewString+=m_sTargetAddress;
00157 
00158             
00159             sNewString+=rString.substr(aPos+
00160                                        m_sBindAddress.length(),
00161                                        rString.length()-
00162                                        aPos-
00163                                        m_sBindAddress.length());
00164 
00165             
00166             rString.swap(sNewString);
00167 
00168             
00169             return TRUE;
00170         }
00171         else
00172             return FALSE;
00173     }
00174     ERROR_HANDLER_RETURN("ReplaceString",FALSE)
00175 }
00176 
00177 KOMODIA_NAMESPACE_END