views:

330

answers:

1

My code talks to a little Java application provided by a vendor. This Java app sets up a web server at localhost:57000 which is used to control the state of 'the machine'. For the purpose of this question, I need to change the state of 'the machine' from 'off' to 'on'. To make this happen I'm supposed to HTTP PUT the following string to 'the machine' at http://localhost:57000/settings.xml:

<settings><machine_state><status>on</status></machine_state></settings>

This Curl command works perfectly:

curl -X PUT -H "Content-Type:application/xml" -d @settings.xml http://localhost:57000/settings.xml"

where the local file 'settings.xml' has the above xml string in it.

I want to do what Curl is doing with MFC's WININET classes. The following code should IMHO do exactly the same thing that curl does. Sadly, although the localhost web server returns a code 200 it ignores my xml string. What little thing am I missing?

int MyHttp::HttpPutThread() NOTHROW
{
    try {
            m_xml =  "<settings><machine_state><status>on</status></machine_state></settings>";
            m_url = "settings.xml"
     CInternetSession session; 
     SetSessionOptions(session);
     CString server = "localhost:57920";
     boost::scoped_ptr<CHttpConnection> phttp(session.GetHttpConnection(server));
     LPCTSTR accept = 0;//"text/xml";
     boost::scoped_ptr<CHttpFile> phttpfile(phttp->OpenRequest(
      "PUT", //verb
      "settings.xml", //object name
      0, //referer
      1, //context
      &accept, // accept types
      0, //version
      INTERNET_FLAG_EXISTING_CONNECT));   

     CString header = "Content-Type:application/xml\r\n";
     if(phttpfile->SendRequest(header,(LPVOID)m_xml.GetBuffer(), m_xml.GetLength()))
     {       // LOG_DEBUG (Same as TRACE) output are shown in comment
      DWORD code(0);
      phttpfile->QueryInfoStatusCode(code);
      LOG_DEBUG("HttpPutThread result code: %d", code); // '200'
      CString object = phttpfile->GetObject();
      LOG_DEBUG("object: %s", object); // 'settings.xml'
      CString statustxt;
      phttpfile->QueryInfo(HTTP_QUERY_STATUS_TEXT,statustxt);
      LOG_DEBUG("status text:%s", statustxt); // 'HTTP/1.0 200 OK'
      CString rawheaders;
      phttpfile->QueryInfo(HTTP_QUERY_RAW_HEADERS,rawheaders);
      LOG_DEBUG("raw headers:%s", rawheaders); // http://localhost:57000/settings.xml
      LOG_DEBUG("File url:%s",phttpfile->GetFileURL());
      LOG_DEBUG("Verb:%s", phttpfile->GetVerb()); // 'PUT'

     } else  
     {
                    //This does not happen
      LOG_DEBUG("PUT failed in AffHttp::HttpPutThread");  
     }

    } catch(CInternetException* pe)
    {
            //No exceptions are thrown
     LOG_DEBUG("Exception HttpPutThread:%d", pe->m_dwError);
     pe->Delete();
    }
    return 0;
}

Thanks in advance.

A: 

I wound up replacing the MFC classes with my own low level socket code to send exactly the same text in exactly the same order as Curl did. It seemed like the little embedded 'jetty' Java server just objected to one of the headers generated by the MFC classes.

Jim In Texas