diff --git a/main.cpp b/main.cpp
index 5520583..469b2b7 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,4 +1,6 @@
 #include <curl/curl.h>
+#include <sstream>
+#include <string>
 #include <iostream>
 #include <vector>
 #include "histogram.h"
@@ -42,35 +44,41 @@ Input input_data(std::istream& in, bool prompt)
 
     return data;
 }
-
-int main(int argc, char* argv[])
+size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx){
+    stringstream* buffer = reinterpret_cast<stringstream*>(ctx);
+    size_t data_size = item_size * item_count;
+    buffer->write(reinterpret_cast<const char*>(items), data_size);
+    return data_size;
+}
+Input download(const string& address)
 {
-    curl_global_init(CURL_GLOBAL_ALL);
-    using namespace std;
-
-    if (argc > 1)
+    stringstream buffer;
+    CURL* curl = curl_easy_init();
+    if (curl)
     {
-        const char *url = argv[1];
-
-        CURL *curl = curl_easy_init();
-                if (curl) {
-            curl_easy_setopt(curl, CURLOPT_URL, url);
-            curl_easy_perform(curl);
-
-            CURLcode res = curl_easy_perform(curl);
-            if (res != CURLE_OK) {
-                cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << endl;
-                exit(1);
-            }
-
-            curl_easy_cleanup(curl);
+        curl_easy_setopt(curl, CURLOPT_URL, address.c_str());
+        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
+        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
+        CURLcode res = curl_easy_perform(curl);
+        curl_easy_cleanup(curl);
+        if (res != CURLE_OK)
+        {
+            cerr << "cURL error: " << curl_easy_strerror(res) << endl;
+            exit(1);
         }
-
-        return 0;
+        return input_data(buffer, false);
     }
-
-    auto in = input_data(cin,true);
-    auto bins = make_histogram(in.bin_count, in.numbers);
+}
+int
+main(int argc, char* argv[]) {
+    Input input;
+    if (argc > 1) {
+        input = download(argv[1]);
+    } else {
+        input = input_data(cin, true);
+    }
+    auto bins = make_histogram(input.bin_count, input.numbers);
     show_histogram_svg(bins);
-    return 0;
 }
+
+