[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 358
  • Last Modified:

Append Data to Remote File Using Wininet

Hello, having some difficulties appending the contents of one file to the contents of another remote file.

code:
// httpPutFile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include "wininet.h"
#include <stdio.h>
#include<iostream.h>
#pragma comment(lib, "wininet.lib")
int UseHttpSendReqEx(HINTERNET hConnect, char *upFile)
   {
     INTERNET_BUFFERS BufferIn = {0};
     DWORD dwBytesRead;
     DWORD dwBytesWritten;
     BYTE pBuffer[1024]; // Read from file in 1K chunks
     BOOL bRead, bRet;

     BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );

     HINTERNET hRequest = HttpOpenRequest(hConnect, "PUT", "/logs.bin", NULL, "localhost", NULL, INTERNET_FLAG_HYPERLINK, 0);
     if (!hRequest)
     {
       printf("Failed to open request handle: %lu\n", GetLastError ());
       return FALSE;
     }

     HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
       printf("\nFailed to open local file %s.", upFile);
       return FALSE;
     }

     BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
     printf ("File size is %d\n", BufferIn.dwBufferTotal );

     if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
     {
       printf( "Error on HttpSendRequestEx %lu\n",GetLastError() );
       return FALSE;
     }

     DWORD sum = 0;
     do
     {
       if  (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),
           &dwBytesRead, NULL)))
       {
         printf ("\nReadFile failed on buffer %lu.",GetLastError());
         break;
       }
       if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,
           &dwBytesWritten)))
       {
         printf ("\nInternetWriteFile failed %lu", GetLastError());
         break;
       }
       sum += dwBytesWritten;
     }
     while (dwBytesRead == sizeof(pBuffer)) ;

     CloseHandle (hFile);
     printf ("Actual written bytes: %d\n", sum);

     if(!HttpEndRequest(hRequest, NULL, 0, 0))
     {
       printf( "Error on HttpEndRequest %lu \n", GetLastError());
       return FALSE;
     }
     return TRUE;
   }

int main(int argc, char* argv[])
{
	HINTERNET inetOpen;
HINTERNET inetConnect;
inetOpen=InternetOpen("HTTPGET", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
inetConnect=InternetConnect(inetOpen, "mysite.com", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
UseHttpSendReqEx(inetConnect, "c:\\new.txt");
	return 0;
}

Open in new window


the output of the application is "File size is 17
Actual written bytes: 17"

I would assume this means it actually was able to write to the remote file, however, the remote file remains unchanged.

Any input;
Thanks.
0
JoeD77
Asked:
JoeD77
1 Solution
 
MedievalWarriorCommented:
It's documented that you should resolve the full address as in: www.mysite.com and I don't see any calls to InternetCloseHandle() which is used to end the data transfer.
UseHttpSendReqEx(....);
InternetCloseHandle(inetConnect);
InternetCloseHandle(inetOpen);

Open in new window

0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now