Found the solution (again). In axis2_libcurl.c it only appears to be
enabling COOKIES if its not already set....
{
axis2_bool_t manage_session;
manage_session = axis2_msg_ctx_get_manage_session(msg_ctx, env);
if (manage_session == AXIS2_TRUE)
{
if (data->cookies == AXIS2_FALSE)
{
/* Ensure cookies enabled to manage session */
/* Pass empty cookie string to enable cookies */
curl_easy_setopt(handler, CURLOPT_COOKIEFILE, " ");
data->cookies = AXIS2_TRUE;
}
}
else if (data->cookies == AXIS2_TRUE)
{
/* Pass special string ALL to reset cookies if any have been
enabled. */
/* If cookies have ever been enabled, we reset every time as
long as
manage_session is false, as there is no clear curl option to
turn off the cookie engine once enabled. */
curl_easy_setopt(handler, CURLOPT_COOKIELIST, AXIS2_ALL);
}
}
I replace the above lines with a simple call
curl_easy_setopt (handler, CURLOPT_COOKIEFILE, "$nonexistant/file");
I recognize that it probably isn't correct in the general case to do this -
but its working for my specific case.
richard.
On Sun, Apr 24, 2011 at 6:32 PM, Richard Offer <[email protected]> wrote:
>
> I found the solution to setting the cookie from the skeleton, so I thought
> I’d record it for posterity.
>
>
>
>
>
> axis2_msg_ctx * ctx = outCtx->getAxis2MessageContext(); /// using
> WSO2WSF C++
>
>
>
> const axutil_env_t *env = wso2wsf::Environment::getEnv();
>
>
>
> if ( ctx ) {
>
>
>
> axis2_http_out_transport_info_t *out_info =
>
> (axis2_http_out_transport_info_t
> *)axis2_msg_ctx_get_out_transport_info(ctx, env);
>
>
>
> axis2_char_t *uuid = axutil_uuid_gen(env);
>
>
>
> axis2_char_t * cookie = axutil_strcat(env,
>
> "session=\"",
>
> uuid,
>
> "\"; Path=/;",
>
> NULL);
>
>
>
> if ( out_info ) {
>
> AXIS2_HTTP_OUT_TRANSPORT_INFO_SET_COOKIE_HEADER(out_info,
> env, cookie);
>
> }
>
> }
>
>
>
>
>
> I see the “Set-Cookie” header returned. Which is great J
>
>
>
>
>
> However the client doesn’t seem to save and add the Cookie header for the
> next request.
>
>
>
>
>
> I have scope=”transportsession” in the services.xml. I’m also using libcurl
> as the sender library.
>
>
>
> (I have seen references to SCOPE_REQUEST in axis2_libcurl_send – not sure
> if those are correct or not ?)
>
>
>
>
>
>
>
> From the various lists and forums it just seems that with libcurl client
> side “cookies just work”, but I’ve stepped through the code and can’t see an
> obvious place where axis2_libcurl stores the returned header value. Since
> the curl code is reset for every axis2_libcurl_send(), I assumed that
> something outside of libcurl must be storing the cookies between requests.
> Am I mis-reading the code ?
>
>
>
> This is all with Axis 1.7 RC12
>
>
>
>
>
> Any clues on where to look next ?
>
>
>
> I am getting a bit concerned that I may have selected the wrong SOAP
> library, there seems to be what I would have thought were “basic
> capabilities” (i.e. cookies) missing in the released version. When the trunk
> hasn’t been touched for 4months – that’s not a sign of project vitality. Is
> no one doing SOAP in C/C++ anymore ?
>
>
>
>
>
> Richard.
>
>
>
> On Mon, Apr 18, 2011 at 12:02 PM, Richard Offer <[email protected]>wrote:
>
>>
>> Hi,
>>
>> Its taken me a while to figure out how to do this, but its now crashing -
>> so that's a sign I'm getting somewhere (hopefully) :-)
>>
>>
>> In the service skeleton I have
>>
>> axis2_out_transport_info * tInfo =
>> axis2_msg_ctx_get_out_transport_info( ctx, env );
>>
>> if ( tInfo ) {
>>
>> axis2_char_t *uuid = axutil_uuid_gen(env);
>>
>> axis2_char_t * cookie = axutil_strcat(env,
>> "session=\"",
>> uuid,
>> "\"; Path=/;",
>> NULL);
>>
>> if ( cookie ) {
>>
>> AXIS2_OUT_TRANSPORT_INFO_SET_COOKIE_HEADER( tInfo,
>> env, cookie );
>> }
>> }
>>
>>
>> Its crashing at the MACRO - tInfo is a valid pointer, but its points to
>> NULL.
>>
>>
>> What;s the correct way to cause the Set-Cookie header to be sent with
>> content that I define ?
>>
>>
>> Thanks
>>
>>
>> richard.
>>
>
>