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