/* * $Id: Cimghttp.cpp,v 1.9 2008/12/12 00:52:00 tyreld Exp $ * * Cimghttp.cpp * * (C) Copyright IBM Corp. 2002, 2008 * * THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE * ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE * CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. * * You can obtain a current copy of the Eclipse Public License from * http://www.opensource.org/licenses/eclipse-1.0.php * * Author: Adrian Schuur * Contributors: Viktor Mihajlovski * Markus Mueller * Steve Shepherd * Heidi Neumann * David Eger * * Description: Line command interface to DMTF conforming WBEM servers */ #include "Cimghttp.h" extern int useNl; CimomGhttp::CimomGhttp() { request = 0; newstr=NULL; } void CimomGhttp::genRequest(URL &url, const char *op, bool cls, bool keys) { if (!supportsSSL() && url.scheme == "https") throw HttpException("ghttp does not support https urls."); string sb, uri; uri = uri + "http://" + url.host + ":"; uri = uri + url.port + "/cimom"; url.ns.toStringBuffer(sb,"%2F"); request=ghttp_request_new(); // bug in libghttp. it actually just makes a copy of uri.c_str(), should be const ghttp_set_uri(request,(char *)uri.c_str()); ghttp_set_type(request,ghttp_type_post); ghttp_set_header(request,http_hdr_Content_Type,"application/xml; charset=\"utf-8\""); ghttp_set_header(request,"Connection","Keep-Alive, TE"); ghttp_set_header(request,"CIMProtocolVersion","1.0"); ghttp_set_header(request,"CIMOperation","MethodCall"); ghttp_set_header(request,"CIMMethod",op); if (cls) { sb = sb + "%3A" + url.cName; if (keys) { char sep = '.'; int t = useNl; useNl=0; for (unsigned i = 0 ; i < url.keys.size() ; i++ ) { string sk; url.keys[i].toStringBuffer(sk, ""); sb = sb + sep + sk; sep = ','; } useNl=t; } } ghttp_set_header(request,"CIMObject",sb.c_str()); ghttp_set_authinfo(request,url.user.c_str(),url.password.c_str()); } string CimomGhttp::getResponse() { string rv; int rc,len; if(ghttp_prepare(request)) throw HttpException("Bad Request. Probably an error in WBEMCLI"); //cerr << "URI prepared " << rc << endl; rc=ghttp_process(request); if (rc!=ghttp_done) throw HttpException("Unable to process request"); //cerr << "ret_code " << rc << endl; len=ghttp_get_body_len(request); if(len==0) throw HttpException("No data received from Server. Probably authentication error."); rv = ghttp_get_body(request); //ghttp_current_status_tag gcs = ghttp_get_status(request); //cerr << "len " << len << " and stat " << gcs.proc << "," // << gcs.bytes_read << "," << gcs.bytes_total << endl; //cerr << " reason " << ghttp_reason_phrase(request) // << " error " << ghttp_get_error(request) << endl; ghttp_request_destroy(request); free(newstr); newstr=NULL; if (dumpXml) cerr<<"From server: "<