00001 #ifndef __WEBBUFFEREDREADER_GM_H__
00002 #define __WEBBUFFEREDREADER_GM_H__
00003
00004
00005 #include <string>
00006 #include "strtargetbuffer.h"
00007 #include "ringbuffer_slide.h"
00008 #include "application_log.h"
00009
00010
00011 class Http_BufferedReader : protected RingBuffer_Slide
00012 {
00013 inline bool GetTermedString(char * outdata, size_t maxlen,char termchar1, char termchar2);
00014 inline bool GetDoubleTermedString(char * outdata, int maxlen,char termchar1, char termchar2);
00015 inline bool GetTermedStringInPLace(char ** outdata,char termchars);
00016 inline bool GetTermedString(char * outdata, int maxlen,char * termchars);
00017 inline bool GetSizeString(StrTargetBuffer & outdata);
00018 public:
00019 inline Http_BufferedReader(int in_size = 8192) ;
00020
00021
00022
00023 inline void ReSet(void);
00024 inline int PumpCRRead(char * data, int maxdata, Socket_TCP &sck);
00025 inline int PumpHTTPHeaderRead(char * data, int maxdata, Socket_TCP &sck);
00026 inline int PumpSizeRead(StrTargetBuffer & outdata,Socket_TCP &sck);
00027 inline int PumpEofRead(StrTargetBuffer & outdata,Socket_TCP &sck);
00028
00029
00030
00031 template < class SOCK_TYPE>
00032 inline int ReadPump(SOCK_TYPE &sck)
00033 {
00034 int answer = 0;
00035 size_t readsize = BufferAvailabe();
00036
00037 if(readsize < 1)
00038 {
00039 FullCompress();
00040 readsize = BufferAvailabe();
00041 }
00042
00043
00044 if(readsize > 0)
00045 {
00046 char * ff = GetBufferOpen();
00047 int gotbytes = sck.RecvData(ff,(int)readsize);
00048
00049
00050 if(gotbytes < 0)
00051 {
00052 int er = GETERROR();
00053
00054 if(!sck.ErrorIs_WouldBlocking(gotbytes) )
00055 {
00056 answer = -3;
00057 LOGINFO("Http_BufferedReader::ReadPump->Socket Level Read Error %d %d %d %s",er,gotbytes,errno,sck.GetPeerName().get_ip_port().c_str());
00058 }
00059 else
00060 {
00061 answer = 0;
00062 }
00063 }
00064 else if(gotbytes > 0)
00065 {
00066
00067 _EndPos += gotbytes;
00068 answer = 1;
00069 }
00070 else
00071 {
00072 answer = -1;
00073 LOGWARNING("Http_BufferedReader::ReadPump->Other End Closed Normal [%s]",sck.GetPeerName().get_ip_port().c_str());
00074 }
00075 }
00076 else
00077 {
00078 std::string addstr = sck.GetPeerName().get_ip_port();
00079 LOGWARNING("Http_BufferedReader::ReadPump->** Very Important** No Internal buffer left for read[%s] BufferSIze=[%d][%d]",
00080 addstr.c_str(),
00081 AmountBuffered(),
00082 BufferAvailabe()
00083 );
00084
00085 answer = -2;
00086 }
00087 return answer;
00088 }
00089
00090 };
00091
00092 #include "http_bufferedreader.i"
00093
00094 #endif //__BUFFEREDREADER_GM_H__
00095
00096