5

I cannot get my code to work :/

4 Answers 4

9

Eventually I found some working example on the web

static char szRawData[5000];
  memset(szRawData, 0x11, sizeof(szRawData));

  //
  // CIHandle is just a wrapper class for HINTERNET, that closes handle in destructor
  //
  CIHandle hIntrn = InternetOpen( "LiveUpdate"), 
                                  INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
                                  NULL,
                                  NULL,
                                  0);
  if (!hIntrn)
    return printf("No Internet connection: %li.\n", GetLastError());

  CIHandle hConn = InternetConnect( hIntrn, 
                                    "65.254.250.104",
                                    INTERNET_DEFAULT_HTTP_PORT,
                                    NULL,
                                    NULL,
                                    INTERNET_SERVICE_HTTP,
                                    0,
                                    NULL);
  if (!hConn)
    return printf("Connection to update server failed: %li.\n", GetLastError());

  DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
                             INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
                             INTERNET_FLAG_KEEP_CONNECTION |
                             INTERNET_FLAG_NO_AUTO_REDIRECT |
                             INTERNET_FLAG_NO_COOKIES |
                             INTERNET_FLAG_NO_CACHE_WRITE |
                             INTERNET_FLAG_NO_UI |
                             INTERNET_FLAG_RELOAD;

  CIHandle hReq = HttpOpenRequest(hConn,
                                  "POST",
                                  "upload.php",
                                  "HTTP/1.0",
                                  NULL,
                                  NULL,
                                  dwOpenRequestFlags,
                                  NULL);

  ZString strBoundary = "---------------------------autoupdater";
  ZString strContentHeader =  "Host: www.mydomain_at_powweb.com\r\n"
                              "Content-Type: multipart/form-data; boundary=";
  strContentHeader+=strBoundary;

  HttpAddRequestHeaders(hReq, strContentHeader, strContentHeader.length(), HTTP_ADDREQ_FLAG_ADD);


  ZString strHeaders;
  strHeaders.precache(16384);
  sprintf(strHeaders,
          "--%s\r\n"
          "Content-Disposition: form-data; name=\"userfile\"; "
          "filename=\"test.raw\"\r\n"
          "Content-Type: application/octet-stream\r\n\r\n",
          (LPCTSTR)strBoundary);

  tCharSeq s;//this is a just a dynamic array of bytes;
  //
  // append headers and file to request:
  //
  s.precache(16384);
  s.append(strHeaders.length(), strHeaders);
  //append with file data:
  s.append(2000, szRawData); //<------------------- depending on this size, SendRequest fails.
  //trailing end of data:
  s.append(4,"\r\n--");
  s.append(strBoundary.length(), (LPTSTR)strBoundary);
  s.append(4,"--\r\n");

  InternetSetOption(hReq, INTERNET_OPTION_USERNAME, "username\0", 9);
  InternetSetOption(hReq, INTERNET_OPTION_PASSWORD, "password\0", 9);

  if (!HttpSendRequest(hReq, NULL, 0, (void*)s.getBuffer(), s.length()))
    return printf("HttpSendRequest failed: %li.\n", GetLastError());
Sign up to request clarification or add additional context in comments.

Comments

1

Here's a quick example from Microsoft.

   static TCHAR hdrs[] =
      _T("Content-Type: application/x-www-form-urlencoded");
   static TCHAR frmdata[] =
      _T("name=John+Doe&userid=hithere&other=P%26Q");
  static LPSTR accept[2]={"*/*", NULL};

   // for clarity, error-checking has been removed
   HINTERNET hSession = InternetOpen("MyAgent",
      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
      _T("FormActionHere"), NULL, NULL, accept, 0, 1);
   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
   // close any valid internet-handles

The example comes from here.

1 Comment

Thanx, but I still don't understand how can I upload a file (image) with that, how do I add image binaries to the POST body I thin it should contain multipart body, but how :/
1

MSDN has a good example SAMPLE: Using HttpSendRequestEx for Large POST Requests
it also contain a ASP file for HTTP server to receive data, please download the self-extract file 'Hsrex.exe' in msdn page.

Comments

1

I couldn't find an easy and complete code of how to use wininet with c/c++ so from bits and pieces i wrote an easy and simple c code for someone that visits in future and cant figure out.The code can upload any file(binary,text,mp3....) to hostname you specify,for backend i use php(below code).

#include<windows.h>
#include<stdio.h>
#include<wininet.h>

int main(int argc,char *argv[])
{
    if(argc!=4)
    {
        printf("USAGE:fileuploader.exe hostname scriptname filename");
        exit(1);
    }
    HANDLE hfile=CreateFile(argv[3],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    if(hfile==INVALID_HANDLE_VALUE)
    {
        printf("creatfile error %lu",GetLastError());
        exit(1);
    }
    DWORD filesize=GetFileSize(hfile,NULL);
    //STARTING PREPARING THE WININET CODE.
    PCHAR szstart = "Content-Type: multipart/form-data; boundary=----qwerty";
    PCHAR szData    = "------qwerty\r\n"
                      "Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n"
                      "Content-Type: application/octet-stream\r\n"
                      "Content-Transfer-Encoding: binary\r\n\r\n";
    PCHAR szDataEnd = "\r\n------qwerty--\r\n";
    char szheaders[1024];
    wsprintf(szheaders,szData,"filetoupload",argv[3]);
    HINTERNET hsession,hconnect,hrequest;
    DWORD bytesread,byteswritten,contentlen;
    hsession=InternetOpen("fileuploader",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    if(!hsession)
    {
        printf("internet open error %lu",GetLastError());
        exit(1);
    }
    hconnect=InternetConnect(hsession,argv[1],INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
    hrequest=HttpOpenRequest(hconnect,"POST",argv[2],NULL,NULL,0,0,0);
    contentlen=lstrlen(szheaders)+filesize+lstrlen(szDataEnd);
    LPBYTE pbuf=(LPBYTE)malloc(contentlen);
    CopyMemory(&pbuf[0],szheaders,lstrlen(szheaders));
    ReadFile(hfile,&pbuf[lstrlen(szheaders)],filesize,&bytesread,NULL);
    CopyMemory(&pbuf[lstrlen(szheaders)+filesize],szDataEnd,lstrlen(szDataEnd));
    HttpSendRequest(hrequest,szstart,lstrlen(szstart),pbuf,contentlen);
    char testbuf[1024];
    InternetReadFile(hrequest,testbuf,(DWORD)sizeof(testbuf),&byteswritten);
    printf("%s",testbuf);


}

and here is the php code i use along with it

<?php
if(isset($_FILES["filetoupload"]))
{
    $path="C:/xampp/htdocs/";
    $path=$path.basename($_FILES['filetoupload']['name']);
    print($path);
    if(move_uploaded_file($_FILES['filetoupload']['tmp_name'],$path))
    {
        print("upload success");
    }
    else
    {
        print("no success");

    }

}


?>

<html>
<body>
<form action="fileupload.php" method="post" enctype="multipart/form-data">  
    Select File:  
    <input type="file" name="filetoupload"/>  
    <input type="submit" value="Upload Image" name="submit"/>  
</form>  
</body>
</html>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.