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
