By | 05 May 2014

Parsing Cookies in Integration Broker Request Handler

I have been doing a tremendous amount of integration broker work lately. In one project, I had to retrieve a cookie submitted by the requester and do some processing with it. The integration broker cookie API (&MSG.IBInfo.IBConnectorInfo.Cookies) returns the cookies with all the cookies and key value pairs as one large string. As far as I can tell from the current state of the documentation, you have to write your own cookie parser on the string returned.

Cookies are submitted in the HTTP headers like this:

Cookie: COOKIE_NAME1=COOKIE_1_VALUE; COOKIE_NAME2=COOKIE_2_VALUE; COOKIE_NAME3=COOKIE_3_VALUE

I threw together a method called getCookieFromRequest that is meant to live inside your subscription handler code. Here is the method I wrote that splits the cookie by ; and then again by =.

You ask it for a cookie key name and it will return back the value if it exists.

method getCookieFromRequest
   /+ &MSG as Message, +/
   /+ &cookieName as String +/
   /+ Returns String +/
   
   Local string &requestCookies;
   
   try
      
      &requestCookies = &MSG.IBInfo.IBConnectorInfo.Cookies;
      
      Local array of string &aInboundCookiesKeyValues;
      &aInboundCookiesKeyValues = CreateArrayRept("", 0);
      &aInboundCookiesKeyValues = Split(&requestCookies, ";");
      
      Local integer &i;
      
      Local array of string &aKeyValue;
      
      
      Local integer &cookieValLocationStart;
      For &i = 1 To &aInboundCookiesKeyValues.Len
         
         
         &aKeyValue = Split(&aInboundCookiesKeyValues [&i], "=");
         
         If LTrim(RTrim(&aKeyValue [1])) = &cookieName Then
            Return &aKeyValue [2];
         End-If;
      End-For;
      
      Return "";
      
      
   catch Exception &E
      Return "";;
   end-try;
   
   
end-method;

Here is a sample of how it would sit in an subscription handler. In this example, we are going after the PS_TOKEN cookie.

class INBOUND_TESTER implements PS_PT:Integration:IRequestHandler
   method onRequest(&MSG As Message) Returns Message;
   method getCookieFromRequest(&MSG As Message, &cookieName As string) Returns string;
   
   
end-class;

method onRequest
   /+ &MSG as Message +/
   /+ Returns Message +/
   /+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/
   
   
   /* Setup response xml body */
   
   Local Message &response;
   &response = CreateMessage(Operation.CHG_TEST, %IntBroker_Response);
   Local XmlDoc &xmlout;
   
   Local XmlNode &childNode;
   &xmlout = CreateXmlDoc("<?xml version='1.0'?><response/>");
   
   Local string &cValue;
   
   &cValue = %This.getCookieFromRequest(&MSG, "PS_TOKEN");
 

   if all(&cValue) then
      /* Do something with cookie */
   end-if; 

   Return &response;
   
end-method;

method getCookieFromRequest
  ....snip.....

Let me know if you find a better way or think you have improvements on this.