2019-06-23 05:21:30 +03:00
|
|
|
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
|
|
|
|
// Use of this source code is governed by an MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
|
2019-06-22 21:20:28 +03:00
|
|
|
module http
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
type downloadfn fn (written int)
|
2019-06-24 00:02:11 +03:00
|
|
|
type download_finished_fn fn ()
|
2019-06-22 21:20:28 +03:00
|
|
|
|
|
|
|
struct DownloadStruct {
|
2019-06-24 00:02:11 +03:00
|
|
|
mut:
|
2019-06-22 21:20:28 +03:00
|
|
|
stream voidptr
|
|
|
|
written int
|
|
|
|
cb downloadfn
|
|
|
|
}
|
|
|
|
|
|
|
|
fn download_cb(ptr voidptr, size, nmemb size_t, userp voidptr) int {
|
2019-06-24 00:02:11 +03:00
|
|
|
mut data := &DownloadStruct(userp)
|
|
|
|
written := C.fwrite(ptr, size, nmemb, data.stream)
|
|
|
|
data.written += written
|
|
|
|
#data->cb(data->written); // TODO
|
|
|
|
return written
|
2019-06-22 21:20:28 +03:00
|
|
|
}
|
|
|
|
|
2019-07-01 03:58:49 +03:00
|
|
|
fn download_file_with_progress(url, out string, cb downloadfn, cb_finished download_finished_fn) {
|
2019-06-22 21:20:28 +03:00
|
|
|
curl := C.curl_easy_init()
|
|
|
|
if isnil(curl) {
|
|
|
|
return
|
|
|
|
}
|
2019-06-24 00:02:11 +03:00
|
|
|
cout := out.cstr()
|
|
|
|
fp := C.fopen(cout, 'wb')
|
|
|
|
C.curl_easy_setopt(curl, CURLOPT_URL, url.cstr())
|
2019-06-22 21:20:28 +03:00
|
|
|
C.curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, download_cb)
|
|
|
|
data := &DownloadStruct {
|
2019-06-24 00:02:11 +03:00
|
|
|
stream:fp
|
2019-06-22 21:20:28 +03:00
|
|
|
cb: cb
|
|
|
|
}
|
2019-06-24 00:02:11 +03:00
|
|
|
C.curl_easy_setopt(curl, CURLOPT_WRITEDATA, data)
|
|
|
|
mut d := 0.0
|
|
|
|
C.curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d)
|
|
|
|
C.curl_easy_perform(curl)
|
|
|
|
C.curl_easy_cleanup(curl)
|
|
|
|
C.fclose(fp)
|
|
|
|
#cb_finished(); // TODO
|
2019-06-22 21:20:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
fn download_file(url, out string) {
|
2019-06-24 00:02:11 +03:00
|
|
|
download_file_with_progress(url, out, empty, empty)
|
2019-06-22 21:20:28 +03:00
|
|
|
}
|
|
|
|
|
2019-06-24 00:02:11 +03:00
|
|
|
fn empty() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|