~ubuntu-branches/ubuntu/jaunty/libsoup2.4/jaunty-proposed

« back to all changes in this revision

Viewing changes to libsoup/soup-headers.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2008-12-17 14:51:11 UTC
  • mfrom: (1.1.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20081217145111-sqbz10l57fmrh4vz
Tags: 2.25.4-0ubuntu1
* New upstream version
* debian/control.in:
  - build-depends on libgconf2-dev, libproxy-dev
* Updated to list the new libsoup-gnome binaries
* debian/rules:
  - updated shlibs version and list the new library

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
 
13
13
#include "soup-headers.h"
14
14
#include "soup-misc.h"
 
15
#include "soup-uri.h"
15
16
 
16
 
static gboolean
 
17
/**
 
18
 * soup_headers_parse:
 
19
 * @str: the header string (including the Request-Line or Status-Line,
 
20
 * and the trailing blank line)
 
21
 * @len: length of @str up to (but not including) the terminating blank line.
 
22
 * @dest: #SoupMessageHeaders to store the header values in
 
23
 *
 
24
 * Parses the headers of an HTTP request or response in @str and
 
25
 * stores the results in @dest. Beware that @dest may be modified even
 
26
 * on failure.
 
27
 *
 
28
 * This is a low-level method; normally you would use
 
29
 * soup_headers_parse_request() or soup_headers_parse_response().
 
30
 *
 
31
 * Return value: success or failure
 
32
 **/
 
33
gboolean
17
34
soup_headers_parse (const char *str, int len, SoupMessageHeaders *dest)
18
35
{
19
36
        const char *headers_start;
602
619
        *dst = '\0';
603
620
}
604
621
 
 
622
static gboolean
 
623
decode_rfc2231 (char *encoded_string)
 
624
{
 
625
        char *q, *decoded;
 
626
 
 
627
        q = strchr (encoded_string, '\'');
 
628
        if (!q)
 
629
                return FALSE;
 
630
        if (g_ascii_strncasecmp (encoded_string, "UTF-8",
 
631
                                 q - encoded_string) != 0)
 
632
                return FALSE;
 
633
 
 
634
        q = strchr (q + 1, '\'');
 
635
        if (!q)
 
636
                return FALSE;
 
637
 
 
638
        decoded = soup_uri_decode (q + 1);
 
639
        /* strlen(decoded) <= strlen(q + 1) < strlen(encoded_string) */
 
640
        strcpy (encoded_string, decoded);
 
641
        g_free (decoded);
 
642
        return TRUE;
 
643
}
 
644
 
605
645
static GHashTable *
606
646
parse_param_list (const char *header, char delim)
607
647
{
632
672
                        *name_end = '\0';
633
673
 
634
674
                        value = (char *)skip_lws (eq + 1);
635
 
                        if (*value == '"')
 
675
 
 
676
                        if (name_end[-1] == '*' && name_end > item + 1) {
 
677
                                name_end[-1] = '\0';
 
678
                                if (!decode_rfc2231 (value)) {
 
679
                                        g_free (item);
 
680
                                        continue;
 
681
                                }
 
682
                        } else if (*value == '"')
636
683
                                decode_quoted_string (value);
637
684
                } else
638
685
                        value = NULL;
654
701
 * Tokens that don't have an associated value will still be added to
655
702
 * the resulting hash table, but with a %NULL value.
656
703
 * 
 
704
 * This also handles RFC2231 encoding (which in HTTP is mostly used
 
705
 * for giving UTF8-encoded filenames in the Content-Disposition
 
706
 * header).
 
707
 *
657
708
 * Return value: a #GHashTable of list elements, which can be freed
658
709
 * with soup_header_free_param_list().
659
710
 **/
673
724
 * Tokens that don't have an associated value will still be added to
674
725
 * the resulting hash table, but with a %NULL value.
675
726
 * 
 
727
 * This also handles RFC2231 encoding (which in HTTP is mostly used
 
728
 * for giving UTF8-encoded filenames in the Content-Disposition
 
729
 * header).
 
730
 *
676
731
 * Return value: a #GHashTable of list elements, which can be freed
677
732
 * with soup_header_free_param_list().
678
733
 **/
694
749
{
695
750
        g_hash_table_destroy (param_list);
696
751
}
 
752
 
 
753
static void
 
754
append_param_rfc2231 (GString *string, const char *value)
 
755
{
 
756
        char *encoded;
 
757
 
 
758
        g_string_append (string, "*=UTF-8''");
 
759
        encoded = soup_uri_encode (value, " *'%()<>@,;:\\\"/[]?=");
 
760
        g_string_append (string, encoded);
 
761
        g_free (encoded);
 
762
}
 
763
 
 
764
static void
 
765
append_param_quoted (GString *string, const char *value)
 
766
{
 
767
        int len;
 
768
 
 
769
        g_string_append (string, "=\"");
 
770
        while (*value) {
 
771
                while (*value == '\\' || *value == '"') {
 
772
                        g_string_append_c (string, '\\');
 
773
                        g_string_append_c (string, *value++);
 
774
                }
 
775
                len = strcspn (value, "\\\"");
 
776
                g_string_append_len (string, value, len);
 
777
                value += len;
 
778
        }
 
779
        g_string_append_c (string, '"');
 
780
}
 
781
 
 
782
/**
 
783
 * soup_header_g_string_append_param:
 
784
 * @string: a #GString being used to construct an HTTP header value
 
785
 * @name: a parameter name
 
786
 * @value: a parameter value
 
787
 *
 
788
 * Appends something like <literal>@name="@value"</literal> to @string,
 
789
 * taking care to appropriately escape any quotes or backslashes in @value.
 
790
 *
 
791
 * Alternatively, if @value is a non-ASCII UTF-8 string, it will be
 
792
 * appended using RFC2231 syntax. Although in theory this is supposed
 
793
 * to work anywhere in HTTP that uses this style of parameter, in
 
794
 * reality, it can only be used portably with the Content-Disposition
 
795
 * "filename" parameter.
 
796
 **/
 
797
void
 
798
soup_header_g_string_append_param (GString *string, const char *name,
 
799
                                   const char *value)
 
800
{
 
801
        const char *v;
 
802
 
 
803
        g_string_append (string, name);
 
804
 
 
805
        for (v = value; *v; v++) {
 
806
                if (*v & 0x80) {
 
807
                        if (g_utf8_validate (value, -1, NULL)) {
 
808
                                append_param_rfc2231 (string, value);
 
809
                                return;
 
810
                        } else
 
811
                                break;
 
812
                }
 
813
        }
 
814
        append_param_quoted (string, value);
 
815
}