From ecea5fac9669b4b1a0fe5bb5aa55873b82b268cd Mon Sep 17 00:00:00 2001 From: Luis Ontanon Date: Tue, 1 Mar 2005 11:37:26 +0000 Subject: [PATCH] In packets with more than one req/resp the items of all the req/resp subtrees always pointed to the offset of the first req/resp. svn path=/trunk/; revision=13564 --- epan/dissectors/packet-http.c | 85 +++++++++++++++++------------------ 1 file changed, 40 insertions(+), 45 deletions(-) diff --git a/epan/dissectors/packet-http.c b/epan/dissectors/packet-http.c index 4c257ee826..403af6ca34 100644 --- a/epan/dissectors/packet-http.c +++ b/epan/dissectors/packet-http.c @@ -64,7 +64,7 @@ static int hf_http_request = -1; static int hf_http_basic = -1; static int hf_http_request_method = -1; static int hf_http_request_uri = -1; -static int hf_http_request_version = -1; +static int hf_http_version = -1; static int hf_http_response_code = -1; static int hf_http_authorization = -1; static int hf_http_proxy_authenticate = -1; @@ -572,10 +572,8 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo, tvb_format_text(tvb, offset, next_offset - offset)); if (req_dissector) { - req_tree = proto_item_add_subtree( - hdr_item, ett_http_request); - req_dissector(tvb, req_tree, - req_strlen); + req_tree = proto_item_add_subtree(hdr_item, ett_http_request); + req_dissector(tvb, req_tree, offset); } } } else { @@ -948,52 +946,49 @@ dissect_http_message(tvbuff_t *tvb, int offset, packet_info *pinfo, * This simple dissectory only puts http.request_method into a sub-tree. */ static void -basic_request_dissector(tvbuff_t *tvb, proto_tree *tree, int req_strlen) +basic_request_dissector(tvbuff_t *tvb, proto_tree *tree, int start) { - gint start, end; - proto_tree_add_item(tree, hf_http_request_method, tvb, 0, req_strlen, FALSE); - - start = end = req_strlen + 1; + gint end; - while (tvb_length_remaining(tvb, end) > 0) { - if (tvb_get_guint8(tvb, end) == ' ' && end > start) { - proto_tree_add_item(tree, hf_http_request_uri, tvb, start, end - start, FALSE); - stat_info->request_uri = tvb_get_string(tvb, start, end - start); + /* find the first space to determine the end of the method */ + end = tvb_find_guint8(tvb,start,-1,' '); + + proto_tree_add_item(tree, hf_http_request_method, tvb, start, end - start , FALSE); - break; - } - end++; - } - - if (end > start) { - start = end; - while (tvb_length_remaining(tvb, end) > 0) { - if (tvb_get_guint8(tvb, end) == '\r' && end > start) { - proto_tree_add_item(tree, hf_http_request_version, tvb, start, end - start, FALSE); - break; - } - end++; - } - } + /* find the second space to determine the end of the uri */ + start = end + 1; + end = tvb_find_guint8(tvb,start,-1,' '); + + proto_tree_add_item(tree, hf_http_request_uri, tvb, start, end - start, FALSE); + stat_info->request_uri = tvb_get_string(tvb, start, end - start); + + /* find the line end to determine the end of the protocol */ + start = end + 1; + end = tvb_find_guint8(tvb,start,-1,'\r'); + + proto_tree_add_item(tree, hf_http_version, tvb, start, end - start , FALSE); } static void -basic_response_dissector(tvbuff_t *tvb, proto_tree *tree, int resp_strlen) +basic_response_dissector(tvbuff_t *tvb, proto_tree *tree, int start) { - gchar *data; - int minor, major, status_code; - - /* BEWARE - sscanf() only operates on C strings. - * The pointer returned by tvb_get_ptr points into the real data, - * which is not necessarily NULL terminated. For this reason, - * the sscanf() call is only applied to a buffer guaranteed to - * only contain a NULL terminated string. */ - data = g_strndup((const gchar *)tvb_get_ptr(tvb, 5, resp_strlen), resp_strlen); - if (sscanf((const gchar *)data, "%d.%d %d", &minor, &major, &status_code) == 3) { - proto_tree_add_uint(tree, hf_http_response_code, tvb, 9, 3, status_code); - stat_info->response_code = status_code; - } - g_free(data); + gchar response_chars[4]; + gint end; + + /* find the first space to determine the end of the version */ + end = tvb_find_guint8(tvb,start,-1,' '); + + proto_tree_add_item(tree, hf_http_version, tvb, start, end - start, FALSE); + + start = end + 1; + + tvb_memcpy(tvb,response_chars,start,3); + response_chars[3] = '\0'; + + stat_info->response_code = strtoul(response_chars,NULL,10); + + proto_tree_add_uint(tree,hf_http_response_code,tvb,start,3,stat_info->response_code); + } /* @@ -1723,7 +1718,7 @@ proto_register_http(void) { "Request URI", "http.request.uri", FT_STRING, BASE_NONE, NULL, 0x0, "HTTP Request-URI", HFILL }}, - { &hf_http_request_version, + { &hf_http_version, { "Request Version", "http.request.version", FT_STRING, BASE_NONE, NULL, 0x0, "HTTP Request HTTP-Version", HFILL }},