998951619f
We did not intend to imply our copyrights last forever Closes #759
156 linhas
4.8 KiB
C++
156 linhas
4.8 KiB
C++
/*
|
|
+----------------------------------------------------------------------+
|
|
| HipHop for PHP |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
|
|
| Copyright (c) 1997-2010 The PHP Group |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#include "hphp/runtime/ext/soap/soap.h"
|
|
#include "hphp/runtime/ext/soap/encoding.h"
|
|
|
|
namespace HPHP {
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
StaticString soapHeader::s_class_name("soapHeader");
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
SoapData::SoapData() : m_cache(WSDL_CACHE_MEMORY), m_cache_ttl(86400) {
|
|
for (int i = 0; s_defaultEncoding[i].type != END_KNOWN_TYPES; ++i){
|
|
encodeStatic &e = s_defaultEncoding[i];
|
|
|
|
encodePtr enc(new encode());
|
|
enc->details.type = e.type;
|
|
enc->details.type_str = e.type_str;
|
|
enc->details.ns = e.ns;
|
|
enc->to_zval = e.to_zval;
|
|
enc->to_xml = e.to_xml;
|
|
|
|
const encodeType &details = enc->details;
|
|
if (!details.type_str.empty()) {
|
|
string name = details.type_str;
|
|
if (!details.ns.empty()) {
|
|
name = string(details.ns) + ':' + name;
|
|
}
|
|
m_defEnc[name] = enc;
|
|
}
|
|
|
|
if (m_defEncIndex.find(details.type) == m_defEncIndex.end()) {
|
|
m_defEncIndex[details.type] = enc;
|
|
}
|
|
}
|
|
|
|
m_defEncNs[XSD_1999_NAMESPACE] = XSD_NS_PREFIX;
|
|
m_defEncNs[XSD_NAMESPACE] = XSD_NS_PREFIX;
|
|
m_defEncNs[XSI_NAMESPACE] = XSI_NS_PREFIX;
|
|
m_defEncNs[XML_NAMESPACE] = XML_NS_PREFIX;
|
|
m_defEncNs[SOAP_1_1_ENC_NAMESPACE] = SOAP_1_1_ENC_NS_PREFIX;
|
|
m_defEncNs[SOAP_1_2_ENC_NAMESPACE] = SOAP_1_2_ENC_NS_PREFIX;
|
|
}
|
|
|
|
sdl *SoapData::get_sdl(const char *uri, long cache_wsdl,
|
|
HttpClient *http /* = NULL */) {
|
|
sdlPtr sdl = get_sdl_impl(uri, cache_wsdl, http);
|
|
if (sdl) {
|
|
// holding it for the entire request life time, so soapserver and
|
|
// soapclient can use sdl* without being deleted
|
|
m_sdls.push_back(sdl);
|
|
return sdl.get();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
encodeMap *SoapData::register_typemap(encodeMapPtr typemap) {
|
|
if (typemap) {
|
|
// holding it for the entire request life time, so soapserver and
|
|
// soapclient can use encodeMap* without being deleted
|
|
m_typemaps.push_back(typemap);
|
|
return typemap.get();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void SoapData::register_encoding(xmlCharEncodingHandlerPtr encoding) {
|
|
if (encoding) {
|
|
m_encodings.push_back(encoding);
|
|
}
|
|
}
|
|
|
|
sdlPtr SoapData::get_sdl_impl(const char *uri, long cache_wsdl,
|
|
HttpClient *http) {
|
|
if (cache_wsdl & WSDL_CACHE_MEMORY) {
|
|
sdlCache::iterator iter = m_mem_cache.find(uri);
|
|
if (iter != m_mem_cache.end()) {
|
|
sdlCacheBucketPtr p = iter->second;
|
|
if (p->time >= time(0) - m_cache_ttl) {
|
|
return p->sdl;
|
|
}
|
|
/* in-memory cache entry is expired */
|
|
m_mem_cache.erase(iter);
|
|
}
|
|
}
|
|
|
|
const char *old = m_error_code;
|
|
m_error_code = "WSDL";
|
|
sdlPtr sdl = load_wsdl((char*)uri, http);
|
|
m_error_code = old;
|
|
|
|
if (sdl && (cache_wsdl & WSDL_CACHE_MEMORY)) {
|
|
sdlCacheBucketPtr p(new sdlCacheBucket());
|
|
p->sdl = sdl;
|
|
p->time = time(0);
|
|
m_mem_cache[uri] = p;
|
|
}
|
|
|
|
return sdl;
|
|
}
|
|
|
|
void SoapData::reset() {
|
|
m_soap_version = SOAP_1_1;
|
|
m_sdl = NULL;
|
|
m_encoding = NULL;
|
|
m_classmap.reset();
|
|
m_typemap = NULL;
|
|
m_features = 0;
|
|
|
|
m_use_soap_error_handler = false;
|
|
m_error_code = NULL;
|
|
m_error_object.reset();
|
|
|
|
m_cur_uniq_ns = 0;
|
|
m_cur_uniq_ref = 0;
|
|
m_ref_map.reset();
|
|
|
|
m_sdls.clear();
|
|
m_typemaps.clear();
|
|
|
|
for (unsigned int i = 0; i < m_encodings.size(); i++) {
|
|
xmlCharEncCloseFunc(m_encodings[i]);
|
|
}
|
|
m_encodings.clear();
|
|
}
|
|
|
|
IMPLEMENT_REQUEST_LOCAL(SoapData, s_soap_data);
|
|
IMPLEMENT_OBJECT_ALLOCATION(soapHeader);
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
SoapException::SoapException(const char *fmt, ...) {
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
format((std::string("SOAP_ERROR: ") + fmt).c_str(), ap);
|
|
va_end(ap);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
}
|