Git init
[profile/ivi/libsoup2.4.git] / tests / get.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2001-2003, Ximian, Inc.
4  */
5
6 #ifdef HAVE_CONFIG_H
7 #include <config.h>
8 #endif
9
10 #include <ctype.h>
11 #include <errno.h>
12 #include <fcntl.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <sys/stat.h>
17 #include <unistd.h>
18
19 #ifdef HAVE_GNOME
20 #include <libsoup/soup-gnome.h>
21 #else
22 #include <libsoup/soup.h>
23 #endif
24
25 static SoupSession *session;
26 static GMainLoop *loop;
27 static gboolean debug = FALSE, quiet = FALSE;
28 static const char *method;
29
30 static void
31 get_url (const char *url)
32 {
33         const char *name;
34         SoupMessage *msg;
35         const char *header;
36
37         msg = soup_message_new (method, url);
38         soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
39
40         soup_session_send_message (session, msg);
41
42         name = soup_message_get_uri (msg)->path;
43
44         if (debug) {
45                 SoupMessageHeadersIter iter;
46                 const char *hname, *value;
47                 char *path = soup_uri_to_string (soup_message_get_uri (msg), TRUE);
48
49                 printf ("%s %s HTTP/1.%d\n", method, path,
50                         soup_message_get_http_version (msg));
51                 soup_message_headers_iter_init (&iter, msg->request_headers);
52                 while (soup_message_headers_iter_next (&iter, &hname, &value))
53                         printf ("%s: %s\r\n", hname, value);
54                 printf ("\n");
55
56                 printf ("HTTP/1.%d %d %s\n",
57                         soup_message_get_http_version (msg),
58                         msg->status_code, msg->reason_phrase);
59
60                 soup_message_headers_iter_init (&iter, msg->response_headers);
61                 while (soup_message_headers_iter_next (&iter, &hname, &value))
62                         printf ("%s: %s\r\n", hname, value);
63                 printf ("\n");
64         } else if (!quiet || SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code))
65                 printf ("%s: %d %s\n", name, msg->status_code, msg->reason_phrase);
66
67         if (SOUP_STATUS_IS_REDIRECTION (msg->status_code)) {
68                 header = soup_message_headers_get_one (msg->response_headers,
69                                                        "Location");
70                 if (header) {
71                         SoupURI *uri;
72                         char *uri_string;
73
74                         if (!debug && !quiet)
75                                 printf ("  -> %s\n", header);
76
77                         uri = soup_uri_new_with_base (soup_message_get_uri (msg), header);
78                         uri_string = soup_uri_to_string (uri, FALSE);
79                         get_url (uri_string);
80                         g_free (uri_string);
81                         soup_uri_free (uri);
82                 }
83         } else if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
84                 fwrite (msg->response_body->data, 1,
85                         msg->response_body->length, stdout);
86         }
87 }
88
89 static void
90 usage (void)
91 {
92         fprintf (stderr, "Usage: get [-c CAfile] [-p proxy URL] [-h] [-d] URL\n");
93         exit (1);
94 }
95
96 int
97 main (int argc, char **argv)
98 {
99         const char *cafile = NULL, *url;
100         SoupURI *proxy = NULL, *parsed;
101         gboolean synchronous = FALSE;
102         int opt;
103
104         g_thread_init (NULL);
105         g_type_init ();
106
107         method = SOUP_METHOD_GET;
108
109         while ((opt = getopt (argc, argv, "c:dhp:qs")) != -1) {
110                 switch (opt) {
111                 case 'c':
112                         cafile = optarg;
113                         break;
114
115                 case 'd':
116                         debug = TRUE;
117                         break;
118
119                 case 'h':
120                         method = SOUP_METHOD_HEAD;
121                         debug = TRUE;
122                         break;
123
124                 case 'p':
125                         proxy = soup_uri_new (optarg);
126                         if (!proxy) {
127                                 fprintf (stderr, "Could not parse %s as URI\n",
128                                          optarg);
129                                 exit (1);
130                         }
131                         break;
132
133                 case 'q':
134                         quiet = TRUE;
135                         break;
136
137                 case 's':
138                         synchronous = TRUE;
139                         break;
140
141                 case '?':
142                         usage ();
143                         break;
144                 }
145         }
146         argc -= optind;
147         argv += optind;
148
149         if (argc != 1)
150                 usage ();
151         url = argv[0];
152         parsed = soup_uri_new (url);
153         if (!parsed) {
154                 fprintf (stderr, "Could not parse '%s' as a URL\n", url);
155                 exit (1);
156         }
157         soup_uri_free (parsed);
158
159         if (synchronous) {
160                 session = soup_session_sync_new_with_options (
161                         SOUP_SESSION_SSL_CA_FILE, cafile,
162 #ifdef HAVE_GNOME
163                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_GNOME_FEATURES_2_26,
164 #endif
165                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_DECODER,
166                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
167                         SOUP_SESSION_USER_AGENT, "get ",
168                         SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
169                         NULL);
170         } else {
171                 session = soup_session_async_new_with_options (
172                         SOUP_SESSION_SSL_CA_FILE, cafile,
173 #ifdef HAVE_GNOME
174                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_GNOME_FEATURES_2_26,
175 #endif
176                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_DECODER,
177                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
178                         SOUP_SESSION_USER_AGENT, "get ",
179                         SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
180                         NULL);
181         }
182
183         /* Need to do this after creating the session, since adding
184          * SOUP_TYPE_GNOME_FEATURE_2_26 will add a proxy resolver, thereby
185          * bashing over the manually-set proxy.
186          */
187         if (proxy) {
188                 g_object_set (G_OBJECT (session), 
189                               SOUP_SESSION_PROXY_URI, proxy,
190                               NULL);
191         }
192
193         if (!synchronous)
194                 loop = g_main_loop_new (NULL, TRUE);
195
196         get_url (url);
197
198         if (!synchronous)
199                 g_main_loop_unref (loop);
200
201         return 0;
202 }