version 1.106, 2004/06/03 15:04:54
|
version 1.107, 2004/06/24 19:49:53
|
|
|
// Carol Ann Krug Graves, Hewlett-Packard Company | // Carol Ann Krug Graves, Hewlett-Packard Company |
// (carolann_graves@hp.com) | // (carolann_graves@hp.com) |
// Amit K Arora, IBM (amita@in.ibm.com) for PEP#101 | // Amit K Arora, IBM (amita@in.ibm.com) for PEP#101 |
|
// Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase1 |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
|
// This is a shortcut macro for outputing content length. This |
|
// pads the output number to the max characters representing a Uint32 number |
|
// so that it can be overwritten easily with a transfer encoding line later |
|
// on in HTTPConnection if required. This is strictly for performance since |
|
// messages can be very large. This overwriting shortcut allows us to NOT have |
|
// to repackage a large message later. |
|
|
|
#define OUTPUT_CONTENTLENGTH \ |
|
{ \ |
|
char contentLengthP[11]; \ |
|
sprintf(contentLengthP,"%.10u", contentLength); \ |
|
out << "content-length: " << contentLengthP << "\r\n"; \ |
|
} |
|
|
Array<Sint8>& operator<<(Array<Sint8>& out, const char* x) | Array<Sint8>& operator<<(Array<Sint8>& out, const char* x) |
{ | { |
XmlWriter::append(out, x); | XmlWriter::append(out, x); |
|
|
} | } |
out << "HOST: " << host << "\r\n"; | out << "HOST: " << host << "\r\n"; |
out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; | out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; |
out << "Content-Length: " << contentLength << "\r\n"; |
OUTPUT_CONTENTLENGTH; |
if (acceptLanguages.size() > 0) | if (acceptLanguages.size() > 0) |
{ | { |
out << "Accept-Language: " << acceptLanguages << "\r\n"; | out << "Accept-Language: " << acceptLanguages << "\r\n"; |
|
|
{ | { |
out << "Content-Language: " << contentLanguages << "\r\n"; | out << "Content-Language: " << contentLanguages << "\r\n"; |
} | } |
|
|
|
// backdoor environment variable to turn OFF client requesting transfer |
|
// encoding. The default is on. to turn off, set this variable to zero. |
|
// This should be removed when stable. This should only be turned off in |
|
// a debugging/testing environment. |
|
|
|
static const char *clientTransferEncodingOff = |
|
getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST"); |
|
if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0') |
|
out << "TE: chunked, trailers" << "\r\n"; |
|
|
if (httpMethod == HTTP_METHOD_M_POST) | if (httpMethod == HTTP_METHOD_M_POST) |
{ | { |
out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns="; | out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns="; |
|
|
{ | { |
out << authenticationHeader << "\r\n"; | out << authenticationHeader << "\r\n"; |
} | } |
|
|
out << "\r\n"; | out << "\r\n"; |
} | } |
| |
|
|
out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n"; | out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n"; |
STAT_SERVERTIME | STAT_SERVERTIME |
out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; | out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; |
out << "Content-Length: " << contentLength << "\r\n"; |
OUTPUT_CONTENTLENGTH; |
|
|
if (contentLanguages.size() > 0) | if (contentLanguages.size() > 0) |
{ | { |
out << "Content-Language: " << contentLanguages << "\r\n"; | out << "Content-Language: " << contentLanguages << "\r\n"; |
|
|
// is usually intended to have content. But, for Kerberos this | // is usually intended to have content. But, for Kerberos this |
// may not always be the case so we need to indicate that there | // may not always be the case so we need to indicate that there |
// is no content | // is no content |
out << "Content-Length: 0" << "\r\n"; |
Uint32 contentLength = 0; |
|
OUTPUT_CONTENTLENGTH; |
out << content << "\r\n"; | out << content << "\r\n"; |
out << "\r\n"; | out << "\r\n"; |
| |
|
|
const String& messageId, | const String& messageId, |
HttpMethod httpMethod, | HttpMethod httpMethod, |
const ContentLanguages & httpContentLanguages, | const ContentLanguages & httpContentLanguages, |
const Array<Sint8>& body) |
const Array<Sint8>& body, |
|
Boolean isFirst, |
|
Boolean isLast) |
{ | { |
Array<Sint8> out; | Array<Sint8> out; |
Array<Sint8> tmp; |
|
| |
|
if (isFirst == true) |
|
{ |
|
// NOTE: temporarily put zero for content length. the http code |
|
// will later decide to fill in the length or remove it altogether |
|
appendMethodResponseHeader(out, httpMethod, httpContentLanguages, 0); |
_appendMessageElementBegin(out, messageId); | _appendMessageElementBegin(out, messageId); |
_appendSimpleRspElementBegin(out); | _appendSimpleRspElementBegin(out); |
_appendMethodResponseElementBegin(out, methodName); | _appendMethodResponseElementBegin(out, methodName); |
|
} |
|
|
|
if (body.size() != 0) |
|
{ |
out << body; | out << body; |
|
} |
|
|
|
if (isLast == true) |
|
{ |
_appendMethodResponseElementEnd(out); | _appendMethodResponseElementEnd(out); |
_appendSimpleRspElementEnd(out); | _appendSimpleRspElementEnd(out); |
_appendMessageElementEnd(out); | _appendMessageElementEnd(out); |
|
} |
| |
appendMethodResponseHeader(tmp, |
return out; |
httpMethod, |
|
httpContentLanguages, |
|
out.size()); |
|
tmp << out; |
|
|
|
return tmp; |
|
} | } |
| |
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ |
|
|
const String& messageId, | const String& messageId, |
HttpMethod httpMethod, | HttpMethod httpMethod, |
const ContentLanguages & httpContentLanguages, | const ContentLanguages & httpContentLanguages, |
const Array<Sint8>& body) |
const Array<Sint8>& body, |
|
Boolean isFirst, |
|
Boolean isLast) |
{ | { |
Array<Sint8> out; | Array<Sint8> out; |
Array<Sint8> tmp; |
|
| |
|
if (isFirst == true) |
|
{ |
|
// NOTE: temporarily put zero for content length. the http code |
|
// will later decide to fill in the length or remove it altogether |
|
appendMethodResponseHeader(out, httpMethod, httpContentLanguages, 0); |
_appendMessageElementBegin(out, messageId); | _appendMessageElementBegin(out, messageId); |
_appendSimpleRspElementBegin(out); | _appendSimpleRspElementBegin(out); |
_appendIMethodResponseElementBegin(out, iMethodName); | _appendIMethodResponseElementBegin(out, iMethodName); |
if (body.size() != 0) | if (body.size() != 0) |
{ |
|
_appendIReturnValueElementBegin(out); | _appendIReturnValueElementBegin(out); |
|
} |
|
|
|
if (body.size() != 0) |
|
{ |
out << body; | out << body; |
_appendIReturnValueElementEnd(out); |
|
} | } |
|
|
|
if (isLast == true) |
|
{ |
|
if (body.size() != 0) |
|
_appendIReturnValueElementEnd(out); |
_appendIMethodResponseElementEnd(out); | _appendIMethodResponseElementEnd(out); |
_appendSimpleRspElementEnd(out); | _appendSimpleRspElementEnd(out); |
_appendMessageElementEnd(out); | _appendMessageElementEnd(out); |
|
} |
| |
appendMethodResponseHeader(tmp, |
return out; |
httpMethod, |
|
httpContentLanguages, |
|
out.size()); |
|
tmp << out; |
|
|
|
return tmp; |
|
} | } |
| |
//------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ |
|
|
} | } |
out << "HOST: " << host << "\r\n"; | out << "HOST: " << host << "\r\n"; |
out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; | out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; |
out << "Content-Length: " << contentLength << "\r\n"; |
OUTPUT_CONTENTLENGTH; |
|
|
if (acceptLanguages.size() > 0) | if (acceptLanguages.size() > 0) |
{ | { |
out << "Accept-Language: " << acceptLanguages << "\r\n"; | out << "Accept-Language: " << acceptLanguages << "\r\n"; |
|
|
{ | { |
out << "Content-Language: " << contentLanguages << "\r\n"; | out << "Content-Language: " << contentLanguages << "\r\n"; |
} | } |
|
|
|
// backdoor environment variable to turn OFF client requesting transfer |
|
// encoding. The default is on. to turn off, set this variable to zero. |
|
// This should be removed when stable. This should only be turned off in |
|
// a debugging/testing environment. |
|
|
|
static const char *clientTransferEncodingOff = |
|
getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST"); |
|
if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0') |
|
out << "TE: chunked, trailers" << "\r\n"; |
|
|
if (httpMethod == HTTP_METHOD_M_POST) | if (httpMethod == HTTP_METHOD_M_POST) |
{ | { |
out << "Man: http://www.hp.com; ns="; | out << "Man: http://www.hp.com; ns="; |
|
|
{ | { |
out << authenticationHeader << "\r\n"; | out << authenticationHeader << "\r\n"; |
} | } |
|
|
out << "\r\n"; | out << "\r\n"; |
} | } |
| |
|
|
| |
out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n"; | out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n"; |
out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; | out << "Content-Type: application/xml; charset=\"utf-8\"\r\n"; |
out << "Content-Length: " << contentLength << "\r\n"; |
OUTPUT_CONTENTLENGTH; |
|
|
if (contentLanguages.size() > 0) | if (contentLanguages.size() > 0) |
{ | { |
out << "Content-Language: " << contentLanguages << "\r\n"; | out << "Content-Language: " << contentLanguages << "\r\n"; |
|
|
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |
| |
|
|