@@ -329,8 +329,8 @@ local function apply_http(conf)
329329 local host , port , target
330330 if node .server ~= nil then
331331 target = {
332- value = node .server ,
333- is_httpd_role = true ,
332+ value = ' httpd_ ' .. node .server ,
333+ httpd_name = node . server ,
334334 }
335335 elseif node .listen ~= nil then
336336 local err
@@ -339,23 +339,34 @@ local function apply_http(conf)
339339 error (" failed to parse URI: " .. err , 2 )
340340 end
341341 target = {
342- value = node . listen ,
342+ value = ' listen_ ' .. host .. ' : ' .. tostring ( port ) ,
343343 is_httpd_role = false ,
344344 }
345345 else
346346 target = {
347- value = httpd_role .DEFAULT_SERVER_NAME ,
348- is_httpd_role = true ,
347+ value = ' httpd_ ' .. httpd_role .DEFAULT_SERVER_NAME ,
348+ httpd_name = httpd_role . DEFAULT_SERVER_NAME ,
349349 }
350350 end
351351
352352 http_servers = http_servers or {}
353+
353354 -- Since the 'listen' and 'server' names of other servers in the config may be
354- -- the same, we create a unique string concatenating the key name and information
355- -- about whether it is an httpd key or not.
356- enabled [tostring (target .value ) .. tostring (target .is_httpd_role )] = true
355+ -- the same, we create a unique string concatenating the host and port of a server.
356+ enabled [target .value ] = true
357+
358+ if http_servers [target .value ] == nil then
359+ if target .httpd_name == nil then
360+ for k in pairs (http_servers ) do
361+ -- We stop running server before creating a new one if port matches and hosts different
362+ -- only on 'listen' target.
363+ if k ~= target .value and string.find (k , ' :' .. tostring (port )) ~= nil then
364+ http_servers [k ].httpd :stop ()
365+ enabled [k ] = false
366+ end
367+ end
368+ end
357369
358- if http_servers [tostring (target .value ) .. tostring (target .is_httpd_role )] == nil then
359370 local httpd
360371 if node .listen ~= nil then
361372 httpd = http_server .new (host , port , {
@@ -368,17 +379,17 @@ local function apply_http(conf)
368379 })
369380 httpd :start ()
370381 else
371- httpd = httpd_role .get_server (target .value )
382+ httpd = httpd_role .get_server (target .httpd_name )
372383 end
373384
374- http_servers [tostring ( target .value ) .. tostring ( target . is_httpd_role ) ] = {
385+ http_servers [target .value ] = {
375386 httpd = httpd ,
376387 routes = {},
377- is_httpd_role = target .is_httpd_role ,
388+ httpd_name = target .httpd_name ,
378389 }
379390 end
380391
381- local server = http_servers [tostring ( target .value ) .. tostring ( target . is_httpd_role ) ]
392+ local server = http_servers [target .value ]
382393 local httpd = server .httpd
383394 local old_routes = server .routes
384395
@@ -418,14 +429,16 @@ local function apply_http(conf)
418429 end
419430 end
420431
421- for target , server in pairs (http_servers ) do
432+ for target , server in pairs (http_servers or {} ) do
422433 if not enabled [target ] then
423- if server .is_httpd_role then
434+ if server .httpd_name ~= nil then
424435 for path , _ in pairs (server .routes ) do
425436 server .httpd :delete (path )
426437 end
427438 else
428- server .httpd :stop ()
439+ if server .httpd .is_run == true then
440+ server .httpd :stop ()
441+ end
429442 end
430443 http_servers [target ] = nil
431444 end
@@ -434,12 +447,14 @@ end
434447
435448local function stop_http ()
436449 for _ , server in pairs (http_servers or {}) do
437- if server .is_httpd_role then
450+ if server .httpd_name ~= nil then
438451 for path , _ in pairs (server .routes ) do
439452 server .httpd :delete (path )
440453 end
441454 else
442- server .httpd :stop ()
455+ if server .httpd .is_run == true then
456+ server .httpd :stop ()
457+ end
443458 end
444459 end
445460 http_servers = nil
0 commit comments