Add wxWebRequest::SplitParameters method
This method is adapted for use in wxWidgets from the Poco library.
This commit is contained in:
@@ -89,6 +89,12 @@ public:
|
|||||||
|
|
||||||
void SetState(State state, const wxString& failMsg = "");
|
void SetState(State state, const wxString& failMsg = "");
|
||||||
|
|
||||||
|
static void SplitParameters(const wxString& s, wxString& value,
|
||||||
|
wxWebRequestHeaderMap& parameters);
|
||||||
|
|
||||||
|
static void SplitParameters(const wxString::const_iterator& begin,
|
||||||
|
const wxString::const_iterator& end, wxWebRequestHeaderMap& parameters);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxString m_method;
|
wxString m_method;
|
||||||
Storage m_storage;
|
Storage m_storage;
|
||||||
|
@@ -320,6 +320,36 @@ public:
|
|||||||
*/
|
*/
|
||||||
wxFileOffset GetBytesExpectedToReceive() const;
|
wxFileOffset GetBytesExpectedToReceive() const;
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Splits the given string into a value and a collection of parameters.
|
||||||
|
Parameters are expected to be separated by semicolons.
|
||||||
|
Enclosing quotes of parameter values are removed.
|
||||||
|
|
||||||
|
For example, the string
|
||||||
|
@code
|
||||||
|
multipart/mixed; boundary="MIME_boundary_01234567"
|
||||||
|
@endcode
|
||||||
|
is split into the value
|
||||||
|
@code
|
||||||
|
multipart/mixed
|
||||||
|
@endcode
|
||||||
|
and the parameter
|
||||||
|
@code
|
||||||
|
boundary -> MIME_boundary_01234567
|
||||||
|
@endcode
|
||||||
|
*/
|
||||||
|
static void SplitParameters(const wxString& s, wxString& value,
|
||||||
|
wxWebRequestHeaderMap& parameters);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Splits the given string into a collection of parameters.
|
||||||
|
Parameters are expected to be separated by semicolons.
|
||||||
|
|
||||||
|
Enclosing quotes of parameter values are removed.
|
||||||
|
*/
|
||||||
|
static void SplitParameters(const wxString::const_iterator& begin,
|
||||||
|
const wxString::const_iterator& end, wxWebRequestHeaderMap& parameters);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -114,6 +114,69 @@ void wxWebRequest::SetState(State state, const wxString & failMsg)
|
|||||||
CallAfter(&wxWebRequest::ProcessStateEvent, state, failMsg);
|
CallAfter(&wxWebRequest::ProcessStateEvent, state, failMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The SplitParamaters implementation is adapted to wxWidgets
|
||||||
|
// from Poco::Net::MessageHeader::splitParameters
|
||||||
|
|
||||||
|
void wxWebRequest::SplitParameters(const wxString& s, wxString& value,
|
||||||
|
wxWebRequestHeaderMap& parameters)
|
||||||
|
{
|
||||||
|
value.clear();
|
||||||
|
parameters.clear();
|
||||||
|
wxString::const_iterator it = s.begin();
|
||||||
|
wxString::const_iterator end = s.end();
|
||||||
|
while ( it != end && wxIsspace(*it) ) ++it;
|
||||||
|
while ( it != end && *it != ';' ) value += *it++;
|
||||||
|
value.Trim();
|
||||||
|
if ( it != end ) ++it;
|
||||||
|
SplitParameters(it, end, parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxWebRequest::SplitParameters(const wxString::const_iterator& begin,
|
||||||
|
const wxString::const_iterator& end, wxWebRequestHeaderMap& parameters)
|
||||||
|
{
|
||||||
|
wxString pname;
|
||||||
|
wxString pvalue;
|
||||||
|
pname.reserve(32);
|
||||||
|
pvalue.reserve(64);
|
||||||
|
wxString::const_iterator it = begin;
|
||||||
|
while ( it != end )
|
||||||
|
{
|
||||||
|
pname.clear();
|
||||||
|
pvalue.clear();
|
||||||
|
while ( it != end && wxIsspace(*it) ) ++it;
|
||||||
|
while ( it != end && *it != '=' && *it != ';' ) pname += *it++;
|
||||||
|
pname.Trim();
|
||||||
|
if ( it != end && *it != ';' ) ++it;
|
||||||
|
while ( it != end && wxIsspace(*it) ) ++it;
|
||||||
|
while ( it != end && *it != ';' )
|
||||||
|
{
|
||||||
|
if ( *it == '"' )
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
while ( it != end && *it != '"' )
|
||||||
|
{
|
||||||
|
if ( *it == '\\' )
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
if ( it != end ) pvalue += *it++;
|
||||||
|
}
|
||||||
|
else pvalue += *it++;
|
||||||
|
}
|
||||||
|
if ( it != end ) ++it;
|
||||||
|
}
|
||||||
|
else if ( *it == '\\' )
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
if ( it != end ) pvalue += *it++;
|
||||||
|
}
|
||||||
|
else pvalue += *it++;
|
||||||
|
}
|
||||||
|
pvalue.Trim();
|
||||||
|
if ( !pname.empty() ) parameters[pname] = pvalue;
|
||||||
|
if ( it != end ) ++it;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void wxWebRequest::ProcessStateEvent(State state, const wxString& failMsg)
|
void wxWebRequest::ProcessStateEvent(State state, const wxString& failMsg)
|
||||||
{
|
{
|
||||||
if (!IsActiveState(state) && GetResponse())
|
if (!IsActiveState(state) && GetResponse())
|
||||||
|
@@ -197,4 +197,17 @@ TEST_CASE_METHOD(RequestFixture, "WebRequest", "[net][.]")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("WebRequestUtils", "[net]")
|
||||||
|
{
|
||||||
|
wxString value;
|
||||||
|
wxWebRequestHeaderMap params;
|
||||||
|
|
||||||
|
wxString header = "multipart/mixed; boundary=\"MIME_boundary_01234567\"";
|
||||||
|
|
||||||
|
wxWebRequest::SplitParameters(header, value, params);
|
||||||
|
REQUIRE( value == "multipart/mixed" );
|
||||||
|
REQUIRE( params.size() == 1 );
|
||||||
|
REQUIRE( params["boundary"] == "MIME_boundary_01234567" );
|
||||||
|
}
|
||||||
|
|
||||||
#endif // wxUSE_WEBREQUEST
|
#endif // wxUSE_WEBREQUEST
|
||||||
|
Reference in New Issue
Block a user