summaryrefslogtreecommitdiff
path: root/packet-wsp.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-11-07 20:23:55 +0000
committerGuy Harris <guy@alum.mit.edu>2003-11-07 20:23:55 +0000
commita3793b2ade91c90630f92b05c0a32f50384f2698 (patch)
tree4192551bd6cb42bffc5d93b4450800774c412526 /packet-wsp.c
parent67569e5a767d1538c45a285ab14bac9f78d41a5f (diff)
downloadwireshark-a3793b2ade91c90630f92b05c0a32f50384f2698.tar.gz
From Olivier Biot: implement the Range, Content-Range and
Content-Disposition headers. svn path=/trunk/; revision=8909
Diffstat (limited to 'packet-wsp.c')
-rw-r--r--packet-wsp.c269
1 files changed, 245 insertions, 24 deletions
diff --git a/packet-wsp.c b/packet-wsp.c
index 98be58f009..eee55c5099 100644
--- a/packet-wsp.c
+++ b/packet-wsp.c
@@ -2,7 +2,7 @@
*
* Routines to dissect WSP component of WAP traffic.
*
- * $Id: packet-wsp.c,v 1.82 2003/11/07 20:07:01 guy Exp $
+ * $Id: packet-wsp.c,v 1.83 2003/11/07 20:23:55 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -89,6 +89,8 @@ static int hf_hdr_content_length = HF_EMPTY;
static int hf_hdr_content_location = HF_EMPTY;
static int hf_hdr_content_md5 = HF_EMPTY;
static int hf_hdr_content_range = HF_EMPTY;
+static int hf_hdr_content_range_first_byte_pos = HF_EMPTY; /* Subfield */
+static int hf_hdr_content_range_entity_length = HF_EMPTY; /* Subfield */
static int hf_hdr_content_type = HF_EMPTY;
static int hf_hdr_date = HF_EMPTY;
static int hf_hdr_etag = HF_EMPTY;
@@ -113,6 +115,9 @@ static int hf_hdr_proxy_authorization_user_id = HF_EMPTY; /* Subfield */
static int hf_hdr_proxy_authorization_password = HF_EMPTY; /* Subfield */
static int hf_hdr_public = HF_EMPTY;
static int hf_hdr_range = HF_EMPTY;
+static int hf_hdr_range_first_byte_pos = HF_EMPTY; /* Subfield */
+static int hf_hdr_range_last_byte_pos = HF_EMPTY; /* Subfield */
+static int hf_hdr_range_suffix_length = HF_EMPTY; /* Subfield */
static int hf_hdr_referer = HF_EMPTY;
static int hf_hdr_retry_after = HF_EMPTY;
static int hf_hdr_server = HF_EMPTY;
@@ -1268,6 +1273,8 @@ static guint32 wkh_vary (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
static guint32 wkh_accept_ranges (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
+static guint32 wkh_content_disposition (proto_tree *tree, tvbuff_t *tvb,
+ guint32 hdr_start);
static guint32 wkh_accept_encoding (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
static guint32 wkh_content_encoding (proto_tree *tree, tvbuff_t *tvb,
@@ -1387,23 +1394,22 @@ static guint32 wkh_content_md5 (proto_tree *tree, tvbuff_t *tvb,
static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
-/* TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
+/* Content-Range and Range */
static guint32 wkh_content_range (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
static guint32 wkh_range (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
+
+
+/* TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
static guint32 wkh_retry_after (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
-static guint32 wkh_content_disposition (proto_tree *tree, tvbuff_t *tvb,
- guint32 hdr_start);
static guint32 wkh_profile_diff (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
static guint32 wkh_expect (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
-static guint32 wkh_content_id (proto_tree *tree, tvbuff_t *tvb,
- guint32 hdr_start);
static guint32 wkh_set_cookie (proto_tree *tree, tvbuff_t *tvb,
guint32 hdr_start);
static guint32 wkh_cookie (proto_tree *tree, tvbuff_t *tvb,
@@ -1490,7 +1496,7 @@ static const hdr_parse_func_ptr WellKnownHeader[128] = {
/* 0x0A */ wkh_content_base, /* 0x0B */ wkh_content_encoding,
/* 0x0C */ wkh_content_language, /* 0x0D */ wkh_content_length,
/* 0x0E */ wkh_content_location, /* 0x0F */ wkh_content_md5,
- /* 0x10 */ wkh_default, /* 0x11 */ wkh_content_type,
+ /* 0x10 */ wkh_content_range, /* 0x11 */ wkh_content_type,
/* 0x12 */ wkh_date, /* 0x13 */ wkh_etag,
/* 0x14 */ wkh_expires, /* 0x15 */ wkh_from,
/* 0x16 */ wkh_host, /* 0x17 */ wkh_if_modified_since,
@@ -1499,13 +1505,13 @@ static const hdr_parse_func_ptr WellKnownHeader[128] = {
/* 0x1C */ wkh_location, /* 0x1D */ wkh_last_modified,
/* 0x1E */ wkh_max_forwards, /* 0x1F */ wkh_pragma,
/* 0x20 */ wkh_proxy_authenticate, /* 0x21 */ wkh_proxy_authorization,
- /* 0x22 */ wkh_public, /* 0x23 */ wkh_default,
+ /* 0x22 */ wkh_public, /* 0x23 */ wkh_range,
/* 0x24 */ wkh_referer, /* 0x25 */ wkh_default,
/* 0x26 */ wkh_server, /* 0x27 */ wkh_transfer_encoding,
/* 0x28 */ wkh_upgrade, /* 0x29 */ wkh_user_agent,
/* 0x2A */ wkh_vary, /* 0x2B */ wkh_via,
/* 0x2C */ wkh_warning, /* 0x2D */ wkh_www_authenticate,
- /* 0x2E */ wkh_default, /* 0x2F */ wkh_x_wap_application_id,
+ /* 0x2E */ wkh_content_disposition,/* 0x2F */ wkh_x_wap_application_id,
/* 0x30 */ wkh_content_uri, /* 0x31 */ wkh_initiator_uri,
/* 0x32 */ wkh_accept_application, /* 0x33 */ wkh_bearer_indication,
/* 0x34 */ wkh_push_flag, /* 0x35 */ wkh_profile,
@@ -1513,10 +1519,10 @@ static const hdr_parse_func_ptr WellKnownHeader[128] = {
/* 0x38 */ wkh_default, /* 0x39 */ wkh_default,
/* 0x3A */ wkh_content_id, /* 0x3B */ wkh_accept_charset,
/* 0x3C */ wkh_accept_encoding, /* 0x3D */ wkh_cache_control,
- /* 0x3E */ wkh_default, /* 0x3F */ wkh_x_wap_tod,
+ /* 0x3E */ wkh_content_range, /* 0x3F */ wkh_x_wap_tod,
/* 0x40 */ wkh_default, /* 0x41 */ wkh_default,
/* 0x42 */ wkh_default, /* 0x43 */ wkh_encoding_version,
- /* 0x44 */ wkh_profile_warning, /* 0x45 */ wkh_default,
+ /* 0x44 */ wkh_profile_warning, /* 0x45 */ wkh_content_disposition,
/* 0x46 */ wkh_x_wap_security, /* 0x47 */ wkh_cache_control,
/*******************************************************
*** The following headers are not (yet) registered. ***
@@ -1876,7 +1882,7 @@ add_headers (proto_tree *tree, tvbuff_t *tvb)
if (! ok) { \
if (ti) { /* Append to protocol tree item label */ \
proto_item_append_text(ti, \
- "<Error: Invalid header value>"); \
+ " <Error: Invalid header value>"); \
} else if (hf > 0) { /* Create protocol tree item */ \
proto_tree_add_string(tree, hf, \
tvb, hdr_start, offset - hdr_start, \
@@ -2487,7 +2493,7 @@ wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
off += len;
}
if (ok) {
- /* Remember: offset == val_start + val_len */
+ /* Remember: offset == val_start + val_len_len + val_len */
if (off < offset) { /* Add Q-value if available */
parameter_tree = proto_item_add_subtree(ti, ett_header);
off = parameter_value_q(parameter_tree, ti, tvb, off);
@@ -2498,6 +2504,65 @@ wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
/*
+ * Content-disposition-value =
+ * Value-length ( Short-integer | Text-string ) *( Parameter )
+ */
+static guint32
+wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
+{
+ wkh_0_Declarations;
+ guint32 len, off;
+ guint8 peek;
+ gchar *str;
+ proto_tree *parameter_tree = NULL;
+
+ wkh_1_WellKnownValue;
+ /* Invalid */
+ wkh_2_TextualValue;
+ /* Invalid */
+ wkh_3_ValueWithLength;
+ off = val_start + val_len_len;
+ peek = tvb_get_guint8(tvb, off);
+ if (is_short_integer(peek)) {
+ switch (val_id) {
+ case 0x80: /* form-data */
+ ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
+ tvb, hdr_start, offset - hdr_start, "form-data");
+ ok = TRUE;
+ break;
+ case 0x81: /* attachment */
+ ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
+ tvb, hdr_start, offset - hdr_start, "attachment");
+ ok = TRUE;
+ break;
+ case 0x82: /* inline */
+ ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
+ tvb, hdr_start, offset - hdr_start, "inline");
+ ok = TRUE;
+ break;
+ }
+ off++;
+ } else {
+ get_token_text(str, tvb, off, len, ok);
+ if (ok) {
+ ti = proto_tree_add_string(tree, hf_hdr_content_disposition,
+ tvb, hdr_start, offset - hdr_start, str);
+ g_free(str);
+ }
+ off += len;
+ }
+ if (ok) {
+ /* Remember: offset == val_start + val_len_len + val_len */
+ while (off < offset) { /* Add Q-value if available */
+ parameter_tree = proto_item_add_subtree(ti, ett_header);
+ off = parameter_value_q(parameter_tree, ti, tvb, off);
+ }
+ }
+ wkh_4_End(hf_hdr_accept_encoding);
+}
+
+
+/*
* Common code for headers with only a textual value
* is written in the macro below:
*/
@@ -2790,7 +2855,7 @@ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, \
hf_hdr_ ## underscored ## _realm, \
tvb, off, len, str); \
val_str = malloc((len + 11) * sizeof(char)); \
- sprintf(val_str, "; realm='%s'", str); \
+ sprintf(val_str, "; realm=%s", str); \
proto_item_append_string(ti, val_str); \
g_free(val_str); \
g_free(str); \
@@ -2814,7 +2879,7 @@ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, \
hf_hdr_ ## underscored ## _realm, \
tvb, off, len, str); \
val_str = malloc((len + 11) * sizeof(char)); \
- sprintf(val_str, "; realm='%s'", str); \
+ sprintf(val_str, "; realm=%s", str); \
proto_item_append_string(ti, val_str); \
g_free(val_str); \
g_free(str); \
@@ -2873,7 +2938,7 @@ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, \
hf_hdr_ ## underscored ## _user_id, \
tvb, off, len, str); \
val_str = malloc((len + 13) * sizeof(char)); \
- sprintf(val_str, "; user-id='%s'", str); \
+ sprintf(val_str, "; user-id=%s", str); \
proto_item_append_string(ti, val_str); \
g_free(val_str); \
g_free(str); \
@@ -2885,7 +2950,7 @@ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, \
hf_hdr_ ## underscored ## _password, \
tvb, off, len, str); \
val_str = malloc((len + 14) * sizeof(char)); \
- sprintf(val_str, "; password='%s'", str); \
+ sprintf(val_str, "; password=%s", str); \
proto_item_append_string(ti, val_str); \
g_free(val_str); \
g_free(str); \
@@ -2981,7 +3046,7 @@ wkh_pragma(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
wkh_2_TextualValue;
/* Invalid */
wkh_3_ValueWithLength;
- off = val_start;
+ off = val_start + val_len_len;
ti = proto_tree_add_string(tree, hf_hdr_pragma,
tvb, hdr_start, off - hdr_start, "");
/* NULL subtree for parameter() results in no subtree
@@ -3147,7 +3212,7 @@ wkh_cache_control(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
if (ok) {
val_str = malloc(22 * sizeof(gchar));
g_assert(val_str);
- sprintf(val_str, " = %u second%s", val, PLURALIZE(val));
+ sprintf(val_str, "=%u second%s", val, PLURALIZE(val));
proto_item_append_string(ti, val_str);
g_free(val_str); /* proto_XXX creates a copy */
}
@@ -3232,7 +3297,7 @@ wkh_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
tvb, off, len, str);
val_str = g_malloc((len + 11) * sizeof(char));
g_assert(val_str);
- sprintf(val_str, "; Agent = %s", str);
+ sprintf(val_str, "; agent=%s", str);
proto_item_append_string(ti, val_str);
g_free(val_str); /* proto_XXX creates a copy */
g_free(str);
@@ -3244,7 +3309,7 @@ wkh_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
tvb, off, len, str);
val_str = g_malloc((len + 10) * sizeof(char));
g_assert(val_str);
- sprintf(val_str, "; Text = %s", str);
+ sprintf(val_str, "; Text=%s", str);
proto_item_append_string(ti, val_str);
g_free(val_str); /* proto_XXX creates a copy */
g_free(str);
@@ -3294,7 +3359,7 @@ wkh_profile_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
off += len;
str = g_malloc((len+12) * sizeof(char));
g_assert(str);
- sprintf(str, "; Target = %s", val_str);
+ sprintf(str, "; target=%s", val_str);
proto_item_append_string(ti, str);
g_free(str); /* proto_XXX creates a copy */
/* Add zero or more dates */
@@ -3308,7 +3373,7 @@ wkh_profile_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
g_assert(val_str);
str = g_malloc((strlen(val_str)+10) * sizeof(char));
g_assert(str);
- sprintf(str,"; Date = %s", val_str);
+ sprintf(str,"; date=%s", val_str);
proto_item_append_string(ti, str);
g_free(str); /* proto_XXX creates a copy */
/* BEHOLD: do NOT try to free val_str, as this
@@ -3355,7 +3420,7 @@ static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb,
if (val & 0x80) { /* Header Code Page */
val_str = g_malloc(14 * sizeof(char));
g_assert(val_str);
- sprintf(val_str, "Code-page %u", val & 0x7F);
+ sprintf(val_str, "code-page %u", val & 0x7F);
ti = proto_tree_add_string(tree, hf_hdr_encoding_version,
tvb, hdr_start, off - hdr_start, val_str);
g_free(val_str);
@@ -3378,6 +3443,127 @@ static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb,
}
+/* Content-range-value =
+ * Length Uintvar-integer ( 0x80 | Uintvar-integer )
+ */
+static guint32
+wkh_content_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
+{
+ wkh_0_Declarations;
+ guint32 off, val, len;
+ proto_tree *subtree = NULL;
+
+ wkh_1_WellKnownValue;
+ /* Invalid */
+ wkh_2_TextualValue;
+ /* Invalid */
+ wkh_3_ValueWithLength;
+ off = val_start + val_len_len;
+ get_uintvar_integer (val, tvb, off, len, ok); /* Uintvar start */
+ if (ok) {
+ val_str = g_malloc(26 * sizeof(char));
+ g_assert(val_str);
+ sprintf(val_str, "first-byte-pos=%u", val);
+ ti = proto_tree_add_string(tree, hf_hdr_content_range,
+ tvb, hdr_start, offset - hdr_start, val_str);
+ subtree = proto_item_add_subtree(ti, ett_header);
+ proto_tree_add_uint(subtree, hf_hdr_content_range_first_byte_pos,
+ tvb, off, len, val);
+ g_free(val_str);
+ off += len;
+ /* Now check next value */
+ val = tvb_get_guint8(tvb, off);
+ if (val == 0x80) { /* Unknown length */
+ proto_item_append_string(ti, "; entity-length=unknown");
+ } else { /* Uintvar entity length */
+ get_uintvar_integer (val, tvb, off, len, ok);
+ if (ok) {
+ val_str = g_malloc(27 * sizeof(char));
+ g_assert(val_str);
+ sprintf(val_str, "; entity-length=%u", val);
+ proto_item_append_string(ti, val_str);
+ proto_tree_add_uint(subtree,
+ hf_hdr_content_range_entity_length,
+ tvb, off, len, val);
+ g_free(val_str);
+ }
+ }
+ }
+
+ wkh_4_End(hf_hdr_content_range);
+}
+
+
+/* Range-value =
+ * Length
+ * 0x80 Uintvar-integer [ Uintvar-integer ]
+ * | 0x81 Uintvar-integer
+ */
+static guint32
+wkh_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start)
+{
+ wkh_0_Declarations;
+ guint32 off, val, len;
+ proto_tree *subtree = NULL;
+
+ wkh_1_WellKnownValue;
+ /* Invalid */
+ wkh_2_TextualValue;
+ /* Invalid */
+ wkh_3_ValueWithLength;
+ off = val_start + val_len_len;
+ val = tvb_get_guint8(tvb, off);
+ if (val == 0x80) { /* Byte-range */
+ ti = proto_tree_add_string(tree, hf_hdr_range,
+ tvb, hdr_start, offset - hdr_start, "byte-range");
+ subtree = proto_item_add_subtree(ti, ett_header);
+ /* Get the First-byte-pos (Uintvar-integer) */
+ get_uintvar_integer (val, tvb, off, len, ok);
+ if (ok) {
+ val_str = g_malloc(28 * sizeof(char));
+ g_assert(val_str);
+ sprintf(val_str, "; first-byte-pos=%u", val);
+ proto_item_append_string(ti, val_str);
+ proto_tree_add_uint(subtree, hf_hdr_range_first_byte_pos,
+ tvb, off, len, val);
+ g_free(val_str);
+ off += len;
+ /* Get the optional Last-byte-pos (Uintvar-integer) */
+ if (off < offset) {
+ get_uintvar_integer (val, tvb, off, len, ok);
+ if (ok) {
+ val_str = g_malloc(27 * sizeof(char));
+ g_assert(val_str);
+ sprintf(val_str, "; last-byte-pos=%u", val);
+ proto_item_append_string(ti, val_str);
+ proto_tree_add_uint(subtree,
+ hf_hdr_range_last_byte_pos,
+ tvb, off, len, val);
+ g_free(val_str);
+ }
+ }
+ }
+ } else if (val == 0x81) { /* Suffix-byte-range */
+ ti = proto_tree_add_string(tree, hf_hdr_range,
+ tvb, hdr_start, offset - hdr_start, "suffix-byte-range");
+ subtree = proto_item_add_subtree(ti, ett_header);
+ /* Get the Suffix-length (Uintvar-integer) */
+ get_uintvar_integer (val, tvb, off, len, ok);
+ if (ok) {
+ val_str = g_malloc(28 * sizeof(char));
+ g_assert(val_str);
+ sprintf(val_str, "; suffix-length=%u", val);
+ proto_item_append_string(ti, val_str);
+ proto_tree_add_uint(subtree, hf_hdr_range_suffix_length,
+ tvb, off, len, val);
+ g_free(val_str);
+ }
+ }
+
+ wkh_4_End(hf_hdr_range);
+}
+
+
/****************************************************************************
* O p e n w a v e h e a d e r s
****************************************************************************/
@@ -5593,6 +5779,20 @@ proto_register_wsp(void)
"WSP header Content-Range", HFILL
}
},
+ { &hf_hdr_content_range_first_byte_pos,
+ { "First-byte-position",
+ "wsp.hdr.content_range.first_byte_pos",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ "WSP header Content-Range: position of first byte", HFILL
+ }
+ },
+ { &hf_hdr_content_range_entity_length,
+ { "Entity-length",
+ "wsp.hdr.content_range.entity_length",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ "WSP header Content-Range: length of the entity", HFILL
+ }
+ },
{ &hf_hdr_content_type,
{ "Content-Type",
"wsp.hdr.content_type",
@@ -5761,6 +5961,27 @@ proto_register_wsp(void)
"WSP header Range", HFILL
}
},
+ { &hf_hdr_range_first_byte_pos,
+ { "First-byte-position",
+ "wsp.hdr.range.first_byte_pos",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ "WSP header Range: position of first byte", HFILL
+ }
+ },
+ { &hf_hdr_range_last_byte_pos,
+ { "Last-byte-position",
+ "wsp.hdr.range.last_byte_pos",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ "WSP header Range: position of last byte", HFILL
+ }
+ },
+ { &hf_hdr_range_suffix_length,
+ { "Suffix-length",
+ "wsp.hdr.range.suffix_length",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ "WSP header Range: length of the suffix", HFILL
+ }
+ },
{ &hf_hdr_referer,
{ "Referer",
"wsp.hdr.referer",