]> Pileus Git - grits/blobdiff - src/data/grits-http.c
Fix memory leaks
[grits] / src / data / grits-http.c
index c4b4484faa7250f88c805b76f87a2bde7d33e16d..8880d7484710186e7534dc85d985a409a8260864 100644 (file)
@@ -54,6 +54,7 @@ GritsHttp *grits_http_new(const gchar *prefix)
        http->soup = soup_session_sync_new();
        http->prefix = g_strdup(prefix);
        g_object_set(http->soup, "user-agent", PACKAGE_STRING, NULL);
+       g_object_set(http->soup, "timeout",    10,             NULL);
        return http;
 }
 
@@ -163,6 +164,10 @@ gchar *grits_http_fetch(GritsHttp *http, const gchar *uri, const char *local,
                if (!g_file_test(path, G_FILE_TEST_EXISTS))
                        part = g_strdup_printf("%s.part", path);
                FILE *fp = fopen_p(part, "ab");
+               if (!fp) {
+                       g_warning("GritsHttp: fetch - error opening %s", path);
+                       return NULL;
+               }
                fseek(fp, 0, SEEK_END); // "a" is broken on Windows, twice
 
                /* Make temp data */
@@ -178,29 +183,37 @@ gchar *grits_http_fetch(GritsHttp *http, const gchar *uri, const char *local,
                if (message == NULL)
                        g_error("message is null, cannot parse uri");
                g_signal_connect(message, "got-chunk", G_CALLBACK(_chunk_cb), &info);
-               soup_message_headers_set_range(message->request_headers, ftell(fp), -1);
+               //if (ftell(fp) > 0)
+                       soup_message_headers_set_range(message->request_headers, ftell(fp), -1);
+               if (mode == GRITS_REFRESH)
+                       soup_message_headers_replace(message->request_headers,
+                                       "Cache-Control", "max-age=0");
                soup_session_send_message(http->soup, message);
 
                /* Close file */
                fclose(fp);
-               if (path != part && SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) {
-                       g_rename(part, path);
+               if (path != part) {
+                       if (SOUP_STATUS_IS_SUCCESSFUL(message->status_code))
+                               g_rename(part, path);
                        g_free(part);
                }
 
                /* Finished */
-               if (message->status_code == 416) {
+               guint status = message->status_code;
+               g_object_unref(message);
+               if (status == SOUP_STATUS_CANCELLED) {
+                       return NULL;
+               } else if (status == SOUP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE) {
                        /* Range unsatisfiable, file already complete */
-               } else if (!SOUP_STATUS_IS_SUCCESSFUL(message->status_code)) {
+               } else if (!SOUP_STATUS_IS_SUCCESSFUL(status)) {
                        g_warning("GritsHttp: done_cb - error copying file, status=%d\n"
                                        "\tsrc=%s\n"
                                        "\tdst=%s",
-                                       message->status_code, uri, path);
+                                       status, uri, path);
                        return NULL;
                }
        }
 
-
        /* TODO: free everything.. */
        return path;
 }