Im afraid the post of mine is not commercial:
HRESULT iStreamHttp::WriteStream(const TCHAR* url,IStream* stream)
{
CloseURL();
_hiOpen = InternetOpen(UserAgent(),INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);
if(!_hiOpen) return E_FAIL;
long timeout = DEF_TIMEOUT;
long context = (long)this;
InternetSetOption(_hiOpen,INTERNET_OPTION_CONNECT_TIMEOUT,&timeout,sizeof(timeout));
InternetSetOption(_hiOpen,INTERNET_OPTION_RECEIVE_TIMEOUT,&timeout,sizeof(timeout));
tArr<TCHAR> domain;
tArr<TCHAR> path;
SplitURL(url,domain,path);
_hiConnect = InternetConnect(_hiOpen,domain.array,INTERNET_DEFAULT_HTTP_PORT,0,0,INTERNET_SERVICE_HTTP,0,context);
if(!_hiConnect) return E_FAIL;
unsigned long dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE;
_hiUrl = HttpOpenRequest(_hiConnect,__TEXT("POST"),path.array,0,0,0,dwFlags,context);
if(!_hiUrl) return E_FAIL;
INTERNET_BUFFERS buffer;
ULARGE_INTEGER size = {0,0};
LARGE_INTEGER null = {0,0};
ULARGE_INTEGER seek = {0,0};
TCHAR status[256];
unsigned long cb;
if(S_OK==stream->Seek(null,SEEK_END,&seek))
{
memset(&buffer,0,sizeof(buffer));
buffer.dwStructSize = sizeof(buffer);
buffer.dwBufferTotal = seek.LowPart;
if(HttpSendRequestEx(_hiUrl,&buffer,0,0,context))
{
char buff[0x1000];
unsigned long read;
unsigned long writ;
stream->Seek(null,SEEK_SET,&seek);
while((S_OK==stream->Read(buff,sizeof(buff),&read)) && (0<read))
{
InternetWriteFile(_hiUrl,buff,read,&writ);
}
cb = sizeof(status)/sizeof(status[0]);
if(HttpQueryInfo(_hiUrl,HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,status,&cb,0))
_dwStatus = *(int*)status;
else if(HttpQueryInfo(_hiUrl,HTTP_QUERY_STATUS_CODE,status,&cb,0))
_dwStatus = _wtoi(status);
else
_dwStatus = 0;
HttpEndRequest(_hiUrl,&buffer,0,0);
}
}
return S_OK;
}
enum
{
URL_CHAR,
URL_ENCODE,
URL_SLASH,
URL_PARAM,
URL_ANCHOR,
};
const int __isurl(const TCHAR cc)
{
switch(cc)
{
case '/': return URL_SLASH;
case '?': return URL_PARAM;
case '#': return URL_ANCHOR;
}
return URL_CHAR;
}
unsigned int iStreamHttp::SplitURL(const TCHAR* url,tArr<TCHAR>& domain,tArr<TCHAR>& path)
{
unsigned int anf,end;
unsigned int anfd,endd;
for(anf=0;url[anf] && ('/'!=url[anf]);anf++);
for( ;url[anf] && ('/'==url[anf]);anf++);
if(url[end=anf]) for(;url[end] && ('/'!=url[end]);end++);
anfd = anf; endd = end;
for(anf=end;url[end] && (URL_ANCHOR!=__isurl(url[end]));end++);
scopy(path,0,url+anf,end-anf);
return scopy(domain,0,url+anfd,endd-anfd);
}
Good luck.