gSOAP的正则表达式验证
问题描述:
我在我的WSDL的模式限制,这样的定义:gSOAP的正则表达式验证
<complexType name="xxxXXX">
<attribute name="state" use="optional">
<simpleType>
<restriction base="xs:string">
<pattern value="((\-1)|[0-5])(;((\-1)|[0-5]))*"/>
</restriction>
</simpleType>
</attribute>
</complexType>
但是,当我一个请求与状态=“” gSOAP的接受它。我看到我必须定义函数fsvalidate
(这里是https://www.genivia.com/doc/databinding/html/),但似乎从未调用(不触发断点)。 Futhermore,生成gSOAP的代码不包含正则表达式,即使工具wsdl2h产生这样的:
class ns1__xxxXXX
{ public:
@/// Content pattern is "((\\-1)|[0-5])(;((\\-1)|[0-5]))*".
std::string
*state 0; ///< Optional attribute.
/// A handle to the soap struct that manages this instance (automatically set).
struct soap *soap ;
};
也许我错过了一代一些选择,但我没有找到wsdl2h anythink(https://linux.die.net/man/1/wsdl2h ),也不soapcpp2
其他信息:
我搜索fsvalidate在gSOAP的的生成的代码,我发现:
#ifndef WITH_LEANER
if (pattern && soap->fsvalidate && (soap->error = soap->fsvalidate(soap, pattern, s)))
return NULL;
#endif
但是,它似乎总是用NULL模式调用。(!(t = soap_string_in(soap, 1, 0, -1, NULL)))
。我使用gSOAP 2.8.23。
- 编辑:
我跟着@亚历克斯的意见,以从中提取复杂类型是这样的类型:
<xs:simpleType name="stateType">
<xs:restriction base="xs:string">
<xs:pattern value="((\-1)|[0-5])(;((\-1)|[0-5]))*"/>
</xs:restriction>
</xs:simpleType>
<complexType name="xxxXXX">
<attribute name="state" type="tns:stateType" use="optional" />
</complexType>
而且wsdl2h似乎产生了好事:
/// Content pattern is "((\\-1)|[0-5])(;((\\-1)|[0-5]))*".
typedef std::string ns1__stateType "((\\-1)|[0-5])(;((\\-1)|[0-5]))*";
class ns1__xxxXXX
{ public:
/// Attribute "state" of XSD type "http://new.webservice.namespace":stateType.
@ns1__stateType* state 0;
但gsoap生成的最终类型是std :: string:
class SOAP_CMAC ns1__xxxXXX
{
public:
std::string *state;
,当然,它不验证正则表达式。
答
看起来,局部正则表达式模式被忽略(即局部到类),但非本地模式工作正常。强制执行图案验证,该图案具有要从的complexType(从类抬起)抬起:
typedef std::string ns1__xxxXXX_string "((\\-1)|[0-5])(;((\\-1)|[0-5]))*";
class ns1__xxxXXX
{ public:
ns1__xxxXXX_string *state;
然后设置fsvalidate()回调所要检查的图案串的内容。
这是一个令人讨厌的限制。我建议向https://sourceforge.net/p/gsoap2/bugs/提交bug /功能请求
感谢您的回答,请参阅我的编辑以获取更多信息。 – VSA
我将gsoap的版本更新到了2.8.44,现在它可以正常工作。 – VSA