expose low level curl.
This commit is contained in:
parent
d25438bdf0
commit
02ba0f25d3
5 changed files with 48 additions and 12 deletions
28
examples/low-level.js
Normal file
28
examples/low-level.js
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
var Curl = require('../lib/Curl')
|
||||||
|
|
||||||
|
var p = console.log;
|
||||||
|
var url = process.argv[2];
|
||||||
|
|
||||||
|
var curl = new Curl();
|
||||||
|
|
||||||
|
if (!url)
|
||||||
|
url = 'www.yahoo.com';
|
||||||
|
|
||||||
|
curl.setopt('URL', url);
|
||||||
|
curl.setopt('CONNECTTIMEOUT', 2);
|
||||||
|
|
||||||
|
// on 'data' must be returns chunk.length, or means interrupt the transfer
|
||||||
|
curl.on('data', function(chunk) {
|
||||||
|
return chunk.length;
|
||||||
|
});
|
||||||
|
|
||||||
|
curl.on('error', function(e) {
|
||||||
|
curl.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
curl.on('end', function() {
|
||||||
|
curl.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
curl.perform();
|
7
index.js
7
index.js
|
@ -1,6 +1,9 @@
|
||||||
// Generated by CoffeeScript 1.1.4-3
|
// Generated by ToffeeScript 1.4.0
|
||||||
(function() {
|
(function() {
|
||||||
|
var CurlBuilder;
|
||||||
|
|
||||||
module.exports = require('./lib/curl');
|
CurlBuilder = require('./lib/CurlBuilder');
|
||||||
|
|
||||||
|
module.exports = CurlBuilder.create();
|
||||||
|
|
||||||
}).call(this);
|
}).call(this);
|
||||||
|
|
|
@ -21,6 +21,7 @@ Curl::setopt = (ooption, value) ->
|
||||||
@setopt_str_ option_id, value.toString()
|
@setopt_str_ option_id, value.toString()
|
||||||
else
|
else
|
||||||
throw new Error("unsupported option #{option}")
|
throw new Error("unsupported option #{option}")
|
||||||
|
@
|
||||||
|
|
||||||
Curl::getinfo = (oinfo) ->
|
Curl::getinfo = (oinfo) ->
|
||||||
info = oinfo.toUpperCase()
|
info = oinfo.toUpperCase()
|
||||||
|
@ -34,6 +35,7 @@ Curl::getinfo = (oinfo) ->
|
||||||
@getinfo_double_(info_id)
|
@getinfo_double_(info_id)
|
||||||
else
|
else
|
||||||
throw new Error("unsupported info #{oinfo}")
|
throw new Error("unsupported info #{oinfo}")
|
||||||
|
@
|
||||||
|
|
||||||
Curl.user_options =
|
Curl.user_options =
|
||||||
RAW: 'RAW'
|
RAW: 'RAW'
|
||||||
|
@ -58,6 +60,7 @@ Curl::on = (event, callback) ->
|
||||||
Curl::perform = ->
|
Curl::perform = ->
|
||||||
@perform_()
|
@perform_()
|
||||||
Curl.process()
|
Curl.process()
|
||||||
|
@
|
||||||
|
|
||||||
Curl.process = ->
|
Curl.process = ->
|
||||||
if Curl.in_process
|
if Curl.in_process
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
// Generated by ToffeeScript 1.4.0
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}).call(this);
|
|
|
@ -27,6 +27,9 @@ class NodeCurl
|
||||||
|
|
||||||
CURL * curl;
|
CURL * curl;
|
||||||
v8::Persistent<v8::Object> handle;
|
v8::Persistent<v8::Object> handle;
|
||||||
|
|
||||||
|
// keep the object alive when performing
|
||||||
|
v8::Persistent<v8::Object> refer;
|
||||||
bool in_curlm;
|
bool in_curlm;
|
||||||
std::vector<curl_slist*> slists;
|
std::vector<curl_slist*> slists;
|
||||||
std::map<int, std::string> strings;
|
std::map<int, std::string> strings;
|
||||||
|
@ -312,8 +315,6 @@ class NodeCurl
|
||||||
if (msg->msg == CURLMSG_DONE)
|
if (msg->msg == CURLMSG_DONE)
|
||||||
{
|
{
|
||||||
NodeCurl * curl = curls[msg->easy_handle];
|
NodeCurl * curl = curls[msg->easy_handle];
|
||||||
// copy CURLMsg
|
|
||||||
// on_error may delete the whole NodeCurl
|
|
||||||
CURLMsg msg_copy = *msg;
|
CURLMsg msg_copy = *msg;
|
||||||
code = curl_multi_remove_handle(curlm, msg->easy_handle);
|
code = curl_multi_remove_handle(curlm, msg->easy_handle);
|
||||||
curl->in_curlm = false;
|
curl->in_curlm = false;
|
||||||
|
@ -322,12 +323,13 @@ class NodeCurl
|
||||||
return raise("curl_multi_remove_handle failed", curl_multi_strerror(code));
|
return raise("curl_multi_remove_handle failed", curl_multi_strerror(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure curl still exists,
|
|
||||||
// gc will delete the curl if there is no reference.
|
|
||||||
if (msg_copy.data.result == CURLE_OK)
|
if (msg_copy.data.result == CURLE_OK)
|
||||||
curl->on_end(&msg_copy);
|
curl->on_end(&msg_copy);
|
||||||
else
|
else
|
||||||
curl->on_error(&msg_copy);
|
curl->on_error(&msg_copy);
|
||||||
|
|
||||||
|
curl->refer.Dispose();
|
||||||
|
curl->refer.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -338,6 +340,12 @@ class NodeCurl
|
||||||
static v8::Handle<v8::Value> perform(const v8::Arguments & args)
|
static v8::Handle<v8::Value> perform(const v8::Arguments & args)
|
||||||
{
|
{
|
||||||
NodeCurl *curl = unwrap(args.This());
|
NodeCurl *curl = unwrap(args.This());
|
||||||
|
|
||||||
|
if (!curl->refer.IsEmpty())
|
||||||
|
return raise("The curl session is running, use curl.create() to create another session.");
|
||||||
|
|
||||||
|
curl->refer = v8::Persistent<v8::Object>::New(args.This());
|
||||||
|
|
||||||
CURLMcode code = curl_multi_add_handle(curlm, curl->curl);
|
CURLMcode code = curl_multi_add_handle(curlm, curl->curl);
|
||||||
if (code != CURLM_OK)
|
if (code != CURLM_OK)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue