I did submit these suggested changes a long time ago. Either occurrence or
start_line would do what you want. (I cannot remember why they did not get
put in the main version - there may have been a good reason.)

Peter

Peter Higginson
Newport Networks Ltd,
Direct line 01494 470694
http://www.newport-networks.com/

=========================================================================

From: Peter Higginson [mailto:[EMAIL PROTECTED] 
Sent: 26 August 2005 10:07
To: 'Siddharth Angrish'; '[email protected]'
Subject: RE: [Sipp-users] Query regarding sipp regexp

Some changes we have made in our local copy to meet this requirement are to
add the following functionality to regexp for the "hdr" matching case:

1)      case_indep="true" to look for a header ignoring case
2)      occurrence="n" to find the nth occurrence of a header
3)      start_line="true" to look only at start of line

The occurrence option will allow you to set different variables to each of
the headers you are looking for.

I have also fixed a bug which might crash SIPp for packets longer than 1024
bytes (this may be already incorporated). Note that the current hdr match
looks anywhere in the message and I have left this as the default (with
start of line as the option).

The code changes are below (I've done them based on the version we use, but
I think they match up with the current versions):

In scenario.cpp, change this section of code:

            tmpAction.setVarType(CAction::E_VT_REGEXP);
            tmpAction.setActionType(CAction::E_AT_ASSIGN_FROM_REGEXP);
            
            if(ptr = xp_get_value((char *)"search_in")){
              if(!strcmp(ptr, (char *)"msg")) {
                tmpAction.setLookingPlace(CAction::E_LP_MSG);
                tmpAction.setLookingChar(NULL);
              } else if (!strcmp(ptr, (char *)"hdr")) {
                if(ptr = xp_get_value((char *)"header")) {
                  if(strlen(ptr) > 0) {
                    tmpAction.setLookingPlace(CAction::E_LP_HDR);
                    tmpAction.setLookingChar(ptr);
                  } else {
                    tmpAction.setLookingPlace(CAction::E_LP_MSG);
                    tmpAction.setLookingChar(NULL);
                  }

To:

            tmpAction.setVarType(CAction::E_VT_REGEXP);
            tmpAction.setActionType(CAction::E_AT_ASSIGN_FROM_REGEXP);

            // warning - although these are detected for both msg and hdr
            // they are only implemented for search_in="hdr"
            if ( 0 != ( ptr = xp_get_value((char *)"case_indep") ) &&
                0 == strcmp(ptr, "true")) tmpAction.setCaseIndep(true);
            else tmpAction.setCaseIndep(false);

            if ( 0 != ( ptr = xp_get_value((char *)"start_line") ) &&
                0 == strcmp(ptr, "true")) tmpAction.setHeadersOnly(true);
            else tmpAction.setHeadersOnly(false);

            if ( 0 != ( ptr = xp_get_value((char *)"search_in") ) ) {
              tmpAction.setOccurrence(1);

              if ( 0 == strcmp(ptr, (char *)"msg") ) {
                tmpAction.setLookingPlace(CAction::E_LP_MSG);
                tmpAction.setLookingChar(NULL);
              } else if (!strcmp(ptr, (char *)"hdr")) {
                if ( 0 != ( ptr = xp_get_value((char *)"header") ) ) {
                  if ( 0 < strlen(ptr) ) {
                    tmpAction.setLookingPlace(CAction::E_LP_HDR);
                    tmpAction.setLookingChar(ptr);
                    if (0 != (ptr = xp_get_value((char *)"occurrence"))) {
                      tmpAction.setOccurrence(atol(ptr));
                    }
                  } else {
                    tmpAction.setLookingPlace(CAction::E_LP_MSG);
                    tmpAction.setLookingChar(NULL);
                  }

In actions.hpp, after

    char*          getLookingChar();

Add:
    bool           getCaseIndep();
    int            getOccurrence();
    bool           getHeadersOnly();

After:
    void setAction       (CAction        P_action);

Add:
    void setCaseIndep    (bool           P_value);
    void setOccurrence   (int            P_value);
    void setHeadersOnly  (bool           P_value);

and after:
      int            M_varId;

Add:
      bool           M_caseIndep;
      int            M_occurrence;
      bool           M_headersOnly;

In actions.cpp, after:

char*          CAction::getLookingChar()  { return(M_lookingChar);  }

Add:
bool           CAction::getCaseIndep()    { return(M_caseIndep);    }
int            CAction::getOccurrence()   { return(M_occurrence);    }
bool           CAction::getHeadersOnly()  { return(M_headersOnly);  }

After:
void CAction::setVarId        (int            P_value)
{ M_varId        = P_value; }

Add:
void CAction::setCaseIndep    (bool           P_value)
{ M_caseIndep    = P_value; }
void CAction::setOccurrence   (int            P_value)
{ M_occurrence    = P_value; }
void CAction::setHeadersOnly  (bool           P_value)
{ M_headersOnly  = P_value; }

After:
  setCheckIt      ( P_action.getCheckIt()      );

Add:
  setCaseIndep    ( P_action.getCaseIndep()    );
  setOccurrence   ( P_action.getOccurrence()   );
  setHeadersOnly  ( P_action.getHeadersOnly()  );

After:
  M_lookingChar  = NULL;

Add:
  M_caseIndep    = false;
  M_occurrence    = 1;
  M_headersOnly  = true;

After:
  setCheckIt      ( P_action.M_checkIt      );

Add:
  setCaseIndep    ( P_action.M_caseIndep    );
  setOccurrence   ( P_action.M_occurrence   );
  setHeadersOnly  ( P_action.M_headersOnly  );

In call.hpp, change:

   void  extractSubMessage(char * msg, char * matchingString, char* result);

To:
   void  extractSubMessage(char * msg, char * matchingString, char* result,
                        bool case_indep, int occurrence, bool headers);

In call.cpp, change the call to extractSubMessage to become:

                          extractSubMessage
                            (msg,
                             currentAction->getLookingChar(),
                             msgPart,
                             currentAction->getCaseIndep(),
                             currentAction->getOccurrence(), 
                             currentAction->getHeadersOnly());

and then replace the existing routine extractSubMessage with this:

void CallContext::extractSubMessage(char * msg, char * matchingString, char*
result,
                bool case_indep, int occurrence, bool headers) {
  char *ptr, *ptr1;
  int sizeOf;
  int i = 0;
  int len = strlen(matchingString);
  char mat1 = tolower(*matchingString);
  char mat2 = toupper(*matchingString);

  ptr = msg;
  while (*ptr) {
    if (!case_indep) {
      ptr = strstr(ptr, matchingString);
      if (ptr == NULL) break;
      if (headers == true && ptr != msg && *(ptr-1) != '\n') {
        ++ptr;
        continue;
      }
    } else {
      if (headers) {
        if (ptr != msg) {
          ptr = strchr(ptr, '\n');
          if (ptr == NULL) break;
          ++ptr;
          if (*ptr == 0) break;
        }
      } else {
        ptr1 = strchr(ptr, mat1);
        ptr = strchr(ptr, mat2);
        if (ptr == NULL) {
          if (ptr1 == NULL) break;
          ptr = ptr1;
        } else {
          if (ptr1 != NULL && ptr1 < ptr) ptr = ptr1;
        }
      }
      if (strncasecmp(ptr, matchingString, len) != 0) {
        ++ptr;
        continue;
      }
    }
    // here with ptr pointing to a matching string
    if (occurrence <= 1) break;
    --occurrence;
    ++ptr;
  }

  if(ptr != NULL && *ptr != 0) {
    strncpy(result, ptr+len, MAX_SUB_MESSAGE_LENGTH);
    sizeOf = strlen(result);
    if(sizeOf >= MAX_SUB_MESSAGE_LENGTH)
        sizeOf = MAX_SUB_MESSAGE_LENGTH-1;
    while((i<sizeOf) && (result[i] != '\n') && (result[i] != '\r'))
        i++;
    result[i] = '\0';
  } else {
    result[0] = '\0';
  }
}

Hopefully Olivier will add this to the main version. Let me know of any
issues or problems.

Regards,
Peter


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Thomas
Rosenblatt
Sent: 13 February 2007 09:40
To: [email protected]
Subject: [Sipp-users] Route and Record-Route...

Hi everyone,

In my sipp scenario, I need to parse Route and Record-Route using 
header="Route" and header="Record-Route".
The problem is that record-route is inserted before route in my SIP 
request, so when I use the header="Route", it retrieves the Record-Route 
field...
I've read the source file and it seems that the problem comes out from 
xp_get_value and the strstr search.
This comment is added :
// FIXME: potential BUG in parser: we must retrieve full word,
// so the use of strstr as it is is not enough.
// we should check that the retrieved word is not a piece of another one.


Has somebody fixed it ?

Thank you,

Thomas Rosenblatt.

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job
easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sipp-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sipp-users



---------------------------------------------------------------------------------------------
This e-mail may contain confidential and/or privileged information.
If you are not the intended recipient (or have received this e-mail in error) 
please
notify the sender immediately and delete this e-mail. Any unauthorized copying,
disclosure or distribution of the contents in this e-mail is strictly forbidden.
---------------------------------------------------------------------------------------------
Newport Networks Limited is registered in England. Registration number 4067591.
Registered office: 6 St. Andrew Street, London EC4A 3LX
---------------------------------------------------------------------------------------------


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sipp-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sipp-users

Reply via email to