hiredis-client 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f18d435747c2eee26d1df005dc5f2dfe4941cec30a74baf90dd56d54a410c216
4
- data.tar.gz: d38390db3e0a413525bfced8e86761e633cf5af0a7e7e8d28a90ed79e3930fac
3
+ metadata.gz: 8ab993c8bd2fc54e8817b047d657409ee3cf3ab8256884c052358cf4178d2835
4
+ data.tar.gz: 49298a0eedee98b454ece01d08de52d68291383ceccc5146f129cab4f2d87095
5
5
  SHA512:
6
- metadata.gz: 1810b9bc04e01d77af516a659ac1dd565607b3473e19b3f88522b71609f5559fc0427d33e764fa4f147211c7e6e7440e2c8cc4e671d8bd6419d504398220709f
7
- data.tar.gz: 96da9a05db116378d827bfbbedf11ff4e9cb634245fc5423c235f407934a95b54671e2cf90511fb528ef3af04d99d07c842add3deb8316a2bab3af3a66ed7fa1
6
+ metadata.gz: 1994b4d87d9b0ca699f4ab9a1b35d7f58834e1186ce8df4dbb57958b4a3a4e7db5379efa9e27c62ab01245c8d354babdd9a173234eaebfbb6e2187b8910ad419
7
+ data.tar.gz: 8bdfe9124ab8b8b491bd90b5effef54465bcf512c18fefe84c8af83dad396306d5cbd88e02ce84fd9db6835766bdbbcb055a2b3cc52a33cf149decbd802736f6
@@ -311,14 +311,28 @@ static VALUE hiredis_alloc(VALUE klass) {
311
311
  return TypedData_Make_Struct(klass, hiredis_connection_t, &hiredis_connection_data_type, connection);
312
312
  }
313
313
 
314
+ void redis_set_io_error(redisContext *context, int err) {
315
+ if (err) {
316
+ errno = err;
317
+ }
318
+ context->err = REDIS_ERR_IO;
319
+ (void)!strerror_r(errno, context->errstr, sizeof(context->errstr));
320
+ }
321
+
314
322
  static inline void redis_raise_error_and_disconnect(redisContext *context, VALUE timeout_error) {
315
323
  if (!context) return;
316
324
 
317
325
  int err = context->err;
318
326
  char errstr[128];
319
- MEMCPY(context->errstr, errstr, char, 128);
327
+ if (context->err) {
328
+ strncpy(errstr, context->errstr, 128);
329
+ }
320
330
  redisFree(context);
321
331
 
332
+ if (!err) {
333
+ rb_raise(timeout_error, "Unknown Error");
334
+ }
335
+
322
336
  // OpenSSL bug: The SSL_ERROR_SYSCALL with errno value of 0 indicates unexpected EOF from the peer.
323
337
  if (errno == EAGAIN || (err == REDIS_ERR_IO && errno == 0)) {
324
338
  errno = 0;
@@ -431,26 +445,28 @@ static VALUE hiredis_connect_finish(hiredis_connection_t *connection, redisConte
431
445
 
432
446
  int writable = 0;
433
447
  int optval = 0;
448
+ errno = 0;
434
449
  socklen_t optlen = sizeof(optval);
435
450
 
436
451
  /* Wait for socket to become writable */
437
452
  if (hiredis_wait_writable(context->fd, &connection->connect_timeout, &writable) < 0) {
453
+ redis_set_io_error(context, ETIMEDOUT);
438
454
  redis_raise_error_and_disconnect(context, rb_eRedisClientCannotConnectError);
439
455
  }
440
456
 
441
457
  if (!writable) {
442
- errno = ETIMEDOUT;
458
+ redis_set_io_error(context, ETIMEDOUT);
443
459
  redis_raise_error_and_disconnect(context, rb_eRedisClientCannotConnectError);
444
460
  }
445
461
 
446
462
  /* Check for socket error */
447
463
  if (getsockopt(context->fd, SOL_SOCKET, SO_ERROR, &optval, &optlen) < 0) {
448
- context->err = REDIS_ERR_IO;
464
+ redis_set_io_error(context, 0);
449
465
  redis_raise_error_and_disconnect(context, rb_eRedisClientCannotConnectError);
450
466
  }
451
467
 
452
468
  if (optval) {
453
- errno = optval;
469
+ redis_set_io_error(context, optval);
454
470
  redis_raise_error_and_disconnect(context, rb_eRedisClientCannotConnectError);
455
471
  }
456
472
 
@@ -935,8 +935,9 @@ int redisBufferRead(redisContext *c) {
935
935
  int nread;
936
936
 
937
937
  /* Return early when the context has seen an error. */
938
- if (c->err)
938
+ if (c->err) {
939
939
  return REDIS_ERR;
940
+ }
940
941
 
941
942
  nread = c->funcs->read(c, buf, sizeof(buf));
942
943
  if (nread > 0) {
@@ -41,7 +41,12 @@ class RedisClient
41
41
  raise CannotConnectError, error.message, error.backtrace
42
42
  end
43
43
  else
44
- connect_tcp(config.host, config.port)
44
+ begin
45
+ connect_tcp(config.host, config.port)
46
+ rescue SystemCallError => error
47
+ error_code = error.class.name.split("::").last
48
+ raise CannotConnectError, "Failed to connect to #{config.host}:#{config.port} (#{error_code})"
49
+ end
45
50
  end
46
51
 
47
52
  if config.ssl
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hiredis-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-16 00:00:00.000000000 Z
11
+ date: 2022-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.8.1
19
+ version: 0.10.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.8.1
26
+ version: 0.10.0
27
27
  description:
28
28
  email:
29
29
  - jean.boussier@gmail.com