Changeset 1389


Ignore:
Timestamp:
Jun 26, 2007 12:25:11 AM (12 years ago)
Author:
bennylp
Message:

Ticket #342: added configuration to send compact form of SIP headers

Location:
pjproject/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r1369 r1389  
    9696#endif 
    9797pj_status_t app_destroy(void); 
     98 
     99extern pj_bool_t pjsip_use_compact_form; 
    98100 
    99101/***************************************************************************** 
     
    28852887    pj_status_t status; 
    28862888 
     2889    //pjsip_use_compact_form = PJ_TRUE; 
     2890 
    28872891    /* Create pjsua */ 
    28882892    status = pjsua_create(); 
  • pjproject/trunk/pjsip/include/pjsip/print_util.h

    r1240 r1389  
    102102typedef int   (*pjsip_hdr_print_fptr)(void *hdr, char *buf, pj_size_t len); 
    103103 
    104 extern const pj_str_t pjsip_hdr_names[]; 
     104typedef struct pjsip_hdr_name_info_t 
     105{ 
     106    char        *name; 
     107    unsigned     name_len; 
     108    char        *sname; 
     109} pjsip_hdr_name_info_t; 
     110 
     111extern const pjsip_hdr_name_info_t pjsip_hdr_names[]; 
    105112 
    106113PJ_INLINE(void) init_hdr(void *hptr, pjsip_hdr_e htype, void *vptr) 
     
    108115    pjsip_hdr *hdr = (pjsip_hdr*) hptr; 
    109116    hdr->type = htype; 
    110     hdr->name = hdr->sname = pjsip_hdr_names[htype]; 
     117    hdr->name.ptr = pjsip_hdr_names[htype].name; 
     118    hdr->name.slen = pjsip_hdr_names[htype].name_len; 
     119    if (pjsip_hdr_names[htype].sname) { 
     120        hdr->sname.ptr = pjsip_hdr_names[htype].sname; 
     121        hdr->sname.slen = 1; 
     122    } else { 
     123        hdr->sname = hdr->name; 
     124    } 
    111125    hdr->vptr = (pjsip_hdr_vptr*) vptr; 
    112126    pj_list_init(hdr); 
  • pjproject/trunk/pjsip/include/pjsip/sip_config.h

    r1244 r1389  
    130130 
    131131/** 
     132 * Encode SIP headers in their short forms to reduce size. By default, 
     133 * SIP headers in outgoing messages will be encoded in their full names.  
     134 * If this option is enabled, then SIP headers for outgoing messages 
     135 * will be encoded in their short forms, to reduce message size.  
     136 * Note that this does not affect the ability of PJSIP to parse incoming 
     137 * SIP messages, as the parser always supports parsing both the long 
     138 * and short version of the headers. 
     139 * 
     140 * Note that there is also an undocumented variable defined in sip_msg.c 
     141 * to control whether compact form should be used for encoding SIP 
     142 * headers. The default value of this variable is PJSIP_ENCODE_SHORT_HNAME. 
     143 * To change PJSIP behavior during run-time, application can use the  
     144 * following construct: 
     145 * 
     146 \verbatim 
     147   extern pj_bool_t pjsip_use_compact_form; 
     148  
     149   // enable compact form 
     150   pjsip_use_compact_form = PJ_TRUE; 
     151 \endverbatim 
     152 * 
     153 * Default is 0 (no) 
     154 */ 
     155#ifndef PJSIP_ENCODE_SHORT_HNAME 
     156#   define PJSIP_ENCODE_SHORT_HNAME     0 
     157#endif 
     158 
     159 
     160/** 
    132161 * Allow SIP modules removal or insertions during operation? 
    133162 * If yes, then locking will be employed when endpoint need to 
  • pjproject/trunk/pjsip/src/pjsip/sip_msg.c

    r1266 r1389  
    4343}; 
    4444 
    45 const pj_str_t pjsip_hdr_names[] =  
    46 { 
    47     { "Accept",              6 },   // PJSIP_H_ACCEPT, 
    48     { "Accept-Encoding",    15 },   // PJSIP_H_ACCEPT_ENCODING, 
    49     { "Accept-Language",    15 },   // PJSIP_H_ACCEPT_LANGUAGE, 
    50     { "Alert-Info",         10 },   // PJSIP_H_ALERT_INFO, 
    51     { "Allow",               5 },   // PJSIP_H_ALLOW, 
    52     { "Authentication-Info",19 },   // PJSIP_H_AUTHENTICATION_INFO, 
    53     { "Authorization",      13 },   // PJSIP_H_AUTHORIZATION, 
    54     { "Call-ID",             7 },   // PJSIP_H_CALL_ID, 
    55     { "Call-Info",           9 },   // PJSIP_H_CALL_INFO, 
    56     { "Contact",             7 },   // PJSIP_H_CONTACT, 
    57     { "Content-Disposition",19 },   // PJSIP_H_CONTENT_DISPOSITION, 
    58     { "Content-Encoding",   16 },   // PJSIP_H_CONTENT_ENCODING, 
    59     { "Content-Language",   16 },   // PJSIP_H_CONTENT_LANGUAGE, 
    60     { "Content-Length",     14 },   // PJSIP_H_CONTENT_LENGTH, 
    61     { "Content-Type",       12 },   // PJSIP_H_CONTENT_TYPE, 
    62     { "CSeq",                4 },   // PJSIP_H_CSEQ, 
    63     { "Date",                4 },   // PJSIP_H_DATE, 
    64     { "Error-Info",         10 },   // PJSIP_H_ERROR_INFO, 
    65     { "Expires",             7 },   // PJSIP_H_EXPIRES, 
    66     { "From",                4 },   // PJSIP_H_FROM, 
    67     { "In-Reply-To",        11 },   // PJSIP_H_IN_REPLY_TO, 
    68     { "Max-Forwards",       12 },   // PJSIP_H_MAX_FORWARDS, 
    69     { "MIME-Version",       12 },   // PJSIP_H_MIME_VERSION, 
    70     { "Min-Expires",        11 },   // PJSIP_H_MIN_EXPIRES, 
    71     { "Organization",       12 },   // PJSIP_H_ORGANIZATION, 
    72     { "Priority",            8 },   // PJSIP_H_PRIORITY, 
    73     { "Proxy-Authenticate", 18 },   // PJSIP_H_PROXY_AUTHENTICATE, 
    74     { "Proxy-Authorization",19 },   // PJSIP_H_PROXY_AUTHORIZATION, 
    75     { "Proxy-Require",      13 },   // PJSIP_H_PROXY_REQUIRE, 
    76     { "Record-Route",       12 },   // PJSIP_H_RECORD_ROUTE, 
    77     { "Reply-To",            8 },   // PJSIP_H_REPLY_TO, 
    78     { "Require",             7 },   // PJSIP_H_REQUIRE, 
    79     { "Retry-After",        11 },   // PJSIP_H_RETRY_AFTER, 
    80     { "Route",               5 },   // PJSIP_H_ROUTE, 
    81     { "Server",              6 },   // PJSIP_H_SERVER, 
    82     { "Subject",             7 },   // PJSIP_H_SUBJECT, 
    83     { "Supported",           9 },   // PJSIP_H_SUPPORTED, 
    84     { "Timestamp",           9 },   // PJSIP_H_TIMESTAMP, 
    85     { "To",                  2 },   // PJSIP_H_TO, 
    86     { "Unsupported",        11 },   // PJSIP_H_UNSUPPORTED, 
    87     { "User-Agent",         10 },   // PJSIP_H_USER_AGENT, 
    88     { "Via",                 3 },   // PJSIP_H_VIA, 
    89     { "Warning",             7 },   // PJSIP_H_WARNING, 
    90     { "WWW-Authenticate",   16 },   // PJSIP_H_WWW_AUTHENTICATE, 
    91  
    92     { "_Unknown-Header",    15 },   // PJSIP_H_OTHER, 
     45const pjsip_hdr_name_info_t pjsip_hdr_names[] =  
     46{ 
     47    { "Accept",             6,  NULL },   // PJSIP_H_ACCEPT, 
     48    { "Accept-Encoding",    15, NULL },   // PJSIP_H_ACCEPT_ENCODING, 
     49    { "Accept-Language",    15, NULL },   // PJSIP_H_ACCEPT_LANGUAGE, 
     50    { "Alert-Info",         10, NULL },   // PJSIP_H_ALERT_INFO, 
     51    { "Allow",              5,  NULL },   // PJSIP_H_ALLOW, 
     52    { "Authentication-Info",19, NULL },   // PJSIP_H_AUTHENTICATION_INFO, 
     53    { "Authorization",      13, NULL },   // PJSIP_H_AUTHORIZATION, 
     54    { "Call-ID",            7,  "i" },    // PJSIP_H_CALL_ID, 
     55    { "Call-Info",          9,  NULL },   // PJSIP_H_CALL_INFO, 
     56    { "Contact",            7,  "m" },    // PJSIP_H_CONTACT, 
     57    { "Content-Disposition",19, NULL },   // PJSIP_H_CONTENT_DISPOSITION, 
     58    { "Content-Encoding",   16, "e" },    // PJSIP_H_CONTENT_ENCODING, 
     59    { "Content-Language",   16, NULL },   // PJSIP_H_CONTENT_LANGUAGE, 
     60    { "Content-Length",     14, "l" },    // PJSIP_H_CONTENT_LENGTH, 
     61    { "Content-Type",       12, "c" },    // PJSIP_H_CONTENT_TYPE, 
     62    { "CSeq",                4, NULL },   // PJSIP_H_CSEQ, 
     63    { "Date",                4, NULL },   // PJSIP_H_DATE, 
     64    { "Error-Info",         10, NULL },   // PJSIP_H_ERROR_INFO, 
     65    { "Expires",             7, NULL },   // PJSIP_H_EXPIRES, 
     66    { "From",                4, "f" },    // PJSIP_H_FROM, 
     67    { "In-Reply-To",        11, NULL },   // PJSIP_H_IN_REPLY_TO, 
     68    { "Max-Forwards",       12, NULL },   // PJSIP_H_MAX_FORWARDS, 
     69    { "MIME-Version",       12, NULL },   // PJSIP_H_MIME_VERSION, 
     70    { "Min-Expires",        11, NULL },   // PJSIP_H_MIN_EXPIRES, 
     71    { "Organization",       12, NULL },   // PJSIP_H_ORGANIZATION, 
     72    { "Priority",            8, NULL },   // PJSIP_H_PRIORITY, 
     73    { "Proxy-Authenticate", 18, NULL },   // PJSIP_H_PROXY_AUTHENTICATE, 
     74    { "Proxy-Authorization",19, NULL },   // PJSIP_H_PROXY_AUTHORIZATION, 
     75    { "Proxy-Require",      13, NULL },   // PJSIP_H_PROXY_REQUIRE, 
     76    { "Record-Route",       12, NULL },   // PJSIP_H_RECORD_ROUTE, 
     77    { "Reply-To",            8, NULL },   // PJSIP_H_REPLY_TO, 
     78    { "Require",             7, NULL },   // PJSIP_H_REQUIRE, 
     79    { "Retry-After",        11, NULL },   // PJSIP_H_RETRY_AFTER, 
     80    { "Route",               5, NULL },   // PJSIP_H_ROUTE, 
     81    { "Server",              6, NULL },   // PJSIP_H_SERVER, 
     82    { "Subject",             7, "s" },    // PJSIP_H_SUBJECT, 
     83    { "Supported",           9, "k" },    // PJSIP_H_SUPPORTED, 
     84    { "Timestamp",           9, NULL },   // PJSIP_H_TIMESTAMP, 
     85    { "To",                  2, "t" },    // PJSIP_H_TO, 
     86    { "Unsupported",        11, NULL },   // PJSIP_H_UNSUPPORTED, 
     87    { "User-Agent",         10, NULL },   // PJSIP_H_USER_AGENT, 
     88    { "Via",                 3, "v" },    // PJSIP_H_VIA, 
     89    { "Warning",             7, NULL },   // PJSIP_H_WARNING, 
     90    { "WWW-Authenticate",   16, NULL },   // PJSIP_H_WWW_AUTHENTICATE, 
     91 
     92    { "_Unknown-Header",    15, NULL },   // PJSIP_H_OTHER, 
    9393}; 
     94 
     95pj_bool_t pjsip_use_compact_form = PJSIP_ENCODE_SHORT_HNAME; 
    9496 
    9597static pj_str_t status_phrase[710]; 
     
    306308    } 
    307309    for (; hdr!=end; hdr = hdr->next) { 
    308         if (hdr->type < PJSIP_H_OTHER) { 
    309             if (pj_stricmp(&pjsip_hdr_names[hdr->type], name) == 0) 
    310                 return (void*)hdr; 
    311         } else { 
    312             if (pj_stricmp(&hdr->name, name) == 0) 
    313                 return (void*)hdr; 
    314         } 
     310        if (pj_stricmp(&hdr->name, name) == 0) 
     311            return (void*)hdr; 
    315312    } 
    316313    return NULL; 
     
    334331    pjsip_hdr *hdr; 
    335332    pj_str_t clen_hdr =  { "Content-Length: ", 16}; 
     333 
     334    if (pjsip_use_compact_form) { 
     335        clen_hdr.ptr = "l: "; 
     336        clen_hdr.slen = 3; 
     337    } 
    336338 
    337339    /* Get a wild guess on how many bytes are typically needed. 
     
    410412            pj_str_t ctype_hdr = { "Content-Type: ", 14}; 
    411413            const pjsip_media_type *media = &msg->body->content_type; 
     414 
     415            if (pjsip_use_compact_form) { 
     416                ctype_hdr.ptr = "c: "; 
     417                ctype_hdr.slen = 3; 
     418            } 
    412419 
    413420            /* Add Content-Type header. */ 
     
    597604{ 
    598605    char *p = buf; 
     606    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
    599607     
    600     if ((pj_ssize_t)size < hdr->name.slen + hdr->hvalue.slen + 5) 
     608    if ((pj_ssize_t)size < hname->slen + hdr->hvalue.slen + 5) 
    601609        return -1; 
    602610 
    603     pj_memcpy(p, hdr->name.ptr, hdr->name.slen); 
    604     p += hdr->name.slen; 
     611    pj_memcpy(p, hname->ptr, hname->slen); 
     612    p += hname->slen; 
    605613    *p++ = ':'; 
    606614    *p++ = ' '; 
     
    620628 
    621629    hdr->type = rhs->type; 
    622     hdr->sname = hdr->name; 
     630    pj_strdup(pool, &hdr->sname, &rhs->sname); 
    623631    return hdr; 
    624632} 
     
    679687{ 
    680688    char *p = buf; 
    681  
    682     if ((pj_ssize_t)size < hdr->name.slen + 15) 
     689    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     690 
     691    if ((pj_ssize_t)size < hname->slen + 15) 
    683692        return -1; 
    684693 
    685     pj_memcpy(p, hdr->name.ptr, hdr->name.slen); 
    686     p += hdr->name.slen; 
     694    pj_memcpy(p, hname->ptr, hname->slen); 
     695    p += hname->slen; 
    687696    *p++ = ':'; 
    688697    *p++ = ' '; 
     
    754763{ 
    755764    char *p = buf, *endbuf = buf+size; 
    756  
    757     copy_advance(p, hdr->name); 
     765    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     766 
     767    copy_advance(p, (*hname)); 
    758768    *p++ = ':'; 
    759769    *p++ = ' '; 
     
    902912    char *p = buf; 
    903913    int len; 
    904  
    905     if ((pj_ssize_t)size < hdr->name.slen + 14) 
     914    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     915 
     916    if ((pj_ssize_t)size < hname->slen + 14) 
    906917        return -1; 
    907918 
    908     pj_memcpy(p, hdr->name.ptr, hdr->name.slen); 
    909     p += hdr->name.slen; 
     919    pj_memcpy(p, hname->ptr, hname->slen); 
     920    p += hname->slen; 
    910921    *p++ = ':'; 
    911922    *p++ = ' '; 
     
    966977    char *p = buf; 
    967978    int len; 
     979    /* CSeq doesn't have compact form */ 
    968980 
    969981    if ((pj_ssize_t)size < hdr->name.slen + hdr->method.name.slen + 15) 
     
    10431055                                    pj_size_t size) 
    10441056{ 
     1057    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     1058 
    10451059    if (hdr->star) { 
    10461060        char *p = buf; 
    1047         if ((pj_ssize_t)size < hdr->name.slen + 6) 
     1061        if ((pj_ssize_t)size < hname->slen + 6) 
    10481062            return -1; 
    1049         pj_memcpy(p, hdr->name.ptr, hdr->name.slen); 
    1050         p += hdr->name.slen; 
     1063        pj_memcpy(p, hname->ptr, hname->slen); 
     1064        p += hname->slen; 
    10511065        *p++ = ':'; 
    10521066        *p++ = ' '; 
     
    10591073        char *endbuf = buf + size; 
    10601074 
    1061         copy_advance(buf, hdr->name); 
     1075        copy_advance(buf, (*hname)); 
    10621076        *buf++ = ':'; 
    10631077        *buf++ = ' '; 
     
    11911205    char *p = buf; 
    11921206    int len; 
    1193  
    1194     if ((pj_ssize_t)size < hdr->name.slen +  
     1207    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     1208 
     1209    if ((pj_ssize_t)size < hname->slen +  
    11951210                           hdr->media.type.slen + hdr->media.subtype.slen +  
    11961211                           hdr->media.param.slen + 8) 
     
    11991214    } 
    12001215 
    1201     pj_memcpy(p, hdr->name.ptr, hdr->name.slen); 
    1202     p += hdr->name.slen; 
     1216    pj_memcpy(p, hname->ptr, hname->slen); 
     1217    p += hname->slen; 
    12031218    *p++ = ':'; 
    12041219    *p++ = ' '; 
     
    13081323{ 
    13091324    hdr->type = PJSIP_H_FROM; 
    1310     hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_FROM]; 
     1325    hdr->name.ptr = pjsip_hdr_names[PJSIP_H_FROM].name; 
     1326    hdr->name.slen = pjsip_hdr_names[PJSIP_H_FROM].name_len; 
     1327    hdr->sname.ptr = pjsip_hdr_names[PJSIP_H_FROM].sname; 
     1328    hdr->sname.slen = 1; 
    13111329    return hdr; 
    13121330} 
     
    13151333{ 
    13161334    hdr->type = PJSIP_H_TO; 
    1317     hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_TO]; 
     1335    hdr->name.ptr = pjsip_hdr_names[PJSIP_H_TO].name; 
     1336    hdr->name.slen = pjsip_hdr_names[PJSIP_H_TO].name_len; 
     1337    hdr->sname.ptr = pjsip_hdr_names[PJSIP_H_TO].sname; 
     1338    hdr->sname.slen = 1; 
    13181339    return hdr; 
    13191340} 
     
    13251346    char *startbuf = buf; 
    13261347    char *endbuf = buf + size; 
    1327  
    1328     copy_advance(buf, hdr->name); 
     1348    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     1349 
     1350    copy_advance(buf, (*hname)); 
    13291351    *buf++ = ':'; 
    13301352    *buf++ = ' '; 
     
    14821504{ 
    14831505    hdr->type = PJSIP_H_RECORD_ROUTE; 
    1484     hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_RECORD_ROUTE]; 
     1506    hdr->name.ptr = pjsip_hdr_names[PJSIP_H_RECORD_ROUTE].name; 
     1507    hdr->name.slen = pjsip_hdr_names[PJSIP_H_RECORD_ROUTE].name_len; 
     1508    hdr->sname = hdr->name; 
    14851509    return hdr; 
    14861510} 
     
    14891513{ 
    14901514    hdr->type = PJSIP_H_ROUTE; 
    1491     hdr->name = hdr->sname = pjsip_hdr_names[PJSIP_H_ROUTE]; 
     1515    hdr->name.ptr = pjsip_hdr_names[PJSIP_H_ROUTE].name; 
     1516    hdr->name.slen = pjsip_hdr_names[PJSIP_H_ROUTE].name_len; 
     1517    hdr->sname = hdr->name; 
    14921518    return hdr; 
    14931519} 
     
    14991525    char *startbuf = buf; 
    15001526    char *endbuf = buf + size; 
     1527    /* Route and Record-Route don't compact forms */ 
    15011528 
    15021529    copy_advance(buf, hdr->name); 
     
    16771704    char *endbuf = buf + size; 
    16781705    pj_str_t sip_ver = { "SIP/2.0/", 8 }; 
    1679  
    1680     if ((pj_ssize_t)size < hdr->name.slen + sip_ver.slen +  
     1706    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
     1707 
     1708    if ((pj_ssize_t)size < hname->slen + sip_ver.slen +  
    16811709                           hdr->transport.slen + hdr->sent_by.host.slen + 12) 
    16821710    { 
     
    16851713 
    16861714    /* pjsip_hdr_names */ 
    1687     copy_advance(buf, hdr->name); 
     1715    copy_advance(buf, (*hname)); 
    16881716    *buf++ = ':'; 
    16891717    *buf++ = ' '; 
Note: See TracChangeset for help on using the changeset viewer.