Почему MFC :: CHttpFile не 'PUT' для меня? - PullRequest
0 голосов
/ 17 марта 2009

Мой код общается с небольшим 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;
}

Заранее спасибо.

1 Ответ

0 голосов
/ 22 марта 2009

В итоге я заменил классы MFC собственным кодом сокета низкого уровня, чтобы послать точно такой же текст в том же порядке, что и Керл. Казалось, что маленький встроенный Java-сервер 'jetty' просто возражал против одного из заголовков, сгенерированных классами MFC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...