diff --git a/api/python_cffi.slurp b/api/python_cffi.slurp index 6f2532a65..dbfe0162b 100644 --- a/api/python_cffi.slurp +++ b/api/python_cffi.slurp @@ -4539,6 +4539,14 @@ void void zhttp_request_reset_content (zhttp_request_t *self); +// Set the request username +void + zhttp_request_set_username (zhttp_request_t *self, const char *username); + +// Set the request password +void + zhttp_request_set_password (zhttp_request_t *self, const char *password); + // Match the path of the request. // Support wildcards with '%s' symbol inside the match string. // Matching wildcards until the next '/', '?' or '\0'. diff --git a/api/zhttp_request.api b/api/zhttp_request.api index a70c7eb84..9bc39eff1 100644 --- a/api/zhttp_request.api +++ b/api/zhttp_request.api @@ -112,6 +112,16 @@ Set the content to NULL + + Set the request username + + + + + Set the request password + + + Match the path of the request. Support wildcards with '%s' symbol inside the match string. diff --git a/bindings/jni/czmq-jni/src/main/c/org_zeromq_czmq_ZhttpRequest.c b/bindings/jni/czmq-jni/src/main/c/org_zeromq_czmq_ZhttpRequest.c index a3fec2834..8e5b522ed 100644 --- a/bindings/jni/czmq-jni/src/main/c/org_zeromq_czmq_ZhttpRequest.c +++ b/bindings/jni/czmq-jni/src/main/c/org_zeromq_czmq_ZhttpRequest.c @@ -132,6 +132,22 @@ Java_org_zeromq_czmq_ZhttpRequest__1_1resetContent (JNIEnv *env, jclass c, jlong zhttp_request_reset_content ((zhttp_request_t *) (intptr_t) self); } +JNIEXPORT void JNICALL +Java_org_zeromq_czmq_ZhttpRequest__1_1setUsername (JNIEnv *env, jclass c, jlong self, jstring username) +{ + char *username_ = (char *) (*env)->GetStringUTFChars (env, username, NULL); + zhttp_request_set_username ((zhttp_request_t *) (intptr_t) self, username_); + (*env)->ReleaseStringUTFChars (env, username, username_); +} + +JNIEXPORT void JNICALL +Java_org_zeromq_czmq_ZhttpRequest__1_1setPassword (JNIEnv *env, jclass c, jlong self, jstring password) +{ + char *password_ = (char *) (*env)->GetStringUTFChars (env, password, NULL); + zhttp_request_set_password ((zhttp_request_t *) (intptr_t) self, password_); + (*env)->ReleaseStringUTFChars (env, password, password_); +} + JNIEXPORT jboolean JNICALL Java_org_zeromq_czmq_ZhttpRequest__1_1match (JNIEnv *env, jclass c, jlong self, jstring method, jstring path) { diff --git a/bindings/jni/czmq-jni/src/main/java/org/zeromq/czmq/ZhttpRequest.java b/bindings/jni/czmq-jni/src/main/java/org/zeromq/czmq/ZhttpRequest.java index 930a5b4a3..82ab02801 100644 --- a/bindings/jni/czmq-jni/src/main/java/org/zeromq/czmq/ZhttpRequest.java +++ b/bindings/jni/czmq-jni/src/main/java/org/zeromq/czmq/ZhttpRequest.java @@ -154,6 +154,20 @@ public void resetContent () { __resetContent (self); } /* + Set the request username + */ + native static void __setUsername (long self, String username); + public void setUsername (String username) { + __setUsername (self, username); + } + /* + Set the request password + */ + native static void __setPassword (long self, String password); + public void setPassword (String password) { + __setPassword (self, password); + } + /* Match the path of the request. Support wildcards with '%s' symbol inside the match string. Matching wildcards until the next '/', '?' or '\0'. diff --git a/bindings/lua_ffi/czmq_ffi.lua b/bindings/lua_ffi/czmq_ffi.lua index 8025e3466..15fdc8ac0 100644 --- a/bindings/lua_ffi/czmq_ffi.lua +++ b/bindings/lua_ffi/czmq_ffi.lua @@ -4534,6 +4534,14 @@ void void zhttp_request_reset_content (zhttp_request_t *self); +// Set the request username +void + zhttp_request_set_username (zhttp_request_t *self, const char *username); + +// Set the request password +void + zhttp_request_set_password (zhttp_request_t *self, const char *password); + // Match the path of the request. // Support wildcards with '%s' symbol inside the match string. // Matching wildcards until the next '/', '?' or '\0'. diff --git a/bindings/nodejs/README.md b/bindings/nodejs/README.md index 2e2368e86..4e729d0be 100644 --- a/bindings/nodejs/README.md +++ b/bindings/nodejs/README.md @@ -4952,6 +4952,18 @@ nothing my_zhttp_request.resetContent () Set the content to NULL +``` +nothing my_zhttp_request.setUsername (String) +``` + +Set the request username + +``` +nothing my_zhttp_request.setPassword (String) +``` + +Set the request password + ``` boolean my_zhttp_request.match (String, String) ``` diff --git a/bindings/nodejs/binding.cc b/bindings/nodejs/binding.cc index eb9c426e7..24e025e1e 100644 --- a/bindings/nodejs/binding.cc +++ b/bindings/nodejs/binding.cc @@ -9249,6 +9249,8 @@ NAN_MODULE_INIT (ZhttpRequest::Init) { Nan::SetPrototypeMethod (tpl, "setContent", _set_content); Nan::SetPrototypeMethod (tpl, "setContentConst", _set_content_const); Nan::SetPrototypeMethod (tpl, "resetContent", _reset_content); + Nan::SetPrototypeMethod (tpl, "setUsername", _set_username); + Nan::SetPrototypeMethod (tpl, "setPassword", _set_password); Nan::SetPrototypeMethod (tpl, "match", _match); Nan::SetPrototypeMethod (tpl, "test", _test); @@ -9416,6 +9418,36 @@ NAN_METHOD (ZhttpRequest::_reset_content) { zhttp_request_reset_content (zhttp_request->self); } +NAN_METHOD (ZhttpRequest::_set_username) { + ZhttpRequest *zhttp_request = Nan::ObjectWrap::Unwrap (info.Holder ()); + char *username; + if (info [0]->IsUndefined ()) + return Nan::ThrowTypeError ("method requires a `username`"); + else + if (!info [0]->IsString ()) + return Nan::ThrowTypeError ("`username` must be a string"); + //else { // bjornw: remove brackets to keep scope + Nan::Utf8String username_utf8 (info [0].As()); + username = *username_utf8; + //} //bjornw end + zhttp_request_set_username (zhttp_request->self, (const char *)username); +} + +NAN_METHOD (ZhttpRequest::_set_password) { + ZhttpRequest *zhttp_request = Nan::ObjectWrap::Unwrap (info.Holder ()); + char *password; + if (info [0]->IsUndefined ()) + return Nan::ThrowTypeError ("method requires a `password`"); + else + if (!info [0]->IsString ()) + return Nan::ThrowTypeError ("`password` must be a string"); + //else { // bjornw: remove brackets to keep scope + Nan::Utf8String password_utf8 (info [0].As()); + password = *password_utf8; + //} //bjornw end + zhttp_request_set_password (zhttp_request->self, (const char *)password); +} + NAN_METHOD (ZhttpRequest::_match) { ZhttpRequest *zhttp_request = Nan::ObjectWrap::Unwrap (info.Holder ()); char *method; diff --git a/bindings/nodejs/binding.h b/bindings/nodejs/binding.h index 82aa43a73..45d739ac3 100644 --- a/bindings/nodejs/binding.h +++ b/bindings/nodejs/binding.h @@ -1076,6 +1076,8 @@ class ZhttpRequest: public Nan::ObjectWrap { static NAN_METHOD (_set_content); static NAN_METHOD (_set_content_const); static NAN_METHOD (_reset_content); + static NAN_METHOD (_set_username); + static NAN_METHOD (_set_password); static NAN_METHOD (_match); static NAN_METHOD (_test); }; diff --git a/bindings/python/czmq/_czmq_ctypes.py b/bindings/python/czmq/_czmq_ctypes.py index 3aea44304..4c768f3bb 100644 --- a/bindings/python/czmq/_czmq_ctypes.py +++ b/bindings/python/czmq/_czmq_ctypes.py @@ -9190,6 +9190,10 @@ def test(verbose): lib.zhttp_request_set_content_const.argtypes = [zhttp_request_p, c_char_p] lib.zhttp_request_reset_content.restype = None lib.zhttp_request_reset_content.argtypes = [zhttp_request_p] +lib.zhttp_request_set_username.restype = None +lib.zhttp_request_set_username.argtypes = [zhttp_request_p, c_char_p] +lib.zhttp_request_set_password.restype = None +lib.zhttp_request_set_password.argtypes = [zhttp_request_p, c_char_p] lib.zhttp_request_match.restype = c_bool lib.zhttp_request_match.argtypes = [zhttp_request_p, c_char_p, c_char_p] lib.zhttp_request_test.restype = None @@ -9346,6 +9350,18 @@ def reset_content(self): """ return lib.zhttp_request_reset_content(self._as_parameter_) + def set_username(self, username): + """ + Set the request username + """ + return lib.zhttp_request_set_username(self._as_parameter_, username) + + def set_password(self, password): + """ + Set the request password + """ + return lib.zhttp_request_set_password(self._as_parameter_, password) + def match(self, method, path, *args): """ Match the path of the request. diff --git a/bindings/python_cffi/czmq_cffi/ZhttpRequest.py b/bindings/python_cffi/czmq_cffi/ZhttpRequest.py index 978e09dad..c60662865 100644 --- a/bindings/python_cffi/czmq_cffi/ZhttpRequest.py +++ b/bindings/python_cffi/czmq_cffi/ZhttpRequest.py @@ -127,6 +127,18 @@ def reset_content(self): """ utils.lib.zhttp_request_reset_content(self._p) + def set_username(self, username): + """ + Set the request username + """ + utils.lib.zhttp_request_set_username(self._p, utils.to_bytes(username)) + + def set_password(self, password): + """ + Set the request password + """ + utils.lib.zhttp_request_set_password(self._p, utils.to_bytes(password)) + def match(self, method, path, *path_args): """ Match the path of the request. diff --git a/bindings/python_cffi/czmq_cffi/cdefs.py b/bindings/python_cffi/czmq_cffi/cdefs.py index a87b7e5e0..71d96ef90 100644 --- a/bindings/python_cffi/czmq_cffi/cdefs.py +++ b/bindings/python_cffi/czmq_cffi/cdefs.py @@ -4541,6 +4541,14 @@ void zhttp_request_reset_content (zhttp_request_t *self); +// Set the request username +void + zhttp_request_set_username (zhttp_request_t *self, const char *username); + +// Set the request password +void + zhttp_request_set_password (zhttp_request_t *self, const char *password); + // Match the path of the request. // Support wildcards with '%s' symbol inside the match string. // Matching wildcards until the next '/', '?' or '\0'. diff --git a/bindings/qml/src/QmlZhttpRequest.cpp b/bindings/qml/src/QmlZhttpRequest.cpp index ad9fa3027..fb9ab3ec9 100644 --- a/bindings/qml/src/QmlZhttpRequest.cpp +++ b/bindings/qml/src/QmlZhttpRequest.cpp @@ -114,6 +114,18 @@ void QmlZhttpRequest::resetContent () { zhttp_request_reset_content (self); }; +/// +// Set the request username +void QmlZhttpRequest::setUsername (const QString &username) { + zhttp_request_set_username (self, username.toUtf8().data()); +}; + +/// +// Set the request password +void QmlZhttpRequest::setPassword (const QString &password) { + zhttp_request_set_password (self, password.toUtf8().data()); +}; + /// // Match the path of the request. // Support wildcards with '%s' symbol inside the match string. diff --git a/bindings/qml/src/QmlZhttpRequest.h b/bindings/qml/src/QmlZhttpRequest.h index 01eba1808..cdb9c8eb4 100644 --- a/bindings/qml/src/QmlZhttpRequest.h +++ b/bindings/qml/src/QmlZhttpRequest.h @@ -84,6 +84,12 @@ public slots: // Set the content to NULL void resetContent (); + // Set the request username + void setUsername (const QString &username); + + // Set the request password + void setPassword (const QString &password); + // Match the path of the request. // Support wildcards with '%s' symbol inside the match string. // Matching wildcards until the next '/', '?' or '\0'. diff --git a/bindings/qt/src/qzhttprequest.cpp b/bindings/qt/src/qzhttprequest.cpp index 50f0b2cdd..9610d24cc 100644 --- a/bindings/qt/src/qzhttprequest.cpp +++ b/bindings/qt/src/qzhttprequest.cpp @@ -152,6 +152,22 @@ void QZhttpRequest::resetContent () } +/// +// Set the request username +void QZhttpRequest::setUsername (const QString &username) +{ + zhttp_request_set_username (self, username.toUtf8().data()); + +} + +/// +// Set the request password +void QZhttpRequest::setPassword (const QString &password) +{ + zhttp_request_set_password (self, password.toUtf8().data()); + +} + /// // Self test of this class. void QZhttpRequest::test (bool verbose) diff --git a/bindings/qt/src/qzhttprequest.h b/bindings/qt/src/qzhttprequest.h index 2d5a58541..bc06536f1 100644 --- a/bindings/qt/src/qzhttprequest.h +++ b/bindings/qt/src/qzhttprequest.h @@ -74,6 +74,12 @@ class QT_CZMQ_EXPORT QZhttpRequest : public QObject // Set the content to NULL void resetContent (); + // Set the request username + void setUsername (const QString &username); + + // Set the request password + void setPassword (const QString &password); + // Self test of this class. static void test (bool verbose); diff --git a/bindings/ruby/lib/czmq/ffi.rb b/bindings/ruby/lib/czmq/ffi.rb index 54d927ef1..f1e1e8492 100644 --- a/bindings/ruby/lib/czmq/ffi.rb +++ b/bindings/ruby/lib/czmq/ffi.rb @@ -962,6 +962,8 @@ def self.attach_function(name, *rest) attach_function :zhttp_request_set_content, [:pointer, :pointer], :void, **opts attach_function :zhttp_request_set_content_const, [:pointer, :string], :void, **opts attach_function :zhttp_request_reset_content, [:pointer], :void, **opts + attach_function :zhttp_request_set_username, [:pointer, :string], :void, **opts + attach_function :zhttp_request_set_password, [:pointer, :string], :void, **opts attach_function :zhttp_request_match, [:pointer, :string, :string, :varargs], :bool, **opts attach_function :zhttp_request_test, [:bool], :void, **opts diff --git a/bindings/ruby/lib/czmq/ffi/zhttp_request.rb b/bindings/ruby/lib/czmq/ffi/zhttp_request.rb index 622a2aade..8e3b71766 100644 --- a/bindings/ruby/lib/czmq/ffi/zhttp_request.rb +++ b/bindings/ruby/lib/czmq/ffi/zhttp_request.rb @@ -269,6 +269,28 @@ def reset_content() result end + # Set the request username + # + # @param username [String, #to_s, nil] + # @return [void] + def set_username(username) + raise DestroyedError unless @ptr + self_p = @ptr + result = ::CZMQ::FFI.zhttp_request_set_username(self_p, username) + result + end + + # Set the request password + # + # @param password [String, #to_s, nil] + # @return [void] + def set_password(password) + raise DestroyedError unless @ptr + self_p = @ptr + result = ::CZMQ::FFI.zhttp_request_set_password(self_p, password) + result + end + # Match the path of the request. # Support wildcards with '%s' symbol inside the match string. # Matching wildcards until the next '/', '?' or '\0'. diff --git a/include/zhttp_request.h b/include/zhttp_request.h index e76803677..8affd216a 100644 --- a/include/zhttp_request.h +++ b/include/zhttp_request.h @@ -124,6 +124,16 @@ CZMQ_EXPORT void CZMQ_EXPORT void zhttp_request_reset_content (zhttp_request_t *self); +// *** Draft method, for development use, may change without warning *** +// Set the request username +CZMQ_EXPORT void + zhttp_request_set_username (zhttp_request_t *self, const char *username); + +// *** Draft method, for development use, may change without warning *** +// Set the request password +CZMQ_EXPORT void + zhttp_request_set_password (zhttp_request_t *self, const char *password); + // *** Draft method, for development use, may change without warning *** // Match the path of the request. // Support wildcards with '%s' symbol inside the match string. diff --git a/src/zhttp_client.c b/src/zhttp_client.c index 0164e8989..add0553f1 100644 --- a/src/zhttp_client.c +++ b/src/zhttp_client.c @@ -183,10 +183,12 @@ static void zhttp_client_actor (zsock_t *pipe, void *args) { char *url; zhash_t *headers; byte free_content; - char* content; + char *content; + char *username; + char *password; - int rc = zsock_brecv (pipe, "4ppSp1p", &timeout, &arg, &arg2, - &url, &headers, &free_content, &content); + int rc = zsock_brecv (pipe, "4ppSp1pss", &timeout, &arg, &arg2, + &url, &headers, &free_content, &content, &username, &password); assert (rc == 0); struct curl_slist *curl_headers = zhash_to_slist (headers); @@ -216,6 +218,12 @@ static void zhttp_client_actor (zsock_t *pipe, void *args) { curl_easy_setopt (curl, CURLOPT_HEADERDATA, request); curl_easy_setopt (curl, CURLOPT_PRIVATE, request); + if (*username) + curl_easy_setopt (curl, CURLOPT_USERNAME, username); + + if (*password) + curl_easy_setopt (curl, CURLOPT_PASSWORD, password); + if (streq (command, "POST") || streq (command, "PUT") || streq (command, "PATCH")) { curl_easy_setopt (curl, CURLOPT_POSTFIELDS, content); diff --git a/src/zhttp_request.c b/src/zhttp_request.c index e511c674b..2cac96319 100644 --- a/src/zhttp_request.c +++ b/src/zhttp_request.c @@ -26,8 +26,10 @@ struct _zhttp_request_t { char *url; char method[256]; zhash_t *headers; - char* content; + char *content; bool free_content; + char *username; + char *password; }; @@ -46,6 +48,8 @@ zhttp_request_new (void) strcpy (self->method, "GET"); self->content = NULL; self->free_content = false; + self->username = NULL; + self->password = NULL; return self; } @@ -70,6 +74,9 @@ zhttp_request_destroy (zhttp_request_t **self_p) self->content = NULL; self->free_content = false; + zstr_free (&self->username); + zstr_free (&self->password); + // Free object itself free (self); *self_p = NULL; @@ -118,8 +125,9 @@ zhttp_request_send (zhttp_request_t *self, zhttp_client_t *client, int timeout, if (rc == -1) return -1; - zsock_bsend (client, "4ppSp1p", timeout, arg, arg2, self->url, - self->headers, self->free_content ? (byte)1 : (byte)0, self->content); + zsock_bsend (client, "4ppSp1pss", timeout, arg, arg2, self->url, + self->headers, self->free_content ? (byte)1 : (byte)0, self->content, + self->username, self->password); self->headers = zhash_new (); zhash_autofree (self->headers); @@ -256,6 +264,23 @@ zhttp_request_reset_content (zhttp_request_t *self) { self->content = NULL; } + +void +zhttp_request_set_username (zhttp_request_t *self, const char *username) { + assert (self); + zstr_free (&self->username); + self->username = strdup (username); +} + + +void +zhttp_request_set_password (zhttp_request_t *self, const char *password) { + assert (self); + zstr_free (&self->password); + self->password = strdup (password); +} + + bool zhttp_request_match (zhttp_request_t *self, const char *method, const char *match, ...) { if (strneq (method, self->method)) @@ -387,4 +412,4 @@ zhttp_request_test (bool verbose) { zhttp_request_destroy (&request); printf ("OK\n"); -} \ No newline at end of file +}