soup-multipart-input-stream: belatedly add .h file to soup.h
[platform/upstream/libsoup.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 #include "test-utils.h"
7 #include <stdio.h>
8
9 #ifdef G_OS_WIN32
10 #include <getopt.h>
11 #endif
12
13 static SoupSession *session;
14 static GMainLoop *loop;
15 static gboolean debug = FALSE, quiet = FALSE;
16 static const char *method;
17
18 static void
19 get_url (const char *url)
20 {
21         const char *name;
22         SoupMessage *msg;
23         const char *header;
24
25         msg = soup_message_new (method, url);
26         soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
27
28         soup_session_send_message (session, msg);
29
30         name = soup_message_get_uri (msg)->path;
31
32         if (debug) {
33                 SoupMessageHeadersIter iter;
34                 const char *hname, *value;
35                 char *path = soup_uri_to_string (soup_message_get_uri (msg), TRUE);
36
37                 g_print ("%s %s HTTP/1.%d\n", method, path,
38                          soup_message_get_http_version (msg));
39                 soup_message_headers_iter_init (&iter, msg->request_headers);
40                 while (soup_message_headers_iter_next (&iter, &hname, &value))
41                         g_print ("%s: %s\r\n", hname, value);
42                 g_print ("\n");
43
44                 g_print ("HTTP/1.%d %d %s\n",
45                          soup_message_get_http_version (msg),
46                          msg->status_code, msg->reason_phrase);
47
48                 soup_message_headers_iter_init (&iter, msg->response_headers);
49                 while (soup_message_headers_iter_next (&iter, &hname, &value))
50                         g_print ("%s: %s\r\n", hname, value);
51                 g_print ("\n");
52         } else if (msg->status_code == SOUP_STATUS_SSL_FAILED) {
53                 GTlsCertificateFlags flags;
54
55                 if (soup_message_get_https_status (msg, NULL, &flags))
56                         g_print ("%s: %d %s (0x%x)\n", name, msg->status_code, msg->reason_phrase, flags);
57                 else
58                         g_print ("%s: %d %s (no handshake status)\n", name, msg->status_code, msg->reason_phrase);
59         } else if (!quiet || SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code))
60                 g_print ("%s: %d %s\n", name, msg->status_code, msg->reason_phrase);
61
62         if (SOUP_STATUS_IS_REDIRECTION (msg->status_code)) {
63                 header = soup_message_headers_get_one (msg->response_headers,
64                                                        "Location");
65                 if (header) {
66                         SoupURI *uri;
67                         char *uri_string;
68
69                         if (!debug && !quiet)
70                                 g_print ("  -> %s\n", header);
71
72                         uri = soup_uri_new_with_base (soup_message_get_uri (msg), header);
73                         uri_string = soup_uri_to_string (uri, FALSE);
74                         get_url (uri_string);
75                         g_free (uri_string);
76                         soup_uri_free (uri);
77                 }
78         } else if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
79                 fwrite (msg->response_body->data, 1,
80                         msg->response_body->length, stdout);
81         }
82 }
83
84 static void
85 usage (void)
86 {
87         g_printerr ("Usage: get [-c CAfile] [-p proxy URL] [-h] [-d] URL\n");
88         exit (1);
89 }
90
91 int
92 main (int argc, char **argv)
93 {
94         const char *cafile = NULL, *url;
95         SoupURI *proxy = NULL, *parsed;
96         gboolean synchronous = FALSE, ntlm = FALSE;
97         int opt;
98
99         method = SOUP_METHOD_GET;
100
101         while ((opt = getopt (argc, argv, "c:dhnp:qs")) != -1) {
102                 switch (opt) {
103                 case 'c':
104                         cafile = optarg;
105                         break;
106
107                 case 'd':
108                         debug = TRUE;
109                         break;
110
111                 case 'h':
112                         method = SOUP_METHOD_HEAD;
113                         debug = TRUE;
114                         break;
115
116                 case 'n':
117                         ntlm = TRUE;
118                         break;
119
120                 case 'p':
121                         proxy = soup_uri_new (optarg);
122                         if (!proxy) {
123                                 g_printerr ("Could not parse %s as URI\n",
124                                             optarg);
125                                 exit (1);
126                         }
127                         break;
128
129                 case 'q':
130                         quiet = TRUE;
131                         break;
132
133                 case 's':
134                         synchronous = TRUE;
135                         break;
136
137                 case '?':
138                         usage ();
139                         break;
140                 }
141         }
142         argc -= optind;
143         argv += optind;
144
145         if (argc != 1)
146                 usage ();
147         url = argv[0];
148         parsed = soup_uri_new (url);
149         if (!parsed) {
150                 g_printerr ("Could not parse '%s' as a URL\n", url);
151                 exit (1);
152         }
153         soup_uri_free (parsed);
154
155         if (synchronous) {
156                 session = soup_session_sync_new_with_options (
157                         SOUP_SESSION_SSL_CA_FILE, cafile,
158                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_DECODER,
159                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
160                         SOUP_SESSION_USER_AGENT, "get ",
161                         SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
162                         SOUP_SESSION_USE_NTLM, ntlm,
163                         NULL);
164         } else {
165                 session = soup_session_async_new_with_options (
166                         SOUP_SESSION_SSL_CA_FILE, cafile,
167                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_CONTENT_DECODER,
168                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
169                         SOUP_SESSION_USER_AGENT, "get ",
170                         SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE,
171                         SOUP_SESSION_USE_NTLM, ntlm,
172                         NULL);
173         }
174
175         if (proxy) {
176                 g_object_set (G_OBJECT (session), 
177                               SOUP_SESSION_PROXY_URI, proxy,
178                               NULL);
179         } else
180                 soup_session_add_feature_by_type (session, SOUP_TYPE_PROXY_RESOLVER_DEFAULT);
181
182         if (!synchronous)
183                 loop = g_main_loop_new (NULL, TRUE);
184
185         get_url (url);
186
187         if (!synchronous)
188                 g_main_loop_unref (loop);
189
190         return 0;
191 }