hf.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /*
  2. * Copyright (C) 2001-2003 FhG Fokus
  3. *
  4. * This file is part of ser, a free SIP server.
  5. *
  6. * ser is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version
  10. *
  11. * For a license to use the ser software under conditions
  12. * other than those described here, or to purchase support for this
  13. * software, please contact iptel.org by e-mail at the following addresses:
  14. * [email protected]
  15. *
  16. * ser is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, write to the Free Software
  23. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  24. *
  25. * History:
  26. * ---------
  27. * 2003-02-28 scratchpad compatibility abandoned (jiri)
  28. * 2003-01-27 next baby-step to removing ZT - PRESERVE_ZT (jiri)
  29. * 2003-05-01 HDR_ACCEPT added (janakj)
  30. * 2005-02-14 hdr_flags_t && hdr_flags_f defined, split HDR_xxx into
  31. * HDR_xxx_F & HDR_xxx_T [WARNING: don't mix them!] (andrei)
  32. * 2007-01-26 HDR_DATE_T, HDR_IDENTITY_T, HDR_IDENTITY_INFO_T added (gergo)
  33. * 2007-07-27 HDR_RETRY_AFTER_[TF] added (andrei)
  34. */
  35. /** Parser :: parse headers.
  36. * @file
  37. *
  38. * @ingroup parser
  39. */
  40. #ifndef HF_H
  41. #define HF_H
  42. #include "../str.h"
  43. #include "../comp_defs.h"
  44. /** header types enum.
  45. *
  46. * @note
  47. * if you add a new type:
  48. * - make sure it's not greater than 63
  49. * - make sure you add the corresponding flag to the hdr_flags_t defs below
  50. * - update clean_hdr_field (in hf.c)
  51. * - update sip_msg_cloner (modules/tm/sip_msg.c)
  52. * - update parse_headers (msg_parser.c)
  53. * - update get_hdr_field (msg_parser.c)
  54. */
  55. enum _hdr_types_t {
  56. HDR_ERROR_T = -1 /*!< Error while parsing */,
  57. HDR_OTHER_T = 0 /*!< Some other header field */,
  58. HDR_VIA_T = 1 /*!< Via header field */,
  59. HDR_VIA1_T = 1 /*!< First Via header field */,
  60. HDR_VIA2_T = 2 /*!< only used as flag */,
  61. HDR_TO_T /*!< To header field */,
  62. HDR_FROM_T /*!< From header field */,
  63. HDR_CSEQ_T /*!< CSeq header field */,
  64. HDR_CALLID_T /*!< Call-Id header field */,
  65. HDR_CONTACT_T /*!< Contact header field */,
  66. HDR_MAXFORWARDS_T /*!< MaxForwards header field */,
  67. HDR_ROUTE_T /*!< Route header field */,
  68. HDR_RECORDROUTE_T /*!< Record-Route header field */,
  69. HDR_CONTENTTYPE_T /*!< Content-Type header field */,
  70. HDR_CONTENTLENGTH_T /*!< Content-Length header field */,
  71. HDR_AUTHORIZATION_T /*!< Authorization header field */,
  72. HDR_EXPIRES_T /*!< Expires header field */,
  73. HDR_PROXYAUTH_T /*!< Proxy-Authorization hdr field */,
  74. HDR_SUPPORTED_T /*!< Supported header field */,
  75. HDR_REQUIRE_T /*!< Require header */,
  76. HDR_PROXYREQUIRE_T /*!< Proxy-Require header field */,
  77. HDR_UNSUPPORTED_T /*!< Unsupported header field */,
  78. HDR_ALLOW_T /*!< Allow header field */,
  79. HDR_EVENT_T /*!< Event header field */,
  80. HDR_ACCEPT_T /*!< Accept header field */,
  81. HDR_ACCEPTLANGUAGE_T /*!< Accept-Language header field */,
  82. HDR_ORGANIZATION_T /*!< Organization header field */,
  83. HDR_PRIORITY_T /*!< Priority header field */,
  84. HDR_SUBJECT_T /*!< Subject header field */,
  85. HDR_USERAGENT_T /*!< User-Agent header field */,
  86. HDR_SERVER_T /*!< Server header field */,
  87. HDR_CONTENTDISPOSITION_T /*!< Content-Disposition hdr field */,
  88. HDR_DIVERSION_T /*!< Diversion header field */,
  89. HDR_RPID_T /*!< Remote-Party-ID header field */,
  90. HDR_REFER_TO_T /*!< Refer-To header fiels */,
  91. HDR_SIPIFMATCH_T /*!< SIP-If-Match header field */,
  92. HDR_SESSIONEXPIRES_T /*!< Session-Expires header */,
  93. HDR_MIN_SE_T /*!< Min-SE */,
  94. HDR_SUBSCRIPTION_STATE_T /*!< Subscription-State */,
  95. HDR_ACCEPTCONTACT_T /*!< Accept-Contact header */,
  96. HDR_ALLOWEVENTS_T /*!< Allow-Events header */,
  97. HDR_CONTENTENCODING_T /*!< Content-Encoding header */,
  98. HDR_REFERREDBY_T /*!< Referred-By header */,
  99. HDR_REJECTCONTACT_T /*!< Reject-Contact header */,
  100. HDR_REQUESTDISPOSITION_T /*!< Request-Disposition header */,
  101. HDR_WWW_AUTHENTICATE_T /*!< WWW-Authenticate header field */,
  102. HDR_PROXY_AUTHENTICATE_T /*!< Proxy-Authenticate header field */,
  103. HDR_DATE_T /*!< Date header field */,
  104. HDR_IDENTITY_T /*!< Identity header field */,
  105. HDR_IDENTITY_INFO_T /*!< Identity-info header field */,
  106. HDR_RETRY_AFTER_T /*!< Retry-After header field */,
  107. HDR_PPI_T /*!< P-Preferred-Identity header field*/,
  108. HDR_PAI_T /*!< P-Asserted-Identity header field*/,
  109. HDR_PATH_T /*!< Path header field */,
  110. HDR_PRIVACY_T /*!< Privacy header field */,
  111. HDR_REASON_T /**< Reason header field */,
  112. HDR_EOH_T /*!< End of message header */
  113. };
  114. typedef unsigned long long hdr_flags_t;
  115. /** type to flag conversion.
  116. * WARNING: HDR_ERROR_T has no corresponding FLAG ! */
  117. #define HDR_T2F(type) \
  118. (((type)!=HDR_EOH_T)?((hdr_flags_t)1<<(type)):(~(hdr_flags_t)0))
  119. /** helper macro for easy defining and keeping in sync the flags enum. */
  120. #define HDR_F_DEF(name) HDR_T2F(HDR_##name##_T)
  121. /** @name flags definitions.
  122. * (enum won't work with all the compiler (e.g. icc) due to the 64bit size) */
  123. /*!{ */
  124. #define HDR_EOH_F HDR_F_DEF(EOH)
  125. #define HDR_VIA_F HDR_F_DEF(VIA)
  126. #define HDR_VIA1_F HDR_F_DEF(VIA1)
  127. #define HDR_VIA2_F HDR_F_DEF(VIA2)
  128. #define HDR_TO_F HDR_F_DEF(TO)
  129. #define HDR_FROM_F HDR_F_DEF(FROM)
  130. #define HDR_CSEQ_F HDR_F_DEF(CSEQ)
  131. #define HDR_CALLID_F HDR_F_DEF(CALLID)
  132. #define HDR_CONTACT_F HDR_F_DEF(CONTACT)
  133. #define HDR_MAXFORWARDS_F HDR_F_DEF(MAXFORWARDS)
  134. #define HDR_ROUTE_F HDR_F_DEF(ROUTE)
  135. #define HDR_RECORDROUTE_F HDR_F_DEF(RECORDROUTE)
  136. #define HDR_CONTENTTYPE_F HDR_F_DEF(CONTENTTYPE)
  137. #define HDR_CONTENTLENGTH_F HDR_F_DEF(CONTENTLENGTH)
  138. #define HDR_AUTHORIZATION_F HDR_F_DEF(AUTHORIZATION)
  139. #define HDR_EXPIRES_F HDR_F_DEF(EXPIRES)
  140. #define HDR_PROXYAUTH_F HDR_F_DEF(PROXYAUTH)
  141. #define HDR_SUPPORTED_F HDR_F_DEF(SUPPORTED)
  142. #define HDR_REQUIRE_F HDR_F_DEF(REQUIRE)
  143. #define HDR_PROXYREQUIRE_F HDR_F_DEF(PROXYREQUIRE)
  144. #define HDR_UNSUPPORTED_F HDR_F_DEF(UNSUPPORTED)
  145. #define HDR_ALLOW_F HDR_F_DEF(ALLOW)
  146. #define HDR_EVENT_F HDR_F_DEF(EVENT)
  147. #define HDR_ACCEPT_F HDR_F_DEF(ACCEPT)
  148. #define HDR_ACCEPTLANGUAGE_F HDR_F_DEF(ACCEPTLANGUAGE)
  149. #define HDR_ORGANIZATION_F HDR_F_DEF(ORGANIZATION)
  150. #define HDR_PRIORITY_F HDR_F_DEF(PRIORITY)
  151. #define HDR_SUBJECT_F HDR_F_DEF(SUBJECT)
  152. #define HDR_USERAGENT_F HDR_F_DEF(USERAGENT)
  153. #define HDR_SERVER_F HDR_F_DEF(SERVER)
  154. #define HDR_CONTENTDISPOSITION_F HDR_F_DEF(CONTENTDISPOSITION)
  155. #define HDR_DIVERSION_F HDR_F_DEF(DIVERSION)
  156. #define HDR_RPID_F HDR_F_DEF(RPID)
  157. #define HDR_REFER_TO_F HDR_F_DEF(REFER_TO)
  158. #define HDR_SIPIFMATCH_F HDR_F_DEF(SIPIFMATCH)
  159. #define HDR_SESSIONEXPIRES_F HDR_F_DEF(SESSIONEXPIRES)
  160. #define HDR_MIN_SE_F HDR_F_DEF(MIN_SE)
  161. #define HDR_SUBSCRIPTION_STATE_F HDR_F_DEF(SUBSCRIPTION_STATE)
  162. #define HDR_ACCEPTCONTACT_F HDR_F_DEF(ACCEPTCONTACT)
  163. #define HDR_ALLOWEVENTS_F HDR_F_DEF(ALLOWEVENTS)
  164. #define HDR_CONTENTENCODING_F HDR_F_DEF(CONTENTENCODING)
  165. #define HDR_REFERREDBY_F HDR_F_DEF(REFERREDBY)
  166. #define HDR_REJECTCONTACT_F HDR_F_DEF(REJECTCONTACT)
  167. #define HDR_REQUESTDISPOSITION_F HDR_F_DEF(REQUESTDISPOSITION)
  168. #define HDR_WWW_AUTHENTICATE_F HDR_F_DEF(WWW_AUTHENTICATE)
  169. #define HDR_PROXY_AUTHENTICATE_F HDR_F_DEF(PROXY_AUTHENTICATE)
  170. #define HDR_DATE_F HDR_F_DEF(DATE)
  171. #define HDR_IDENTITY_F HDR_F_DEF(IDENTITY)
  172. #define HDR_IDENTITY_INFO_F HDR_F_DEF(IDENTITY_INFO)
  173. #define HDR_RETRY_AFTER_F HDR_F_DEF(RETRY_AFTER)
  174. #define HDR_PPI_F HDR_F_DEF(PPI)
  175. #define HDR_PAI_F HDR_F_DEF(PAI)
  176. #define HDR_PATH_F HDR_F_DEF(PATH)
  177. #define HDR_PRIVACY_F HDR_F_DEF(PRIVACY)
  178. #define HDR_REASON_F HDR_F_DEF(REASON)
  179. #define HDR_OTHER_F HDR_F_DEF(OTHER)
  180. /*!} */ /* Doxygen end marker*/
  181. typedef enum _hdr_types_t hdr_types_t;
  182. /** Format: name':' body.
  183. */
  184. typedef struct hdr_field {
  185. hdr_types_t type; /*!< Header field type */
  186. str name; /*!< Header field name */
  187. str body; /*!< Header field body (may not include CRLF) */
  188. int len; /*!< length from hdr start until EoHF (incl.CRLF) */
  189. void* parsed; /*!< Parsed data structures */
  190. struct hdr_field* next; /*!< Next header field in the list */
  191. } hdr_field_t;
  192. /* type of the function to free the structure of parsed header field */
  193. typedef void (*hf_parsed_free_f)(void *parsed);
  194. /* structure to hold the function to free the parsed header field */
  195. typedef struct hdr_parsed {
  196. hf_parsed_free_f hfree;
  197. } hf_parsed_t;
  198. /** returns true if the header links allocated memory on parse field. */
  199. static inline int hdr_allocs_parse(struct hdr_field* hdr)
  200. {
  201. switch(hdr->type){
  202. case HDR_ACCEPT_T:
  203. case HDR_ALLOW_T:
  204. case HDR_AUTHORIZATION_T:
  205. case HDR_CONTACT_T:
  206. case HDR_CONTENTDISPOSITION_T:
  207. case HDR_CSEQ_T:
  208. case HDR_DATE_T:
  209. case HDR_DIVERSION_T:
  210. case HDR_EVENT_T:
  211. case HDR_EXPIRES_T:
  212. case HDR_FROM_T:
  213. case HDR_IDENTITY_INFO_T:
  214. case HDR_IDENTITY_T:
  215. case HDR_PAI_T:
  216. case HDR_PPI_T:
  217. case HDR_PROXYAUTH_T:
  218. case HDR_RECORDROUTE_T:
  219. case HDR_REFER_TO_T:
  220. case HDR_ROUTE_T:
  221. case HDR_RPID_T:
  222. case HDR_SESSIONEXPIRES_T:
  223. case HDR_SIPIFMATCH_T:
  224. case HDR_SUBSCRIPTION_STATE_T:
  225. case HDR_SUPPORTED_T:
  226. case HDR_TO_T:
  227. case HDR_VIA_T:
  228. return 1;
  229. default:
  230. return 0;
  231. }
  232. }
  233. /** frees a hdr_field structure.
  234. * WARNING: it frees only parsed (and not name.s, body.s)
  235. */
  236. void clean_hdr_field(struct hdr_field* const hf);
  237. /** frees a hdr_field list.
  238. * WARNING: frees only ->parsed and ->next
  239. */
  240. void free_hdr_field_lst(struct hdr_field* hf);
  241. /* print content of hdr_field */
  242. void dump_hdr_field( struct hdr_field const* const hf);
  243. /**
  244. * free hdr parsed structure using inner free function
  245. * - hdr parsed struct must have as first file a free function,
  246. * so it can be caseted to hf_parsed_t
  247. */
  248. void hdr_free_parsed(void **h_parsed);
  249. #endif /* HF_H */