tests/lib/: Change license header
[libquvi-scripts.git] / tests / lib / fetch.c
blob718112ccc72fc6e05cbcab900601bae333b939e7
1 /* libquvi-scripts
2 * Copyright (C) 2012 Toni Gundogdu <legatvs@gmail.com>
4 * This file is part of libquvi-scripts <http://quvi.sourceforge.net>.
6 * This program is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU Affero General Public
8 * License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
16 * You should have received a copy of the GNU Affero General
17 * Public License along with this program. If not, see
18 * <http://www.gnu.org/licenses/>.
21 #include "config.h"
23 #include <string.h>
24 #include <glib.h>
25 #include <quvi.h>
26 #include <curl/curl.h>
28 struct temp_s
30 gsize size;
31 gchar *p;
33 typedef struct temp_s *temp_t;
35 static gpointer temp_new()
37 return (g_new0(struct temp_s, 1));
40 static void temp_free(temp_t t)
42 if (t == NULL)
43 return;
45 g_free(t->p);
46 t->p = NULL;
48 g_free(t);
49 t = NULL;
52 /* cURL write callback. */
53 static gsize temp_wrcb(gpointer p, gsize sz, gsize nmemb, gpointer d)
55 const gsize rsize = sz*nmemb;
56 gpointer *np;
57 temp_t t;
59 t = (temp_t) d;
60 np = g_realloc(t->p, t->size+rsize+1);
62 if (np != NULL)
64 t->p = (gchar*) np;
65 memcpy(&(t->p[t->size]), p, rsize);
66 t->size += rsize;
67 t->p[t->size] = '\0';
69 return (rsize);
72 static void set_opts(CURL *c, temp_t t, const gchar *url)
74 typedef curl_write_callback cwc;
76 curl_easy_setopt(c, CURLOPT_USERAGENT, "Mozilla/5.0");
77 curl_easy_setopt(c, CURLOPT_FOLLOWLOCATION, 1L);
78 curl_easy_setopt(c, CURLOPT_MAXREDIRS, 5L); /* http://is.gd/kFsvE4 */
79 curl_easy_setopt(c, CURLOPT_NOBODY, 0L);
81 curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, (cwc) temp_wrcb);
82 curl_easy_setopt(c, CURLOPT_URL, url);
83 curl_easy_setopt(c, CURLOPT_WRITEDATA, t);
84 /* CURLOPT_ENCODING -> CURLOPT_ACCEPT_ENCODING 7.21.6+ */
85 curl_easy_setopt(c, CURLOPT_ENCODING, "");
87 if (chk_env("TEST_VERBOSE", NULL) == TRUE)
88 curl_easy_setopt(c, CURLOPT_VERBOSE, 1L);
91 static void reset_opts(CURL *c)
93 curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, NULL);
94 curl_easy_setopt(c, CURLOPT_WRITEDATA, NULL);
97 static gint _fetch(CURL *c)
99 CURLcode curlcode;
100 glong respcode;
101 gint rc;
103 curlcode = curl_easy_perform(c);
104 curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &respcode);
106 rc = 0;
108 if (curlcode == CURLE_OK && respcode == 200)
110 else
112 if (curlcode == CURLE_OK)
114 #define _EOK "server responded with code %03ld"
115 g_test_message(_EOK, respcode);
116 #undef _EOK
118 else
120 const gchar *s = curl_easy_strerror(curlcode);
121 const glong c = respcode;
122 const gint cc = curlcode;
123 #define _ENO "%s (HTTP/%03ld, cURL=0x%03x)"
124 g_test_message(_ENO, s, c, cc);
125 #undef _ENO
127 rc = 1;
129 return (rc);
132 gchar *fetch(const gchar *url)
134 gchar *r;
135 temp_t t;
136 CURL *c;
137 gint rc;
139 curl_global_init(CURL_GLOBAL_ALL);
141 c = curl_easy_init();
142 if (c == NULL)
144 g_message("curl_easy_init returned NULL");
145 return (NULL);
148 t = temp_new();
149 r = NULL;
151 set_opts(c, t, url);
152 rc = _fetch(c);
153 reset_opts(c);
155 if (rc == 0)
156 r = g_strdup(t->p);
158 temp_free(t);
159 t = NULL;
161 curl_easy_cleanup(c);
162 c = NULL;
164 curl_global_cleanup();
166 return (r);
169 /* vim: set ts=2 sw=2 tw=72 expandtab: */