Skip to content

Commit ad09c43

Browse files
committed
Support auth
1 parent 34dfaeb commit ad09c43

3 files changed

Lines changed: 64 additions & 40 deletions

File tree

src/pool.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use mrubyedge::{
1313
};
1414

1515
use crate::redis::{make_redis_object, RedisConn, RedisData};
16+
use crate::value::parse_redis_conn_params;
1617

1718
// ---------------------------------------------------------------------------
1819
// Internal data types
@@ -78,25 +79,12 @@ fn make_pool_object(vm: &mut VM, pool: r2d2::Pool<redis::Client>) -> Rc<RObject>
7879
// RedisConnectionPool class methods
7980
// ---------------------------------------------------------------------------
8081

81-
/// RedisConnectionPool.new(size: 5, timeout: 5, host: "127.0.0.1", port: 6379, tls: false)
82+
/// RedisConnectionPool.new(size: 5, timeout: 5, host: "127.0.0.1", port: 6379, tls: false, username: nil, password: nil)
8283
fn mrb_pool_new(vm: &mut VM, _args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error> {
83-
let mut host = "127.0.0.1".to_string();
84-
let mut port: u16 = 6379;
85-
let mut tls = false;
8684
let mut size: u32 = 5;
8785
let mut timeout: u64 = 5;
8886

8987
if let Some(kwargs) = vm.get_kwargs() {
90-
if let Some(h) = kwargs.get("host") {
91-
host = h.as_ref().try_into()?;
92-
}
93-
if let Some(p) = kwargs.get("port") {
94-
let p_val: i64 = p.as_ref().try_into()?;
95-
port = p_val as u16;
96-
}
97-
if let Some(t) = kwargs.get("tls") {
98-
tls = t.is_truthy();
99-
}
10088
if let Some(s) = kwargs.get("size") {
10189
let s_val: i64 = s.as_ref().try_into()?;
10290
size = s_val as u32;
@@ -107,9 +95,8 @@ fn mrb_pool_new(vm: &mut VM, _args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error
10795
}
10896
}
10997

110-
let scheme = if tls { "rediss" } else { "redis" };
111-
let url = format!("{}://{}:{}", scheme, host, port);
112-
let client = redis::Client::open(url.as_str())
98+
let params = parse_redis_conn_params(vm);
99+
let client = redis::Client::open(params.url.as_str())
113100
.map_err(|e| Error::RuntimeError(format!("Redis connection error: {}", e)))?;
114101
let pool = r2d2::Pool::builder()
115102
.max_size(size)

src/redis.rs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use mrubyedge::{
1111
},
1212
};
1313

14-
use crate::value::{redis_value_to_robject, robject_to_redis_arg};
14+
use crate::value::{parse_redis_conn_params, redis_value_to_robject, robject_to_redis_arg};
1515

1616
// ---------------------------------------------------------------------------
1717
// Internal data types
@@ -95,28 +95,10 @@ pub(crate) fn make_redis_object(vm: &mut VM, conn: RedisConn) -> Rc<RObject> {
9595
// Redis class methods
9696
// ---------------------------------------------------------------------------
9797

98-
/// Redis.new(host: "127.0.0.1", port: 6379, tls: false)
98+
/// Redis.new(host: "127.0.0.1", port: 6379, tls: false, username: nil, password: nil)
9999
fn mrb_redis_new(vm: &mut VM, _args: &[Rc<RObject>]) -> Result<Rc<RObject>, Error> {
100-
let mut host = "127.0.0.1".to_string();
101-
let mut port: u16 = 6379;
102-
let mut tls = false;
103-
104-
if let Some(kwargs) = vm.get_kwargs() {
105-
if let Some(h) = kwargs.get("host") {
106-
host = h.as_ref().try_into()?;
107-
}
108-
if let Some(p) = kwargs.get("port") {
109-
let p_val: i64 = p.as_ref().try_into()?;
110-
port = p_val as u16;
111-
}
112-
if let Some(t) = kwargs.get("tls") {
113-
tls = t.is_truthy();
114-
}
115-
}
116-
117-
let scheme = if tls { "rediss" } else { "redis" };
118-
let url = format!("{}://{}:{}", scheme, host, port);
119-
let client = redis::Client::open(url.as_str())
100+
let params = parse_redis_conn_params(vm);
101+
let client = redis::Client::open(params.url.as_str())
120102
.map_err(|e| Error::RuntimeError(format!("Redis connection error: {}", e)))?;
121103
let conn = client
122104
.get_connection()

src/value.rs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,64 @@ use std::rc::Rc;
22

33
use mrubyedge::{
44
Error,
5-
yamrb::value::{RObject, RValue},
5+
yamrb::{value::{RObject, RValue}, vm::VM},
66
};
77

8+
/// Common connection parameters extracted from kwargs.
9+
pub(crate) struct RedisConnParams {
10+
pub url: String,
11+
}
12+
13+
/// Extract common Redis connection kwargs (host, port, tls, username, password)
14+
/// and build a Redis URL.
15+
pub(crate) fn parse_redis_conn_params(vm: &mut VM) -> RedisConnParams {
16+
let mut host = "127.0.0.1".to_string();
17+
let mut port: u16 = 6379;
18+
let mut tls = false;
19+
let mut username: Option<String> = None;
20+
let mut password: Option<String> = None;
21+
22+
if let Some(kwargs) = vm.get_kwargs() {
23+
if let Some(h) = kwargs.get("host") {
24+
if let Ok(v) = h.as_ref().try_into() {
25+
host = v;
26+
}
27+
}
28+
if let Some(p) = kwargs.get("port") {
29+
if let Ok(v) = <&RObject as TryInto<i64>>::try_into(p.as_ref()) {
30+
port = v as u16;
31+
}
32+
}
33+
if let Some(t) = kwargs.get("tls") {
34+
tls = t.is_truthy();
35+
}
36+
if let Some(u) = kwargs.get("username") {
37+
if !u.is_nil() {
38+
if let Ok(v) = u.as_ref().try_into() {
39+
username = Some(v);
40+
}
41+
}
42+
}
43+
if let Some(p) = kwargs.get("password") {
44+
if !p.is_nil() {
45+
if let Ok(v) = p.as_ref().try_into() {
46+
password = Some(v);
47+
}
48+
}
49+
}
50+
}
51+
52+
let scheme = if tls { "rediss" } else { "redis" };
53+
let auth = match (username, password) {
54+
(Some(u), Some(p)) => format!("{}:{}@", u, p),
55+
(None, Some(p)) => format!(":{}@", p),
56+
_ => String::new(),
57+
};
58+
let url = format!("{}://{}{}:{}", scheme, auth, host, port);
59+
60+
RedisConnParams { url }
61+
}
62+
863
pub(crate) fn redis_value_to_robject(val: redis::Value) -> Rc<RObject> {
964
match val {
1065
redis::Value::Nil => RObject::nil().to_refcount_assigned(),

0 commit comments

Comments
 (0)