aboutsummaryrefslogtreecommitdiffstats
path: root/ui/follow.c
blob: 8fc6f852d1883d45b281ffd84ced34cf9dda4b07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* follow.c
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * This program 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.
 *
 * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include "config.h"

#include <string.h>

#include <glib.h>


#include "ui/follow.h"

#ifdef HAVE_LIBZ
static char *
sgetline(char *str, int *next)
{
    char *end;

    end = strstr(str, "\r\n");
    if (!end) {
        *next = (int)strlen(str);
        return NULL;
    }
    *end = '\0';
    *next = (int)(end-str+2);
    return str;
}

gboolean
parse_http_header(char *data, size_t len, size_t *content_start)
{
    char *tmp, *copy, *line;
    size_t pos = 0;
    int next_line;
    gboolean is_gzipped;

    /* XXX handle case where only partial header is passed in here.
     * we should pass something back to indicate whether header is complete.
     * (if not, is_gzipped is may still be unknown)
     */

    /*
     * In order to parse header, we duplicate data and tokenize lines.
     * We aren't interested in actual data, so use g_strndup instead of memcpy
     * to (possibly) copy fewer bytes (e.g., if a nul byte exists in data)
     * This also ensures that we have a terminated string for further
     * processing.
     */
    tmp = copy = g_strndup(data, len);
    if (!tmp) {
        *content_start = 0;
        return FALSE;
    }

    /* skip HTTP... line*/
    /*line = */sgetline(tmp, &next_line);

    tmp += next_line;
    pos += next_line;

    is_gzipped = FALSE;

    *content_start = -1;
    while ((line = sgetline(tmp, &next_line))) {
        char *key, *val, *c;

        tmp += next_line;
        pos += next_line;

        if (strlen(line) == 0) {
            /* end of header*/
            break;
        }

        c = strchr(line, ':');
        if (!c) break;

        key = line;
        *c = '\0';
        val = c+2;

        if (!strcmp(key, "Content-Encoding") && strstr(val, "gzip")) {
            is_gzipped = TRUE;
        }
    }
    *content_start = pos;
    g_free(copy);
    return is_gzipped;
}
#endif


/*
 * Editor modelines
 *
 * Local Variables:
 * c-basic-offset: 4
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * ex: set shiftwidth=4 tabstop=8 expandtab:
 * :indentSize=4:tabSize=8:noTabs=true:
 */