diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-23 15:31:22 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-23 15:31:22 +0000 |
commit | a41005eb6a99376ea940888bcf97140643d18f61 (patch) | |
tree | c4821286d632e7de063731fc8cd9affd337c2b33 | |
parent | d6aa4916b8af01df29b7373b5064f23a6105c258 (diff) |
init.c: encode socket error message
* ext/socket/init.c (rsock_raise_socket_error): on Windows, encode
error messages from wide characters to the default encodings.
[ruby-core:84972] [Bug #14384]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62017 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ext/socket/init.c | 12 | ||||
-rw-r--r-- | test/socket/test_addrinfo.rb | 8 |
2 files changed, 20 insertions, 0 deletions
diff --git a/ext/socket/init.c b/ext/socket/init.c index 189977dcba..3b22c1308b 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -10,6 +10,10 @@ #include "rubysocket.h" +#ifdef _WIN32 +VALUE rb_w32_conv_from_wchar(const WCHAR *wstr, rb_encoding *enc); +#endif + VALUE rb_cBasicSocket; VALUE rb_cIPSocket; VALUE rb_cTCPSocket; @@ -39,7 +43,15 @@ rsock_raise_socket_error(const char *reason, int error) if (error == EAI_SYSTEM && (e = errno) != 0) rb_syserr_fail(e, reason); #endif +#ifdef _WIN32 + rb_encoding *enc = rb_default_internal_encoding(); + VALUE msg = rb_sprintf("%s: ", reason); + if (!enc) enc = rb_default_internal_encoding(); + rb_str_concat(msg, rb_w32_conv_from_wchar(gai_strerrorW(error), enc)); + rb_exc_raise(rb_exc_new_str(rb_eSocket, msg)); +#else rb_raise(rb_eSocket, "%s: %s", reason, gai_strerror(error)); +#endif } #ifdef _WIN32 diff --git a/test/socket/test_addrinfo.rb b/test/socket/test_addrinfo.rb index 132d172380..a06f3eb451 100644 --- a/test/socket/test_addrinfo.rb +++ b/test/socket/test_addrinfo.rb @@ -102,6 +102,14 @@ class TestSocketAddrinfo < Test::Unit::TestCase assert(!ipv4_ai.unix?) end + def test_error_message + e = assert_raise_with_message(SocketError, /getaddrinfo:/) do + Addrinfo.ip("...") + end + m = e.message + assert_not_equal([false, Encoding::ASCII_8BIT], [m.ascii_only?, m.encoding], proc {m.inspect}) + end + def test_ipv4_address_predicates list = [ [:ipv4_private?, "10.0.0.0", "10.255.255.255", |