diff --git a/fibjs/src/http/HttpClient.cpp b/fibjs/src/http/HttpClient.cpp index 5751bf3338..19f275f2bb 100644 --- a/fibjs/src/http/HttpClient.cpp +++ b/fibjs/src/http/HttpClient.cpp @@ -14,6 +14,7 @@ #include "ifs/net.h" #include "ifs/zlib.h" #include "ifs/json.h" +#include "ifs/msgpack.h" #include "ifs/querystring.h" #include @@ -764,7 +765,7 @@ result_t HttpClient::request(exlib::string method, exlib::string url, v8::Local opts, obj_ptr& retVal, AsyncEvent* ac) { static const char* s_keys[] = { - "query", "headers", "body", "json", "response_body", NULL + "query", "headers", "body", "json", "pack", "response_body", NULL }; if (ac->isSync()) { @@ -854,11 +855,22 @@ result_t HttpClient::request(exlib::string method, exlib::string url, } } else { v = opts->Get(isolate->NewString("json", 4)); - if (v.IsEmpty()) - return CALL_E_JAVASCRIPT; - if (!v->IsUndefined()) { + if (v.IsEmpty()) { + v = opts->Get(isolate->NewString("pack", 4)); + if (v.IsEmpty()) + return CALL_E_JAVASCRIPT; + obj_ptr buf; + stm = new MemoryStream(); + + hr = msgpack_base::encode(v, buf); + if (hr < 0) + return hr; + stm->cc_write(buf); + map->add("Content-Type", "application/msgpack"); + } else { + obj_ptr buf; stm = new MemoryStream(); exlib::string s; diff --git a/idl/zh-cn/HttpClient.idl b/idl/zh-cn/HttpClient.idl index 8016f6244c..7ee4802833 100644 --- a/idl/zh-cn/HttpClient.idl +++ b/idl/zh-cn/HttpClient.idl @@ -75,11 +75,12 @@ interface HttpClient : object "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {}, "response_body": SeekableStream // 指定接受 resposne 数据的流 } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param method 指定 http 请求方法:GET, POST 等 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @@ -94,10 +95,11 @@ interface HttpClient : object "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -111,10 +113,11 @@ interface HttpClient : object "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -128,10 +131,11 @@ interface HttpClient : object "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -145,10 +149,11 @@ interface HttpClient : object "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -162,10 +167,11 @@ interface HttpClient : object "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 diff --git a/idl/zh-cn/http.idl b/idl/zh-cn/http.idl index ca4ccd8d28..023692c160 100644 --- a/idl/zh-cn/http.idl +++ b/idl/zh-cn/http.idl @@ -97,11 +97,12 @@ module http "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {}, "response_body": SeekableStream //指定接受 resposne 数据的流 } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param method 指定 http 请求方法:GET, POST 等 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @@ -116,10 +117,11 @@ module http "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -133,10 +135,11 @@ module http "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -150,10 +153,11 @@ module http "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -167,10 +171,11 @@ module http "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 @@ -184,10 +189,11 @@ module http "query": {}, "body": SeekableStream | Buffer | String | {}, "json": {}, + "pack": {}, "headers": {} } ``` - 其中 body,json 不得同时出现。缺省为 {},不包含任何附加信息 + 其中 body,json,pack 不得同时出现。缺省为 {},不包含任何附加信息 @param url 指定 url,必须是包含主机的完整 url @param opts 指定附加信息 @return 返回服务器响应 diff --git a/test/http_test.js b/test/http_test.js index 84ae876776..f48d69cdb8 100644 --- a/test/http_test.js +++ b/test/http_test.js @@ -1640,6 +1640,9 @@ describe("http", () => { } else if (r.address == "/request_json:") { r.response.write(r.address); r.response.write(r.json().test_field); + } else if (r.address == "/request_pack:") { + r.response.write(r.address); + r.response.write(r.pack().test_field); } else if (r.address == "/host:") { r.response.write(r.address); r.response.write(r.firstHeader('host')); @@ -1730,6 +1733,15 @@ describe("http", () => { "/request_json:field"); }); + it("pack", () => { + assert.equal(http.request("GET", "http://127.0.0.1:" + (8882 + base_port) + "/request_pack:", { + pack: { + test_field: "field" + } + }).body.read().toString(), + "/request_pack:field"); + }); + it("header", () => { assert.equal(http.request("GET", "http://127.0.0.1:" + (8882 + base_port) + "/request:", { headers: {