mirror of https://github.com/sipwise/kamailio.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.2 KiB
97 lines
2.2 KiB
/*
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2007 iptelorg GmbH
|
|
*
|
|
* This file is part of ser, a free SIP server.
|
|
*
|
|
* ser is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version
|
|
*
|
|
* ser is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* History:
|
|
* --------
|
|
* 2007-07-27 created by andrei
|
|
*/
|
|
|
|
/*! \file
|
|
* \brief Parser :: Retry-After: header parser
|
|
*
|
|
* \ingroup parser
|
|
*/
|
|
|
|
|
|
#include "../comp_defs.h"
|
|
#include "parse_retry_after.h"
|
|
#include "parser_f.h" /* eat_space_end and so on */
|
|
#include "parse_def.h"
|
|
#include "../dprint.h"
|
|
#include "../mem/mem.h"
|
|
|
|
/*! \brief Parse the Retry-after header field */
|
|
char* parse_retry_after(char *buf, char* end, unsigned* after, int* err)
|
|
{
|
|
char *t;
|
|
int i;
|
|
unsigned val;
|
|
|
|
val=0;
|
|
t=buf;
|
|
|
|
t=eat_lws_end(t, end);
|
|
if (t>=end) goto error;
|
|
for (i=0; t<end; i++,t++){
|
|
if ((*t >= '0') && (*t <= '9')){
|
|
val=val*10+(*t-'0');
|
|
}else{
|
|
switch(*t){
|
|
/* for now we don't care about retry-after params or comment*/
|
|
case ' ':
|
|
case '\t':
|
|
case ';':
|
|
case '\r':
|
|
case '\n':
|
|
goto found;
|
|
default:
|
|
/* invalid char */
|
|
goto error;
|
|
}
|
|
}
|
|
}
|
|
goto error_nocrlf; /* end reached without encountering cr or lf */
|
|
found:
|
|
if (i>10 || i==0) /* too many or too few digits */
|
|
goto error;
|
|
*after=val;
|
|
/* find the end of header */
|
|
for (; t<end; t++){
|
|
if (*t=='\n'){
|
|
if (((t+1)<end) && (*(t+1)=='\r'))
|
|
t++;
|
|
if (((t+1)<end) && (*(t+1)==' ' || *(t+1)=='\t')){
|
|
t++;
|
|
continue; /* line folding ... */
|
|
}
|
|
*err=0;
|
|
return t+1;
|
|
}
|
|
}
|
|
error_nocrlf:
|
|
LOG(L_ERR, "ERROR: parse_retry_after: strange EoHF\n");
|
|
goto error;
|
|
error:
|
|
LOG(L_ERR, "ERROR: parse_retry_after: bad Retry-After header \n");
|
|
*err=1;
|
|
return t;
|
|
}
|