Arquivos
hhvm/hphp/runtime/ext/soap/soap.cpp
T
Tim Starling 998951619f update copyright date
We did not intend to imply our copyrights last forever

Closes #759
2013-06-03 12:43:56 -07:00

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);
}
///////////////////////////////////////////////////////////////////////////////
}