version 1.170, 2011/01/25 11:24:24
|
version 1.178, 2014/04/08 17:15:38
|
|
|
if (keyBindings[i].getType() == CIMKeyBinding::REFERENCE) | if (keyBindings[i].getType() == CIMKeyBinding::REFERENCE) |
{ | { |
CIMObjectPath ref = keyBindings[i].getValue(); | CIMObjectPath ref = keyBindings[i].getValue(); |
appendValueReferenceElement(out, ref, true); |
// create an instancePath (i.e. isClassPath = false) |
|
appendValueReferenceElement(out, ref, false, true); |
} | } |
else | else |
{ | { |
|
|
out << keyBindingTypeToString(keyBindings[i].getType()); | out << keyBindingTypeToString(keyBindings[i].getType()); |
out << STRLIT("\">"); | out << STRLIT("\">"); |
| |
// fixed the special character problem - Markus |
// fixed the special characters |
| |
appendSpecial(out, keyBindings[i].getValue()); | appendSpecial(out, keyBindings[i].getValue()); |
out << STRLIT("</KEYVALUE>\n"); | out << STRLIT("</KEYVALUE>\n"); |
|
|
// | // |
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ |
| |
|
// appendValueReferenceElement does this correctly with isClassPath flag |
|
// Called only but formatSimple |
void XmlWriter::appendLocalObjectPathElement( | void XmlWriter::appendLocalObjectPathElement( |
Buffer& out, | Buffer& out, |
const CIMObjectPath& objectPath) | const CIMObjectPath& objectPath) |
|
|
// distinguish instanceNames from classNames in every case | // distinguish instanceNames from classNames in every case |
// The instanceName of a singleton instance of a keyless class has no | // The instanceName of a singleton instance of a keyless class has no |
// key bindings | // key bindings |
|
// See bBUG_3302. |
// | // |
if (objectPath.getKeyBindings ().size () != 0) | if (objectPath.getKeyBindings ().size () != 0) |
{ | { |
|
|
| |
inline void _xmlWritter_appendValue(Buffer& out, const CIMObjectPath& x) | inline void _xmlWritter_appendValue(Buffer& out, const CIMObjectPath& x) |
{ | { |
XmlWriter::appendValueReferenceElement(out, x, true); |
// Emit Instance Path with value wrapper |
|
XmlWriter::appendValueReferenceElement(out, x, false, true); |
} | } |
| |
inline void _xmlWritter_appendValue(Buffer& out, const CIMObject& x) | inline void _xmlWritter_appendValue(Buffer& out, const CIMObject& x) |
|
|
break; | break; |
} | } |
default: | default: |
PEGASUS_ASSERT(false); |
PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);) |
} | } |
} | } |
else if (value.getType() == CIMTYPE_REFERENCE) | else if (value.getType() == CIMTYPE_REFERENCE) |
|
|
break; | break; |
} | } |
default: | default: |
PEGASUS_ASSERT(false); |
PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);) |
} | } |
| |
out << STRLIT("</VALUE>\n"); | out << STRLIT("</VALUE>\n"); |
|
|
const CIMObject& objectWithPath, | const CIMObject& objectWithPath, |
Boolean includeQualifiers, | Boolean includeQualifiers, |
Boolean includeClassOrigin, | Boolean includeClassOrigin, |
|
Boolean isClassObject, |
const CIMPropertyList& propertyList) | const CIMPropertyList& propertyList) |
{ | { |
out << STRLIT("<VALUE.OBJECTWITHPATH>\n"); | out << STRLIT("<VALUE.OBJECTWITHPATH>\n"); |
| |
appendValueReferenceElement(out, objectWithPath.getPath (), false); |
appendValueReferenceElement(out, objectWithPath.getPath (), |
|
isClassObject , false); |
|
|
appendObjectElement( | appendObjectElement( |
out, | out, |
objectWithPath, | objectWithPath, |
|
|
// | // |
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ |
| |
void XmlWriter::appendValueReferenceElement( |
// appends INSTANCEPATH | LOCALINSTANCEPATH | INSTANCENAME |
|
void XmlWriter::appendValueInstancePathElement( |
Buffer& out, | Buffer& out, |
const CIMObjectPath& reference, |
const CIMObjectPath& reference) |
Boolean putValueWrapper) |
|
{ |
|
if (putValueWrapper) |
|
out << STRLIT("<VALUE.REFERENCE>\n"); |
|
|
|
// See if it is a class or instance reference (instance references have |
|
// key-bindings; class references do not). |
|
// |
|
// ATTN-CAKG-P2-20020726: The following condition does not correctly |
|
// distinguish instanceNames from classNames in every case |
|
// The instanceName of a singleton instance of a keyless class has no |
|
// key bindings |
|
// |
|
|
|
const Array<CIMKeyBinding>& kbs = reference.getKeyBindings(); |
|
|
|
if (kbs.size()) |
|
{ | { |
if (reference.getHost().size()) | if (reference.getHost().size()) |
{ | { |
|
|
appendInstanceNameElement(out, reference); | appendInstanceNameElement(out, reference); |
} | } |
} | } |
else |
|
|
// appends CLASSPATH | LOCALCLASSPATH | CLASSNAME |
|
void XmlWriter::appendValueClassPathElement( |
|
Buffer& out, |
|
const CIMObjectPath& reference) |
{ | { |
if (reference.getHost().size()) | if (reference.getHost().size()) |
{ | { |
|
|
} | } |
} | } |
| |
if (putValueWrapper) |
// Builds either a classPath or InstancePath based on isClassPath |
|
// parameter which was carried forward from, for example, the |
|
// request. If wrapper true, wrap output with <VALUE.REFERENCE> |
|
void XmlWriter::appendValueReferenceElement( |
|
Buffer& out, |
|
const CIMObjectPath& reference, |
|
Boolean isClassPath, |
|
Boolean addValueWrapper) |
|
{ |
|
if (addValueWrapper) |
|
{ |
|
out << STRLIT("<VALUE.REFERENCE>\n"); |
|
} |
|
if (isClassPath) |
|
{ |
|
appendValueClassPathElement(out,reference); |
|
} |
|
else |
|
{ |
|
appendValueInstancePathElement(out,reference); |
|
} |
|
|
|
if (addValueWrapper) |
|
{ |
out << STRLIT("</VALUE.REFERENCE>\n"); | out << STRLIT("</VALUE.REFERENCE>\n"); |
} | } |
|
} |
| |
void XmlWriter::printValueReferenceElement( | void XmlWriter::printValueReferenceElement( |
const CIMObjectPath& reference, | const CIMObjectPath& reference, |
|
Boolean isClassPath, |
PEGASUS_STD(ostream)& os) | PEGASUS_STD(ostream)& os) |
{ | { |
Buffer tmp; | Buffer tmp; |
appendValueReferenceElement(tmp, reference, true); |
appendValueReferenceElement(tmp, reference, isClassPath, true); |
indentedPrint(os, tmp.getData()); | indentedPrint(os, tmp.getData()); |
} | } |
| |
|
|
// Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY is | // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY is |
// defined, then the EmbeddedInstance qualifier will be added | // defined, then the EmbeddedInstance qualifier will be added |
# ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY | # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY |
if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE == |
if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE) |
PEG_NOT_FOUND) |
== PEG_NOT_FOUND) |
{ | { |
// Note that addQualifiers() cannot be called on a const | // Note that addQualifiers() cannot be called on a const |
// CIMQualifierRep. In this case we really do want to add | // CIMQualifierRep. In this case we really do want to add |
|
|
bool binaryRequest, | bool binaryRequest, |
bool binaryResponse) | bool binaryResponse) |
{ | { |
char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' }; |
char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)),'\0'}; |
| |
// ATTN: KS 20020926 - Temporary change to issue only POST. This may | // ATTN: KS 20020926 - Temporary change to issue only POST. This may |
// be changed in the DMTF CIM Operations standard in the future. | // be changed in the DMTF CIM Operations standard in the future. |
|
|
} | } |
else | else |
{ | { |
out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n"); |
out << STRLIT("Content-Type: application/xml; charset=utf-8\r\n"); |
} | } |
| |
if (binaryResponse) | if (binaryResponse) |
|
|
} | } |
else | else |
{ | { |
out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n"); |
out << STRLIT("Content-Type: application/xml; charset=utf-8\r\n"); |
} | } |
| |
OUTPUT_CONTENTLENGTH(out, contentLength); | OUTPUT_CONTENTLENGTH(out, contentLength); |
|
|
} | } |
if (httpMethod == HTTP_METHOD_M_POST) | if (httpMethod == HTTP_METHOD_M_POST) |
{ | { |
char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' }; |
char nn[] = {char('0'+(rand() % 10)),char('0' + (rand() % 10)),'\0'}; |
| |
out << STRLIT("Ext:\r\n" | out << STRLIT("Ext:\r\n" |
"Cache-Control: no-cache\r\n" | "Cache-Control: no-cache\r\n" |
|
|
// Returns unauthorized message in the following format: | // Returns unauthorized message in the following format: |
// | // |
// HTTP/1.1 401 Unauthorized | // HTTP/1.1 401 Unauthorized |
|
// PGErrorDetail: <error text> (if specified by caller) |
// WWW-Authenticate: Basic realm="HostName" | // WWW-Authenticate: Basic realm="HostName" |
// <HTML><HEAD> | // <HTML><HEAD> |
// <TITLE>401 Unauthorized</TITLE> | // <TITLE>401 Unauthorized</TITLE> |
|
|
| |
void XmlWriter::appendUnauthorizedResponseHeader( | void XmlWriter::appendUnauthorizedResponseHeader( |
Buffer& out, | Buffer& out, |
|
const String& errorDetail, |
const String& content) | const String& content) |
{ | { |
out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n"); | out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n"); |
|
if (errorDetail.size() > 0) |
|
{ |
|
out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ") |
|
<< encodeURICharacters(errorDetail) << STRLIT("\r\n"); |
|
} |
|
|
OUTPUT_CONTENTLENGTH(out, 0); | OUTPUT_CONTENTLENGTH(out, 0); |
out << content << STRLIT("\r\n\r\n"); | out << content << STRLIT("\r\n\r\n"); |
| |
|
|
// out << "</BODY></HTML>\r\n"; | // out << "</BODY></HTML>\r\n"; |
} | } |
| |
#ifdef PEGASUS_KERBEROS_AUTHENTICATION |
|
//------------------------------------------------------------------------------ |
|
// |
|
// appendOKResponseHeader() |
|
// |
|
// Build HTTP authentication response header for unauthorized requests. |
|
// |
|
// Returns OK message in the following format: |
|
// |
|
// HTTP/1.1 200 OK |
|
// Content-Length: 0 |
|
// WWW-Authenticate: Negotiate "token" |
|
// <HTML><HEAD> |
|
// <TITLE>200 OK</TITLE> |
|
// </HEAD><BODY BGCOLOR="#99cc99"> |
|
// <H2>TEST200 OK</H2> |
|
// <HR> |
|
// </BODY></HTML> |
|
// |
|
//------------------------------------------------------------------------------ |
|
|
|
void XmlWriter::appendOKResponseHeader( |
|
Buffer& out, |
|
const String& content) |
|
{ |
|
out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n"); |
|
// Content-Length header needs to be added because 200 OK record |
|
// is usually intended to have content. But, for Kerberos this |
|
// may not always be the case so we need to indicate that there |
|
// is no content |
|
OUTPUT_CONTENTLENGTH(out, 0); |
|
out << content << STRLIT("\r\n\r\n"); |
|
|
|
//ATTN: We may need to include the following line, so that the browsers |
|
// can display the error message. |
|
// out << "<HTML><HEAD>\r\n"; |
|
// out << "<TITLE>" << "200 OK" << "</TITLE>\r\n"; |
|
// out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n"; |
|
// out << "<H2>TEST" << "200 OK" << "</H2>\r\n"; |
|
// out << "<HR>\r\n"; |
|
// out << "</BODY></HTML>\r\n"; |
|
} |
|
#endif |
|
| |
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ |
// | // |
|
|
_appendIParamValueElementEnd(out); | _appendIParamValueElementEnd(out); |
} | } |
| |
void XmlWriter::appendObjectNameIParameter( |
|
Buffer& out, |
|
const char* name, |
|
const CIMObjectPath& objectName) |
|
{ |
|
// |
|
// ATTN-CAKG-P2-20020726: The following condition does not correctly |
|
// distinguish instanceNames from classNames in every case |
|
// The instanceName of a singleton instance of a keyless class also |
|
// has no key bindings |
|
// |
|
if (objectName.getKeyBindings ().size () == 0) |
|
{ |
|
XmlWriter::appendClassNameIParameter( |
|
out, name, objectName.getClassName()); |
|
} |
|
else |
|
{ |
|
XmlWriter::appendInstanceNameIParameter( |
|
out, name, objectName); |
|
} |
|
} |
|
|
|
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ |
// | // |
// appendClassIParameter() | // appendClassIParameter() |
|
|
const ContentLanguageList& contentLanguages, | const ContentLanguageList& contentLanguages, |
Uint32 contentLength) | Uint32 contentLength) |
{ | { |
char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' }; |
char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)), '\0' }; |
| |
if (httpMethod == HTTP_METHOD_M_POST) | if (httpMethod == HTTP_METHOD_M_POST) |
{ | { |
|
|
out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n"); | out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n"); |
} | } |
out << STRLIT("HOST: ") << host << STRLIT("\r\n" | out << STRLIT("HOST: ") << host << STRLIT("\r\n" |
"Content-Type: application/xml; charset=\"utf-8\"\r\n"); |
"Content-Type: application/xml; charset=utf-8\r\n"); |
OUTPUT_CONTENTLENGTH(out, contentLength); | OUTPUT_CONTENTLENGTH(out, contentLength); |
| |
if (acceptLanguages.size() > 0) | if (acceptLanguages.size() > 0) |
|
|
const ContentLanguageList& contentLanguages, | const ContentLanguageList& contentLanguages, |
Uint32 contentLength) | Uint32 contentLength) |
{ | { |
char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' }; |
char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)), '\0' }; |
| |
out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n" | out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n" |
"Content-Type: application/xml; charset=\"utf-8\"\r\n"); |
"Content-Type: application/xml; charset=utf-8\r\n"); |
OUTPUT_CONTENTLENGTH(out, contentLength); | OUTPUT_CONTENTLENGTH(out, contentLength); |
| |
if (contentLanguages.size() > 0) | if (contentLanguages.size() > 0) |
|
|
| |
case CIMKeyBinding::REFERENCE: | case CIMKeyBinding::REFERENCE: |
default: | default: |
PEGASUS_ASSERT(false); |
PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);) |
} | } |
| |
return STRLIT("unknown"); | return STRLIT("unknown"); |