This is a multi-part message in MIME format. --------------000002000307000206070604 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit I'm sending my "very-basic" class for a Web Client, in C++ under Visual C++ 6 I use it for example to update my DynDNS account (yes, the router can do it all by itself but.. I like to use mine :) ) and to retrieve connection status from the router. Hope it helps. it can be used like this: CWebCliSocket wc("Joshua 2.4"); char myBuf[35000],myBuf2[100]; CString srv=_T("finanza.repubblica.it"),s,s2; if(wc.Connect(srv)) { s=_T("/scripts/cligipsw.dll?app=KWF&tpl=kwfinanza%5Cscheda_titolo.tpl&isin="); s+="pippo"; s2=wc.buildQuery(srv,s); // user=_T("user"); pasw=_T("pasw"); // wc.authorize(user,pasw); s2=wc.m_HTTPHeader->GetBuffer(); // togliere, xche' addHeader va gestita... i=wc.sendQuery((LPCTSTR)s2); // wc.Receive(myBuf,300); // HTTP/1.1 200 OK i=wc.readPage(myBuf,27000); // HTTP/1.1 200 OK myBuf[i]=0; wc.Disconnect(); --------------000002000307000206070604 Content-Type: text/plain; name="webclient.h" Content-Disposition: inline; filename="webclient.h" Content-Transfer-Encoding: 7bit class CWebCliSocket : public CSocketEx { public: enum { NO_PROXY, AUTO_PROXY, ALWAYS_PROXY, PROXY_BASE, PROXY_SOCKS4 }; public: DWORD HTTPVer; CString m_Agent; CHTTPHeader *m_HTTPHeader; protected: int m_ProxyMode; public: BOOL Connect(LPCTSTR,WORD port=IPPORT_HTTP); BOOL Disconnect(); int Send(CString); CString buildQuery(CString, CString ,int m=0,int proxyMode=0); // 0=GET, 1=PUT int sendQuery(CString ); void addHeader(int,const char *,const char *s2=NULL,CTime t1=NULL,DWORD n1=0); int authorize(const char *,const char *,int tipo=CWebSrvSocket2_base::HTTP_AUTHORIZATION_BASIC); int readPage(char *,DWORD,DWORD timeout=45); int getPage(const char *,char *,DWORD,BOOL doRedirect=TRUE); int parseResponse(char *); static CString translateString(const char *); public: CWebCliSocket(const char *,int bProxyMode=NO_PROXY /* FINIRE ! AUTO_PROXY*/); ~CWebCliSocket(); }; --------------000002000307000206070604 Content-Type: text/plain; name="webclient.c" Content-Disposition: inline; filename="webclient.c" Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by pch.mit.edu id m5MCubC5025680 /* ***************************************************************** Web Client Class - by G.Dar 2001-2008 ***************************************************************** */ CWebCliSocket::CWebCliSocket(const char *agent,int bProxy) : m_Agent(agen= t) { =09 HTTPVer=3DMAKELONG(1,1); =09 switch(bProxy) { case NO_PROXY: // niente proxy m_ProxyMode=3DNO_PROXY; break; case ALWAYS_PROXY: // usa proxy sempre m_ProxyMode=3DPROXY_BASE; break; case AUTO_PROXY: // leggi da IE e comportati di conseguenza HKEY theRoot=3DHKEY_CLASSES_ROOT,pk,pksub; char myBuf[256]; int n; DWORD v,vLen; if(!RegOpenKeyEx(theRoot,"Software\\Microsoft\\Windows\\CurrentVersion= \\Internet Settings",0L,KEY_READ,&pk)) { n=3DRegQueryValueEx(pk,"AutoConfigUrl",0,NULL /*&vType*/,(BYTE *)&v,&= vLen); n=3DRegQueryValueEx(pk,"ProxyEnable",0,NULL /*&vType*/,(BYTE *)&v,&vL= en); n=3DRegQueryValueEx(pk,"ProxyServer",0,NULL /*&vType*/,(BYTE *)&v,&vL= en); RegCloseKey(pk); } break; } // per capire se vanno usati dei proxy, leggere la chiave // HKEY_CURRENT_USER\S-1-5-21-507921405-492894223-839522115-500\Software= \Microsoft\Windows\CurrentVersion\Internet Settings // e/o // HKEY_USERS\S-1-5-21-507921405-492894223-839522115-500\Software\Micros= oft\Windows\CurrentVersion\Internet Settings // la chiave AutoConfigURL indica se =E8 attivato il file di Configurazi= one automatica proxy // la chiave ProxyEnable e ProxyServer(:porta) indicano rispettivamente = il tipo di proxy e se s=EC m_HTTPHeader=3Dnew CHTTPHeader; } CWebCliSocket::~CWebCliSocket() { if(m_HTTPHeader) delete m_HTTPHeader; m_HTTPHeader=3DNULL; } BOOL CWebCliSocket::Connect(LPCTSTR s,WORD port) { if(CSocket::Create()) { return CSocket::Connect(s,port); } return FALSE; } BOOL CWebCliSocket::Disconnect() { CSocket::Close(); return TRUE; } int CWebCliSocket::Send(CString S) { return CSocket::Send(S,S.GetLength()); } int CWebCliSocket::sendQuery(CString S) { if(Send(S)) return Send(CWebSrvSocket2_base::CRLF); return 0; } CString CWebCliSocket::buildQuery(CString Srv,CString S,int m,int proxyMo= de) { char myBuf[256],myBuf2[128]; CString S2; m_HTTPHeader->Reset(); // FINIRE!! S2=3Dm ? "POST " : "GET "; switch(proxyMode) { case 0: break; case PROXY_BASE: S2+=3D"http://"; S2+=3DSrv; break; case PROXY_SOCKS4: break; } S2+=3DS; wsprintf(myBuf,"%s HTTP/%u.%u",(LPCTSTR)S2,HIWORD(HTTPVer),LOWORD(HTTPVe= r)); m_HTTPHeader->AddToken(0,myBuf); m_HTTPHeader->AddToken(CHTTPHeader::TAG_ACCEPT,"*/*"); m_HTTPHeader->AddToken(CHTTPHeader::TAG_ACCEPT_LANGUAGE,"it,en" /*siamo = in un mondo anglo-americano :-) */); m_HTTPHeader->AddToken(CHTTPHeader::TAG_ACCEPT_ENCODING,"gzip, deflate")= ; OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize=3Dsizeof(OSVERSIONINFO); GetVersionEx(&osvi); char *p; switch(osvi.dwMajorVersion) { case 3: p=3D"windows 3.x"; break; case 4: switch(osvi.dwMinorVersion) { case 0: p=3D"windows 95"; break; case 10: p=3D"windows 98"; break; case 11: p=3D"windows 98SE"; break; default: p=3D"windows 98"; break; } break; case 5: switch(osvi.dwMinorVersion) { case 0: p=3D"windows 2000"; break; case 10: p=3D"windows XP"; break; default: p=3D"windows 2000"; break; } break; default: p=3D"s.o. sconosciuto"; break; } wsprintf(myBuf,"Mozilla/4.0 (compatible; %s; %s)", (LPCTSTR)m_Agent,p); m_HTTPHeader->AddToken(CHTTPHeader::TAG_USERAGENT,myBuf); m_HTTPHeader->AddToken(CHTTPHeader::TAG_HOST,Srv); =09 m_HTTPHeader->AddToken(CHTTPHeader::TAG_CONNECTION,"keep-alive"); // S2+=3D"Authorization: ...\r\n"; // finire... return m_HTTPHeader->GetBuffer(); } void CWebCliSocket::addHeader(int n,const char *s,const char *s2,CTime t1= ,DWORD n1) { =09 if(m_HTTPHeader) m_HTTPHeader->AddToken(n,s,s2,t1,n1); } int CWebCliSocket::authorize(const char *user,const char *pasw, int type)= { char encUserPasw[256]; CString S; switch(type) { case CWebSrvSocket2_base::HTTP_AUTHORIZATION_BASIC: S=3Duser; S+=3D":"; S+=3Dpasw; CSMTPAttachment::EncodeBase64(S, S.GetLength(), encUserPasw, 255, NULL= ); S=3DencUserPasw; addHeader(CHTTPHeader::TAG_AUTHORIZATION,"Basic ",S); return CWebSrvSocket2_base::HTTP_AUTHORIZATION_BASIC; break; } return 0; } int CWebCliSocket::readPage(char *buf,DWORD len,DWORD timeout) { int i,n,n2; DWORD ti; char *myBuf; n=3D0; myBuf=3D(char *)GlobalAlloc(GPTR,len+1); if(!myBuf) return 0; ti=3DtimeGetTime()+timeout*1000; while(ti>timeGetTime()) { n2=3Dlen-n; i=3DCAsyncSocket::Receive(myBuf,n2); // HTTP/1.1 200 OK if(i<0) { i=3DGetLastError(); if(i !=3D WSAEWOULDBLOCK) break; } else { memcpy(buf+n,myBuf,i); n+=3Di; if(n >=3D len) { break; } } } GlobalFree(myBuf); return n; } int CWebCliSocket::getPage(const char *url,char *buf,DWORD len,BOOL doRed= irect) { int i,n,status; CString s=3Durl,srv,s2; char myBuf[1024]; s=3Ds.Mid(7); n=3Ds.Find('/'); srv=3Ds.Left(n); if(Connect(srv)) { s2=3DbuildQuery(srv,s.Mid(n)); // compreso slash iniziale! // AfxMessageBox(s2); i=3DSend((LPCTSTR)s2); // theApp.FileSpool->print(CLogFile::flagInfo," GET/HTTP send: %d",i); Receive(myBuf,1000); // HTTP/1.1 200 OK parseResponse(myBuf); // FINIRE!! Receive(buf,len); // contenuto // theApp.FileSpool->print(CLogFile::flagInfo," GET receive: %s",myBuf)= ; Disconnect(); } return status; } int CWebCliSocket::parseResponse(char *buf) { int status; return status; } CString CWebCliSocket::translateString(const char *s) { CString S; while(*s) { switch(*s) { case ' ': S+=3D'+'; break; default: S+=3D*s; break; } s++; } return S; } --------------000002000307000206070604 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Disposition: inline Content-Transfer-Encoding: 7bit -- http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist --------------000002000307000206070604--