Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #**************************************************************************
- # _ _ ____ _
- # Project ___| | | | _ \| |
- # / __| | | | |_) | |
- # | (__| |_| | _ <| |___
- # \___|\___/|_| \_\_____|
- #
- # Copyright (C) 1998 - 2013, Daniel Stenberg, <[email protected]>, et al.
- #
- # This software is licensed as described in the file COPYING, which
- # you should have received as part of this distribution. The terms
- # are also available at http://curl.haxx.se/docs/copyright.html.
- #
- # You may opt to use, copy, modify, merge, publish, distribute and/or sell
- # copies of the Software, and permit persons to whom the Software is
- # furnished to do so, under the terms of the COPYING file.
- #
- # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- # KIND, either express or implied.
- #
- # *************************************************************************
- # Example source code to show how the callback function can be used to
- # download data into a chunk of memory instead of storing it in a file.
- #
- type
- MemoryStruct* = object
- memory*: cstring
- size*: csize
- proc WriteMemoryCallback*(contents: pointer; size: csize; nmemb: csize;
- userp: pointer): csize =
- var realsize: csize = size * nmemb
- var mem: ptr MemoryStruct = cast[ptr MemoryStruct](userp)
- mem.memory = realloc(mem.memory, mem.size + realsize + 1)
- if mem.memory == nil:
- # out of memory!
- printf("not enough memory (realloc returned NULL)\x0A")
- return 0
- memcpy(addr((mem.memory[mem.size])), contents, realsize)
- inc(mem.size, realsize)
- mem.memory[mem.size] = 0
- return realsize
- proc main*(): cint =
- var curl_handle: ptr CURL
- var res: CURLcode
- var chunk: MemoryStruct
- chunk.memory = malloc(1)
- # will be grown as needed by the realloc above
- chunk.size = 0
- # no data at this point
- curl_global_init(CURL_GLOBAL_ALL)
- # init the curl session
- curl_handle = curl_easy_init()
- # specify URL to get
- curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/")
- # send all data to this function
- curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)
- # we pass our 'chunk' struct to the callback function
- curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, cast[pointer](addr(chunk)))
- # some servers don't like requests that are made without a user-agent
- # field, so we provide one
- curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0")
- # get it!
- res = curl_easy_perform(curl_handle)
- # check for errors
- if res != CURLE_OK:
- fprintf(stderr, "curl_easy_perform() failed: %s\x0A",
- curl_easy_strerror(res))
- else:
- #
- # Now, our chunk.memory points to a memory block that is chunk.size
- # bytes big and contains the remote file.
- #
- # Do something nice with it!
- #
- printf("%lu bytes retrieved\x0A", cast[clong](chunk.size))
- # cleanup curl stuff
- curl_easy_cleanup(curl_handle)
- if chunk.memory:
- free(chunk.memory)
- curl_global_cleanup()
- return 0
Advertisement
Add Comment
Please, Sign In to add comment