Erlang 是否可以在运行时添加YAWS-appmods配置?

Erlang 是否可以在运行时添加YAWS-appmods配置?,erlang,yaws,Erlang,Yaws,我在生产环境中将YAWS嵌入到我的应用程序中,并使用函数YAWS:start\u embedded/4启动YAWS 下面是我的代码: Id = "my_server", GconfList = [{logdir, "./log"}, {id, Id}], SconfList = [{docroot, Docroot}, {port, Port}, {listen, Listen}, {appmods, [ {"/rest", mod_rest, []},

我在生产环境中将YAWS嵌入到我的应用程序中,并使用函数
YAWS:start\u embedded/4
启动YAWS

下面是我的代码:

Id = "my_server",
GconfList = [{logdir, "./log"}, {id, Id}],  
SconfList = [{docroot, Docroot},
  {port, Port},
  {listen, Listen},
  {appmods, [      
    {"/rest", mod_rest, []},
    {"/file", mod_file, []}      
  ]}
],
yaws:start_embedded(Docroot, SconfList, GconfList, Id).
我想添加另一个appmod,例如:
{/upload”,mod_upload,[]}


是否可以在运行时添加appmods而不重新启动YAWS?

您可以在运行时添加appmods,方法是首先检索当前配置,使用它创建包含新appmods的新配置,然后设置新配置

  • 调用
    yaws\u api:getconf/0
    获得一个三元组
    {ok,GlobalConf,ServerConfs}
    ,其中
    GlobalConf
    是全局yaws配置,
    ServerConfs
    是yaws服务器配置列表。全局配置是名为
    gconf
    的记录类型,服务器配置是名为
    sconf
    的记录类型;这两种记录类型都在
    yaws.hrl
    头文件中定义
  • 通过服务器配置查找包含要更改的AppMod的配置。这有点棘手,因为您要处理一个列表列表,并且需要保持整个数据结构的形状不变
  • 找到
    sconf
    后,通过将新的appmod添加到当前的appmod列表中,从中创建一个新的
    sconf
    实例。appmod列表的每个元素都是一个元组,由appmod的URL路径和appmod模块的名称组成。appmod元组还可以可选地包含第三个字段,该字段由要排除的第一条路径下的路径列表组成;有关详细信息,请参阅中的
    排除路径的说明
  • 用新值替换
    serverconf
    中现有的
    sconf
  • 调用
    yaws\u api:setconf/2
    设置新配置,将现有的
    GlobalConf
    作为第一个参数传递,将包含新的
    sconf
    的新的
    ServerConfs
    作为第二个参数传递
  • 下面的
    am_extend
    模块显示了如何执行此操作。它导出一个
    add/1
    函数,该函数可以识别和增强您所关心的特定服务器中的appmod

    -module(am_extend).
    -export([add/1]).
    
    add(AppmodAdder) ->
        {ok, GlobalConf, ServerConfs} = yaws_api:getconf(),
        NewServerConfs = add_appmod(ServerConfs, AppmodAdder),
        yaws_api:setconf(GlobalConf, NewServerConfs).
    
    add_appmod(ServerConfs, AppmodAdder) ->
        lists:foldl(fun(Val, Acc) ->
                            Acc ++ [AppmodAdder(A) || A <- Val]
                    end, [], ServerConfs).
    

    请注意,我们的
    add_sse2/1
    函数必须在编译时包含
    yaws.hrl
    ,这样它就有了
    sconf
    记录的定义。

    我尝试了您提供的代码,它工作正常,不会影响其他连接,非常感谢!
    -include_lib("yaws/include/yaws.hrl").
    
    add_sse2(#sconf{appmods=AM}=SC) ->
        case lists:keyfind("/sse", 1, AM) of
            false ->
                SC;
            _ ->
                SC#sconf{appmods=[{"/sse2", my_sse_module}|AM]}
        end.