2009-03-17 11 views
0

Mein Code spricht mit einer kleinen Java-Anwendung, die von einem Anbieter bereitgestellt wird. Diese Java-App richtet einen Webserver unter localhost: 57000 ein, mit dem der Status von "der Maschine" gesteuert wird. Für diese Frage muss ich den Zustand von "Maschine" von "Aus" auf "Ein" ändern. Um dies zu ermöglichen ich soll HTTP PUT die folgende Zeichenfolge 'die Maschine' bei http://localhost:57000/settings.xml:Warum wird MFC :: CHttpFile 'PUT' für mich nicht?

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

Diese Locken Befehl funktioniert perfekt:

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

wo die lokale Datei 'settings.xml' in den obigen xML-Zeichenfolge hat.

ich möchte zu tun, was Locke ist mit MFC WININET Klassen zu tun. Der folgende Code sollte IMHO genau das gleiche t tun Hing, dass Curl tut. Obwohl der localhost-Webserver einen Code 200 zurückgibt, ignoriert er leider meine XML-Zeichenfolge. Was fehlt mir noch?

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; 
} 

Vielen Dank im Voraus.

Antwort

0

Ich habe die MFC-Klassen mit meinem eigenen Low-Level-Socket-Code ersetzt, um genau den gleichen Text in der gleichen Reihenfolge wie Curl zu senden. Es sah so aus, als ob der kleine eingebettete 'Jetty'-Java-Server nur einen der von den MFC-Klassen erzeugten Header ablehnte.