Elixir - https URL 的问题

2023-11-24

我是 Elixir 和 Erlang 的新手,在访问 https URL 时遇到一些问题。我已经尝试过 Elixir 特定的HTTP选项和 Erlang 的:inets module.

因此,从 iex 控制台(Interactive Elixir):

使用 HTTP 选项:

HTTPotion.start
HTTPotion.get("https://api.github.com")

与:inets:

:inets.start
:ssl.start
:httpc.request('https://api.github.com')

在这两种情况下,我都会得到一个巨大的堆栈跟踪,它本质上表明某个地方存在错误的匹配,并且状态机正在终止。访问 http URL 时我没有收到此消息。我缺少什么?谢谢。

编辑 - 这是来自 HTTPotion 的错误消息:

iex(40)> HTTPotion.get("https://api.github.com") 
** (Protocol.UndefinedError) protocol String.Chars not implemented for {:EXIT, {{{{:badmatch, ""}, [{:ssl_handshake, :dec_hello_extensions, 2, [file: 'ssl_handshake.erl', line: 1737]}, {:ssl_handshake, :decode_handshake, 3, [file: 'ssl_handshake.erl', line: 926]}, {:tls_handshake, :get_tls_handshake_aux, 3, [file: 'tls_handshake.erl', line: 155]}, {:tls_connection, :next_state, 4, [file: 'tls_connection.erl', line: 433]}, {:gen_fsm, :handle_msg, 7, [file: 'gen_fsm.erl', line: 503]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 237]}]}, {:gen_fsm, :sync_send_all_state_event, [#PID<0.227.0>, {:start, 5000}, :infinity]}}, {:gen_server, :call, [#PID<0.226.0>, {:send_req, {{:url, 'https://api.github.com', 'api.github.com', 443, :undefined, :undefined, '/', :https, :hostname}, [], :get, "", [], 5000}}, 5000]}}}
       (elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1
       (elixir) lib/string/chars.ex:17: String.Chars.to_string/1
    (httpotion) lib/httpotion.ex:157: HTTPotion.request/5
iex(40)> 
16:50:10.640 [error] ** State machine #PID<0.227.0> terminating 
** Last message in was {:tcp, #Port<0.7454>,
 <<22, 3, 3, 0, 93, 2, 0, 0, 89, 3, 3, 84, 40, 158, 178, 2, 216, 45, 226, 183, 79, 42, 199, 205, 19, 31, 63, 223, 138, 208, 132, 186, 28, 129, 123, 235, 1, 142, 90, 243, 25, 70, 210, 32, 199, 56, 251, 131, ...>>}
** When State == :hello
**      Data  == [data: [{'StateData',
   {:state, :client, {#Reference<0.0.0.1360>, #PID<0.226.0>}, :gen_tcp,
    :tls_connection, :tcp, :tcp_closed, :tcp_error, 'api.github.com', 443,
    #Port<0.7454>,
    {:ssl_options, :tls, [{3, 3}, {3, 2}, {3, 1}, {3, 0}], :verify_none,
     {#Function<7.50551058/3 in :ssl.handle_verify_options/2>, []},
     #Function<8.50551058/1 in :ssl.handle_verify_options/2>, false, false,
     :undefined, 1, "", '***', "", '***', '***', '***', "", '***', :undefined,
     :undefined, '***', '***',
     [<<192, 36>>, <<192, 40>>, <<192, 38>>, <<192, 42>>, <<0, 107>>,
      <<0, 106>>, <<0, 61>>, <<192, 35>>, <<192, 39>>, <<192, 37>>, <<192, 41>>, 
      <<0, 103>>, <<0, ...>>, <<...>>, ...],
     #Function<1.50551058/4 in :ssl.handle_options/1>, true, 268435456, false,
     :undefined, false, :undefined, :undefined, true, :undefined, false},
    {:socket_options, :binary, 0, 0, 0, false}, '***', '***', '***', 49168,
    '***', 61463, :ssl_session_cache, {3, 3}, false, :undefined,
    {:undefined, :undefined}, :undefined, :undefined, '***', '***', '***',
    :undefined, '***', '***', '***', 53269, #Reference<0.0.0.1363>, :undefined,
    '***', {false, :first}, {#PID<0.226.0>, #Reference<0.0.0.1361>},
    #Reference<0.0.0.1364>, {[], []}, false, true, false, false, :undefined,
    :undefined, :undefined}}]]
** Reason for termination = 
** {{:badmatch, ""},
 [{:ssl_handshake, :dec_hello_extensions, 2,
   [file: 'ssl_handshake.erl', line: 1737]},
  {:ssl_handshake, :decode_handshake, 3,
   [file: 'ssl_handshake.erl', line: 926]},
  {:tls_handshake, :get_tls_handshake_aux, 3,
   [file: 'tls_handshake.erl', line: 155]},
  {:tls_connection, :next_state, 4, [file: 'tls_connection.erl', line: 433]},
  {:gen_fsm, :handle_msg, 7, [file: 'gen_fsm.erl', line: 503]},
  {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 237]}]}


16:50:10.642 [error] GenServer #PID<0.226.0> terminating
Last message: {:send_req, {{:url, 'https://api.github.com', 'api.github.com', 443, :undefined, :undefined, '/', :https, :hostname}, [], :get, "", [], 5000}}
State: {:state, 'api.github.com', 443, :undefined, #Reference<0.0.0.1352>, false, :undefined, [], true, :undefined, false, [], {[], []}, :undefined, :idle, :undefined, "", 0, 0, [], :undefined, :undefined, :undefined, :undefined, false, :undefined, :undefined, "", :undefined, false, 188446, 0, :undefined}
** (exit) exited in: :gen_fsm.sync_send_all_state_event(#PID<0.227.0>, {:start, 5000}, :infinity)
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: ""
            (ssl) ssl_handshake.erl:1737: :ssl_handshake.dec_hello_extensions/2
            (ssl) ssl_handshake.erl:926: :ssl_handshake.decode_handshake/3
            (ssl) tls_handshake.erl:155: :tls_handshake.get_tls_handshake_aux/3
            (ssl) tls_connection.erl:433: :tls_connection.next_state/4
            (stdlib) gen_fsm.erl:503: :gen_fsm.handle_msg/7
            (stdlib) proc_lib.erl:237: :proc_lib.init_p_do_apply/3

nil
iex(41)> 

谜团已揭开。我将这个问题发布到 Elixir-lang 组,这是 Erlang OTP 17.3 中的一个已知错误。解决方案是应用补丁、等待下一个版本或降级到 OTP 17.1。

详细信息在这里:https://groups.google.com/forum/#!topic/elixir-lang-talk/xsAEzCfmRoQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elixir - https URL 的问题 的相关文章

  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内
  • 如何在 Erlang 中将数字转换为单词?

    我发现了一个关于将数字转换为 单词 的有趣问题 代码高尔夫 数字到单词 https stackoverflow com questions 309884 code golf number to words 我真的很想看看你如何在 Erlan
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • Elixir Jason 使用元组对结构进行编码

    我有一个已经有的结构 derive Jason Encoder但该结构中的某些字段是元组 因此无法对结构进行编码 我该如何解决这个问题 UPDATE 我使用了下面提到的方法来实现协议 关于这种方法需要注意的一件重要事情是 它将改变整个项目的
  • Elixir 用于列表、元组等的记录器

    我可以使用 Elixir 记录器来检查字符串 gt str string gt Logger info Here is a str info Here is a string 但是当我记录一个列表时 它看起来不太漂亮 gt list 1 2
  • 在 Erlang shell 中加载项目 Rebar 依赖项的简单方法

    我有一个使用 Rebar 作为构建工具的项目 开发时 我希望 Rebar config 中指定的所有应用程序依赖项都能尽可能轻松地编译并加载到 shell 中 我在 Emacs 中使用 Erlang shell 有什么快速方法可以做到这一点
  • Cowboy 中的 http 处理程序和 websocket 处理程序之间的通信

    我想在 Cowboy 中创建一个 websocket 应用程序 它从另一个 Cowboy 处理程序获取数据 假设我想结合牛仔的 Echo get 示例 https github com ninenines cowboy tree maste
  • 如何在erlang中读取mnesia数据库的所有记录?

    我是 erlang 新手 我需要对从 mnesia 数据库获取的所有记录进行一些操作 Result mnesia dirty read mydatabase key1 key2 case Result of gt DEBUG No such
  • 为什么 epmd 进程不退出?

    在我退出 erlang shell 后 epmd 进程仍然存在 这是一个错误还是一个功能 这是很正常的 EPMD 是一个主机守护进程 当人们打算使用分布式节点时 就需要它的存在 当仅在同一台机器上使用多个节点时 它也很有用
  • 如何在 Elixir 的 Ecto 查询中使用“case-when”?

    我有一个 SQL 查询 例如 SELECT SUM CASE WHEN
  • Erlang Supervisor 重新启动与已关闭主机的连接的策略

    我使用 erlang 作为服务之间的桥梁 我想知道人们对处理断开的连接有什么建议 我正在从本地文件获取输入并将它们通过管道传输到 AMQP 可以想象 AMQP 代理可能会崩溃 对于这种情况 我想继续重试连接到 AMQP 服务器 但我不想将
  • 在Erlang中,是否可以将正在运行的进程发送到不同的节点?

    我一直在研究移动代理 并且想知道是否可以将正在运行的进程发送到 erlang 中的另一个节点 我知道可以向另一个节点上的进程发送消息 我知道可以在集群中的所有节点上加载模块 是否可以将特定节点上可能处于某种状态的进程移动到另一个节点并恢复其
  • 使用 Erlang 进行 https post 的简单示例

    我发现引用了一些使用 erlang 与 ssl 通过 rpc 和 http get 等的示例 但是我很难找到通过 erlang 将数据发布到 ssl 端点的示例 有人知道我缺少的一个简单例子吗 我想我明白了 我的论点是错误的 这就是我最终得
  • Elixir 中的斜线符号是什么意思?

    在 Elixir 文档中 他们继续使用带有斜杠的奇怪符号 例如 is boolean 1 IO puts 1 String length 1 is function 2 2 我只是猜测 但我认为它指的是数量 但如果是这样的话 为什么文档中没
  • 如何在 Elixir 中展平嵌套列表?

    我有一个嵌套列表 1 2 3 4 5 6 我怎样才能把它压平 使它变成 1 2 3 4 5 6 无需重新发明轮子 只需使用List flatten 1 https hexdocs pm elixir List html flatten 1
  • 如何在 gen_servers 中进行选择性接收?

    我将大部分应用程序移植到 OTP 行为 但我陷入困境 我不知道如何使用 gen server 进行选择性接收 如果没有任何回调函数子句与消息匹配 则不会将消息放回邮箱 而是会出错 现在 无论我走到哪里 人们都称赞选择性接收 无论我走到哪里
  • Erlang 中的静态类型检查

    我慢慢地爱上了 Erlang 但只有一个很大很大的问题 我非常喜欢 Standard ML 和 ocaml 等语言 它们具有强大的静态类型检查功能 有没有一种好的 干净的方法来在 erlang 中引入某种静态类型检查 我正在看 type a
  • Elixir assert_raise 无法捕获异常

    我写了这个测试用例 assert raise ArgumentError myFn a b 但它并没有按照我期望的方式进行评估 myFn引发一个 ArgumentError do raise ArgumentError 但它没有被捕获ass
  • 如何使用 erlang-examples

    我刚刚使用下载了 Erlangapt get onto 乌班图10 10 我如何运行Erlang附带的示例 您可以通过apt get install erlang examples 我尝试进入它们存储的目录并编译ball erl 但我得到了
  • 我应该在 Erlang 中使用 try catch 还是应该传回错误标记?

    我正在用 Erlang 进行编码 但我有点不确定如何处理错误 尤其是在看到 Erlang 总是返回的丑陋错误之后 我应该在 Erlang 中使用 try catch 还是应该传回错误标记 在顺序 Erlang 中执行异常处理的基本方法有以下

随机推荐

  • 如何使用 gson 创建按键排序的 json?

    我需要创建常量 json 字符串或按键排序的 json 常量 json 字符串是什么意思 请查看我创建的以下代码示例 我的代码1 public class GsonTest class DataObject private int data
  • 有没有更 Pythonic 的方法来防止向列表中添加重复项?

    是否有更Pythonic 或简洁 的方法来防止向列表添加重复项 if item not in item list item list append item 或者这实际上是一种廉价的操作 由于 hcwsha的原始解决方案已被替换 我将其记录
  • C# unity 通过属性拦截

    有没有办法在 C unity 中使用属性拦截并将对象注册代码保留在 XML 文件 如 app config 中 如果是的话 您能给我提供代码吗 这样的注册应该是什么样子 我做了很多解决方法 但没有找到解决此问题的有效解决方案 我假设您的意思
  • Firefox 内容脚本未在某些页面加载

    Context 我目前正在开发一个浏览器扩展 它可以在 Chrome 和 Opera 上按预期工作 但在 Firefox 上遇到问题 这是一个最小版本manifest json重现问题所需 name Example version 0 0
  • 如何在 3D 空间中正确移动相机?

    我想做的事 我正在尝试弄清楚如何使相机像这样工作 鼠标移动 相机旋转 上 下键 摄像机前进 后退 向前表示相机面向的方向 左 右键 相机横向移动 Q E键 相机上下移动 由于我有很多代码 因此我将尽力解释我是如何做到的 而不需要太多代码 我
  • 如何使用 python 重试 Behave 中的失败场景

    有人可以告诉我如何使用 Python 在 Behave 中再次运行失败的测试吗 如果失败 我想自动重新运行失败的测试用例 行为库实际上有一个RerunFormatter这可以帮助您重新运行之前测试运行的失败场景 它会创建一个包含所有失败场景
  • Android NavigationView 带圆角

    我正在设计一个定制抽屉 on Android 它的顶部和底部必须有圆角 我首先自定义顶部 我发现问题是形状的背景不透明 I have source toile libre org I need to build source toile l
  • 为什么“插入”函数不使用 MySQLdb 添加行?

    我正在尝试弄清楚如何在 Python 中使用 MySQLdb 库 对于这两个库我充其量都是新手 我正在关注代码here 具体来说 cursor conn cursor cursor execute DROP TABLE IF EXISTS
  • 如何将因子转换为整数\数字而不丢失信息?

    当我将因子转换为数字或整数时 我得到的是基础级别代码 而不是数字形式的值 f lt factor sample runif 5 20 replace TRUE 1 0 0248644019011408 0 0248644019011408
  • Java方法对任意数量的整数求和

    我需要写一个java方法sumAll 它接受任意数量的整数并返回它们的总和 sumAll 1 2 3 returns 6 sumAll returns 0 sumAll 20 returns 20 我不知道该怎么做 如果您使用 Java8
  • 使用 array_multisort() 和动态数量的参数/参数/规则/数据对数组进行排序

    我正在尝试对任何数组进行排序array multisort 一切都很好 但是 根据脚本中的条件 我需要更改选项 到目前为止我所拥有的是这样的 array multisort sort1 SORT ASC sort2 SORT ASC sor
  • 如何在Python中的绘图中添加填充?

    我正在尝试在绘图的左侧和右侧添加填充 但是当我改变 xlim 和 ylim 时 图像变小 我究竟做错了什么 import matplotlib pyplot as plt plt rcParams text usetex False fro
  • 在JSF2中,如何知道复合组件是否有子组件?

    我正在编写一个复合组件 您有一个名为 的特殊标签
  • 获取 Android 蓝牙设备的重命名名称

    我的 Android 手机允许我重命名已配对的设备 方法是转至 设置 gt 无线和网络 gt 蓝牙 活动页面 然后单击已配对蓝牙设备右侧的设置按钮 但是 当我查询带有以下内容的绑定设备列表时蓝牙适配器 getBondedDevices 函数
  • 如何区分日志文件中的 log4j 会话和同一 Web 应用程序的副本?

    只有一个文件 它是在 Web 应用程序副本运行时同时写入的 如何从其他日志行中仅过滤一条会话日志消息 使用具有 NDC 或 MDC 信息的 servlet 过滤器是我见过的最好方法 两者的快速比较可以在http wiki apache or
  • IL 中的 ldsfld 和 ldstr 有什么区别?

    我读过一些关于 String Empty 与 的文章 我也自己做了测试 它们之间的区别如下 字符串 空 L 0001 ldsfld string mscorlib System String Empty L 0001 ldstr 在我与朋友
  • 如何删除python3中的b符号

    如何去除bpython3脚本中的符号 import subprocess get data subprocess check output df k awk print 6 shell True data arr get data spli
  • 如何在 JasperReports 中使用条件 TextField?

    我想要一对取决于值的文本字段 并且 y 值应根据空白空间进行调整 当值为 0 我想隐藏文本字段 IE 我想隐藏staticText和textField如果参数red等于 0 并将蓝色值向上移动 在下面的 jrxml 代码中
  • RVM 的 Rails 脚本分段错误

    我遇到分段错误 应该which ruby返回 usr local bin maletor rails generate mailer ContactMailer Users maletor rvm gems ruby 1 9 2 p0 ge
  • Elixir - https URL 的问题

    我是 Elixir 和 Erlang 的新手 在访问 https URL 时遇到一些问题 我已经尝试过 Elixir 特定的HTTP选项和 Erlang 的 inets module 因此 从 iex 控制台 Interactive Eli