Мой код общается с небольшим Java-приложением, предоставленным поставщиком. Это приложение Java настраивает веб-сервер по адресу localhost: 57000, который используется для управления состоянием «компьютера». Для целей этого вопроса мне нужно изменить состояние «машины» с «выключено» на «включено». Чтобы это произошло, я должен отправить HTTP PUT следующую строку к «машине» в http://localhost:57000/settings.xml:
<settings><machine_state><status>on</status></machine_state></settings>
Эта команда Curl отлично работает:
curl -X PUT -H "Тип содержимого: application / xml" -d @ settings.xml http://localhost:57000/settings.xml"
где в локальном файле settings.xml находится указанная выше строка xml.
Я хочу сделать то, что делает Curl с классами MFC WININET. Следующий код должен ИМХО делать то же самое, что делает curl. К сожалению, хотя веб-сервер localhost возвращает код 200, он игнорирует мою строку xml. Какую маленькую вещь мне не хватает?
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;
}
Заранее спасибо.