Software /
code /
prosody
Comparison
plugins/mod_s2s.lua @ 11669:bca75f34d374
mod_s2s: Drop level of indentation by inverting a condition and early return
Nicer to get rid of a conditional that covers such a large portion of a
pretty big function.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 11 Jul 2021 12:37:51 +0200 |
parent | 11668:f18fbae6d9fe |
child | 11670:7f6c816a2c09 |
comparison
equal
deleted
inserted
replaced
11668:f18fbae6d9fe | 11669:bca75f34d374 |
---|---|
550 -- reason: stream error to send to the remote server | 550 -- reason: stream error to send to the remote server |
551 -- remote_reason: stream error received from the remote server | 551 -- remote_reason: stream error received from the remote server |
552 -- bounce_reason: stanza error to pass to bounce_sendq because stream- and stanza errors are different | 552 -- bounce_reason: stanza error to pass to bounce_sendq because stream- and stanza errors are different |
553 local function session_close(session, reason, remote_reason, bounce_reason) | 553 local function session_close(session, reason, remote_reason, bounce_reason) |
554 local log = session.log or log; | 554 local log = session.log or log; |
555 if session.conn then | 555 if not session.conn then |
556 local conn = session.conn; | 556 return |
557 conn:pause_writes(); -- until :close | 557 end |
558 if session.notopen then | 558 |
559 if session.direction == "incoming" then | 559 local conn = session.conn; |
560 session:open_stream(session.to_host, session.from_host); | 560 conn:pause_writes(); -- until :close |
561 else | 561 if session.notopen then |
562 session:open_stream(session.from_host, session.to_host); | 562 if session.direction == "incoming" then |
563 end | 563 session:open_stream(session.to_host, session.from_host); |
564 end | |
565 | |
566 local this_host = session.direction == "incoming" and session.to_host or session.from_host | |
567 | |
568 if reason then -- nil == no err, initiated by us, false == initiated by remote | |
569 local stream_error; | |
570 local condition, text, extra | |
571 if type(reason) == "string" then -- assume stream error | |
572 condition = reason | |
573 elseif type(reason) == "table" and not st.is_stanza(reason) then | |
574 condition = reason.condition or "undefined-condition" | |
575 text = reason.text | |
576 extra = reason.extra | |
577 end | |
578 if condition then | |
579 stream_error = st.stanza("stream:error"):tag(condition, stream_xmlns_attr):up(); | |
580 if text then | |
581 stream_error:tag("text", stream_xmlns_attr):text(text):up(); | |
582 end | |
583 if extra then | |
584 stream_error:add_child(extra); | |
585 end | |
586 end | |
587 if this_host and condition then | |
588 m_closed_connections:with_labels(this_host, session.direction, condition):add(1) | |
589 end | |
590 if st.is_stanza(stream_error) then | |
591 -- to and from are never unknown on outgoing connections | |
592 log("debug", "Disconnecting %s->%s[%s], <stream:error> is: %s", | |
593 session.from_host or "(unknown host)" or session.ip, session.to_host or "(unknown host)", session.type, reason); | |
594 session.sends2s(stream_error); | |
595 end | |
596 else | 564 else |
597 m_closed_connections:with_labels(this_host, session.direction, reason == false and ":remote-choice" or ":local-choice"):add(1) | 565 session:open_stream(session.from_host, session.to_host); |
598 end | 566 end |
599 | 567 end |
600 session.sends2s("</stream:stream>"); | 568 |
601 function session.sends2s() return false; end | 569 local this_host = session.direction == "incoming" and session.to_host or session.from_host |
602 | 570 |
603 -- luacheck: ignore 422/reason | 571 if reason then -- nil == no err, initiated by us, false == initiated by remote |
604 -- FIXME reason should be managed in a place common to c2s, s2s, bosh, component etc | 572 local stream_error; |
605 local reason = remote_reason or (reason and (reason.text or reason.condition)) or reason; | 573 local condition, text, extra |
606 session.log("info", "%s s2s stream %s->%s closed: %s", session.direction:gsub("^.", string.upper), | 574 if type(reason) == "string" then -- assume stream error |
607 session.from_host or "(unknown host)", session.to_host or "(unknown host)", reason or "stream closed"); | 575 condition = reason |
608 | 576 elseif type(reason) == "table" and not st.is_stanza(reason) then |
609 conn:resume_writes(); | 577 condition = reason.condition or "undefined-condition" |
610 | 578 text = reason.text |
611 -- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote | 579 extra = reason.extra |
612 if reason == nil and not session.notopen and session.direction == "incoming" then | 580 end |
613 add_task(stream_close_timeout, function () | 581 if condition then |
614 if not session.destroyed then | 582 stream_error = st.stanza("stream:error"):tag(condition, stream_xmlns_attr):up(); |
615 session.log("warn", "Failed to receive a stream close response, closing connection anyway..."); | 583 if text then |
616 s2s_destroy_session(session, reason, bounce_reason); | 584 stream_error:tag("text", stream_xmlns_attr):text(text):up(); |
617 conn:close(); | 585 end |
618 end | 586 if extra then |
619 end); | 587 stream_error:add_child(extra); |
620 else | 588 end |
621 s2s_destroy_session(session, reason, bounce_reason); | 589 end |
622 conn:close(); -- Close immediately, as this is an outgoing connection or is not authed | 590 if this_host and condition then |
623 end | 591 m_closed_connections:with_labels(this_host, session.direction, condition):add(1) |
592 end | |
593 if st.is_stanza(stream_error) then | |
594 -- to and from are never unknown on outgoing connections | |
595 log("debug", "Disconnecting %s->%s[%s], <stream:error> is: %s", | |
596 session.from_host or "(unknown host)" or session.ip, session.to_host or "(unknown host)", session.type, reason); | |
597 session.sends2s(stream_error); | |
598 end | |
599 else | |
600 m_closed_connections:with_labels(this_host, session.direction, reason == false and ":remote-choice" or ":local-choice"):add(1) | |
601 end | |
602 | |
603 session.sends2s("</stream:stream>"); | |
604 function session.sends2s() return false; end | |
605 | |
606 -- luacheck: ignore 422/reason 412/reason | |
607 -- FIXME reason should be managed in a place common to c2s, s2s, bosh, component etc | |
608 local reason = remote_reason or (reason and (reason.text or reason.condition)) or reason; | |
609 session.log("info", "%s s2s stream %s->%s closed: %s", session.direction:gsub("^.", string.upper), | |
610 session.from_host or "(unknown host)", session.to_host or "(unknown host)", reason or "stream closed"); | |
611 | |
612 conn:resume_writes(); | |
613 | |
614 -- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote | |
615 if reason == nil and not session.notopen and session.direction == "incoming" then | |
616 add_task(stream_close_timeout, function () | |
617 if not session.destroyed then | |
618 session.log("warn", "Failed to receive a stream close response, closing connection anyway..."); | |
619 s2s_destroy_session(session, reason, bounce_reason); | |
620 conn:close(); | |
621 end | |
622 end); | |
623 else | |
624 s2s_destroy_session(session, reason, bounce_reason); | |
625 conn:close(); -- Close immediately, as this is an outgoing connection or is not authed | |
624 end | 626 end |
625 end | 627 end |
626 | 628 |
627 function session_stream_attrs(session, from, to, attr) -- luacheck: ignore 212/session | 629 function session_stream_attrs(session, from, to, attr) -- luacheck: ignore 212/session |
628 if not from or (hosts[from] and hosts[from].modules.dialback) then | 630 if not from or (hosts[from] and hosts[from].modules.dialback) then |