• Handle delimiter in read message

    From mike@21:1/5 to All on Sun May 22 23:09:40 2022
    Hi,

    We receive a message called "chunked message" in NETCONF.
    Example:

    final String MSG_REPLY = "#877\r\n"
    +
    "<rpc-reply message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\"><listen><endpoint><name>
    default-ssh</name><ssh><tcp-server-parameters><local-address>0.0.0.0</local-address><keepalives><idle-time>1</idle-time><max-probes>10</max-probes><probe-interval>5</probe-interval></keepalives></tcp-server-parameters><ssh-server-parameters><server-
    identity><host-key><name>default-key</name><public-key><keystore-reference>genkey</keystore-reference></public-key></host-key></server-identity><client-authentication><supported-authentication-methods><publickey/><passsword/><other>interactive</other></
    supported-authentication-methods><users/></client-authentication></ssh-server-parameters></ssh></endpoint></listen></netconf-server></data></rpc-reply>\r\n"
    +
    "##\r\n";

    I tried:

    String newline = System.getProperty("line.separator");//make sure I get newline for platform.
    return sb.toString().contains(newline + "##" + newline);

    But it fails. Is it possible to check if the string ends with a regex pattern?

    //mike

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From mike@21:1/5 to All on Mon May 23 02:59:58 2022
    måndag 23 maj 2022 kl. 11:32:07 UTC+2 skrev mike:
    måndag 23 maj 2022 kl. 08:09:48 UTC+2 skrev mike:
    Hi,

    We receive a message called "chunked message" in NETCONF.
    Example:

    final String MSG_REPLY = "#877\r\n"
    +
    "<rpc-reply message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\"><listen><endpoint><name>default-ssh</name>
    <ssh><tcp-server-parameters><local-address>0.0.0.0</local-address><keepalives><idle-time>1</idle-time><max-probes>10</max-probes><probe-interval>5</probe-interval></keepalives></tcp-server-parameters><ssh-server-parameters><server-identity><host-key><
    name>default-key</name><public-key><keystore-reference>genkey</keystore-reference></public-key></host-key></server-identity><client-authentication><supported-authentication-methods><publickey/><passsword/><other>interactive</other></supported-
    authentication-methods><users/></client-authentication></ssh-server-parameters></ssh></endpoint></listen></netconf-server></data></rpc-reply>\r\n"
    +
    "##\r\n";

    I tried:

    String newline = System.getProperty("line.separator");//make sure I get newline for platform.
    return sb.toString().contains(newline + "##" + newline);

    But it fails. Is it possible to check if the string ends with a regex pattern?

    //mike
    I even checked the ASCII in my buffer.

    ASCII numbers is:

    10 LF
    35 #
    35 #
    10 LF

    I changed my regexp:

    sb.toString().matches("(?s).*\\r\\n|\\n##\\r\\n|\\n$")

    but it still evaluates to false. I suspect it is DOT ALL that gives me the headache.

    //mike

    Even tried this to make sure I have only four last characters of my string.

    String endofMsg = sb.toString().substring(sb.toString().length() - 4);

    return endofMsg.matches("^\\r\\n|[\\n]##\\r\\n|[\\n]$");

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From mike@21:1/5 to All on Mon May 23 02:31:59 2022
    måndag 23 maj 2022 kl. 08:09:48 UTC+2 skrev mike:
    Hi,

    We receive a message called "chunked message" in NETCONF.
    Example:

    final String MSG_REPLY = "#877\r\n"
    +
    "<rpc-reply message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\"><listen><endpoint><name>default-ssh</name><
    <tcp-server-parameters><local-address>0.0.0.0</local-address><keepalives><idle-time>1</idle-time><max-probes>10</max-probes><probe-interval>5</probe-interval></keepalives></tcp-server-parameters><ssh-server-parameters><server-identity><host-key><name>
    default-key</name><public-key><keystore-reference>genkey</keystore-reference></public-key></host-key></server-identity><client-authentication><supported-authentication-methods><publickey/><passsword/><other>interactive</other></supported-authentication-
    methods><users/></client-authentication></ssh-server-parameters></ssh></endpoint></listen></netconf-server></data></rpc-reply>\r\n"
    +
    "##\r\n";

    I tried:

    String newline = System.getProperty("line.separator");//make sure I get newline for platform.
    return sb.toString().contains(newline + "##" + newline);

    But it fails. Is it possible to check if the string ends with a regex pattern?

    //mike

    I even checked the ASCII in my buffer.

    ASCII numbers is:

    10 LF
    35 #
    35 #
    10 LF

    I changed my regexp:

    sb.toString().matches("(?s).*\\r\\n|\\n##\\r\\n|\\n$")

    but it still evaluates to false. I suspect it is DOT ALL that gives me the headache.

    //mike

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From mike@21:1/5 to All on Mon May 23 04:34:42 2022
    måndag 23 maj 2022 kl. 12:00:06 UTC+2 skrev mike:
    måndag 23 maj 2022 kl. 11:32:07 UTC+2 skrev mike:
    måndag 23 maj 2022 kl. 08:09:48 UTC+2 skrev mike:
    Hi,

    We receive a message called "chunked message" in NETCONF.
    Example:

    final String MSG_REPLY = "#877\r\n"
    +
    "<rpc-reply message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\"><listen><endpoint><name>default-ssh</
    name><ssh><tcp-server-parameters><local-address>0.0.0.0</local-address><keepalives><idle-time>1</idle-time><max-probes>10</max-probes><probe-interval>5</probe-interval></keepalives></tcp-server-parameters><ssh-server-parameters><server-identity><host-key>
    <name>default-key</name><public-key><keystore-reference>genkey</keystore-reference></public-key></host-key></server-identity><client-authentication><supported-authentication-methods><publickey/><passsword/><other>interactive</other></supported-
    authentication-methods><users/></client-authentication></ssh-server-parameters></ssh></endpoint></listen></netconf-server></data></rpc-reply>\r\n"
    +
    "##\r\n";

    I tried:

    String newline = System.getProperty("line.separator");//make sure I get newline for platform.
    return sb.toString().contains(newline + "##" + newline);

    But it fails. Is it possible to check if the string ends with a regex pattern?

    //mike
    I even checked the ASCII in my buffer.

    ASCII numbers is:

    10 LF
    35 #
    35 #
    10 LF

    I changed my regexp:

    sb.toString().matches("(?s).*\\r\\n|\\n##\\r\\n|\\n$")

    but it still evaluates to false. I suspect it is DOT ALL that gives me the headache.

    //mike
    Even tried this to make sure I have only four last characters of my string.

    String endofMsg = sb.toString().substring(sb.toString().length() - 4);

    return endofMsg.matches("^\\r\\n|[\\n]##\\r\\n|[\\n]$");

    I found out I can do:

    String endofMsg = sb.toString().substring(sb.toString().length() - 6);
    return endofMsg.matches("\\r\\n##\\r\\n|.*\\n##\\n$");

    I had to use the last 6 characters since newline is different for each platform.

    //mike

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From e.d.programmer@gmail.com@21:1/5 to All on Mon May 23 06:31:13 2022
    I found out I can do:

    String endofMsg = sb.toString().substring(sb.toString().length() - 6); return endofMsg.matches("\\r\\n##\\r\\n|.*\\n##\\n$");

    I had to use the last 6 characters since newline is different for each platform.

    //mike

    I'm not clear what is the problem you're trying to solve, but System.getProperty("line.separator") is system dependent, so if you're running that on one system to get a value to use on a different system, your value will be wrong if the systems are
    different. *nix uses \n for linefeed, Windows uses \r\n , so you're checking for the presence of \n if you want to check for a linefeed.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Eric Sosman@21:1/5 to e.d.pro...@gmail.com on Mon May 23 10:33:44 2022
    On 5/23/2022 9:31 AM, e.d.pro...@gmail.com wrote:
    I found out I can do:

    String endofMsg = sb.toString().substring(sb.toString().length() - 6);
    return endofMsg.matches("\\r\\n##\\r\\n|.*\\n##\\n$");

    I had to use the last 6 characters since newline is different for each platform.

    //mike

    I'm not clear what is the problem you're trying to solve, but System.getProperty("line.separator") is system dependent, so if you're running that on one system to get a value to use on a different system, your value will be wrong if the systems are
    different. *nix uses \n for linefeed, Windows uses \r\n , so you're checking for the presence of \n if you want to check for a linefeed.

    Also (if I recall correctly), various Internet RFC's require CR-LF
    line terminators, regardless of the system sending the lines. I don't
    know whether mike's messages follow such a protocol, but many do.

    His best bet may be to recognize all of CR, LF, and CR-LF as line terminators, and maybe even LF-CR as well.

    --
    esosman@comcast-dot-net.invalid
    Look on my code, ye Hackers, and guffaw!

    --
    This email has been checked for viruses by AVG.
    https://www.avg.com

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?Q?Arne_Vajh=c3=b8j?=@21:1/5 to mike on Mon May 23 11:21:12 2022
    On 5/23/2022 7:34 AM, mike wrote:
    måndag 23 maj 2022 kl. 12:00:06 UTC+2 skrev mike:
    måndag 23 maj 2022 kl. 11:32:07 UTC+2 skrev mike:
    måndag 23 maj 2022 kl. 08:09:48 UTC+2 skrev mike:
    We receive a message called "chunked message" in NETCONF.
    Example:

    final String MSG_REPLY = "#877\r\n"
    +
    "<rpc-reply message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\"><listen><endpoint><name>default-ssh</
    name><ssh><tcp-server-parameters><local-address>0.0.0.0</local-address><keepalives><idle-time>1</idle-time><max-probes>10</max-probes><probe-interval>5</probe-interval></keepalives></tcp-server-parameters><ssh-server-parameters><server-identity><host-key>
    <name>default-key</name><public-key><keystore-reference>genkey</keystore-reference></public-key></host-key></server-identity><client-authentication><supported-authentication-methods><publickey/><passsword/><other>interactive</other></supported-
    authentication-methods><users/></client-authentication></ssh-server-parameters></ssh></endpoint></listen></netconf-server></data></rpc-reply>\r\n"
    +
    "##\r\n";

    I tried:

    String newline = System.getProperty("line.separator");//make sure I get newline for platform.
    return sb.toString().contains(newline + "##" + newline);

    But it fails. Is it possible to check if the string ends with a regex pattern?

    //mike
    I even checked the ASCII in my buffer.

    ASCII numbers is:

    10 LF
    35 #
    35 #
    10 LF

    I changed my regexp:

    sb.toString().matches("(?s).*\\r\\n|\\n##\\r\\n|\\n$")

    but it still evaluates to false. I suspect it is DOT ALL that gives me the headache.

    Even tried this to make sure I have only four last characters of my string. >>
    String endofMsg = sb.toString().substring(sb.toString().length() - 4);

    return endofMsg.matches("^\\r\\n|[\\n]##\\r\\n|[\\n]$");

    I found out I can do:

    String endofMsg = sb.toString().substring(sb.toString().length() - 6);
    return endofMsg.matches("\\r\\n##\\r\\n|.*\\n##\\n$");

    I had to use the last 6 characters since newline is different for each platform.

    This seems to work:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class EndTest {
    private static final Pattern re = Pattern.compile("^#\\d+\\v+(.*)##\\v+$", Pattern.MULTILINE +
    Pattern.DOTALL);
    public static void test(String s) {
    System.out.println(s);
    Matcher m = re.matcher(s);
    if(m.find()) {
    System.out.println("Match: " + m.group(1));
    } else {
    System.out.println("No match");
    }
    }
    public static void main(String[] args) {
    test("ABC");
    String msg = "#877\r\n"
    +
    "<rpc-reply message-id=\"1\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><netconf-server xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-server\"><listen><endpoint><name>default-ssh</name><ssh><tcp-server-parameters><local-address>0.0.0.0</local-address><keepalives><idle-time>1</idle-time><max-probes>10</max-probes><probe-interval>5</probe-
    interval></keepalives></tcp-server-parameters><ssh-server-parameters><server-identity><host-key><name>default-key</name><public-key><keystore-reference>genkey</keystore-reference></public-key></host-key></server-identity><client-authentication><supported-
    authentication-methods><publickey/><passsword/><other>interactive</other></supported-authentication-methods><users/></client-authentication></ssh-server-parameters></ssh></endpoint></listen></netconf-server></data></rpc-reply>\r\n"

    +
    "##\r\n";
    test(msg);
    }
    }

    Arne

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Stanimir Stamenkov@21:1/5 to All on Tue Jun 7 23:19:17 2022
    Mon, 23 May 2022 02:31:59 -0700 (PDT), /mike/:

    I changed my regexp:

    sb.toString().matches("(?s).*\\r\\n|\\n##\\r\\n|\\n$")

    but it still evaluates to false. I suspect it is DOT ALL that gives me the headache.

    Maybe you really mean (note the grouping):

    sb.toString().matches("(?s).*(\\r\\n|\\n##\\r\\n|\\n)$")

    or even:

    sb.toString().matches("(?s).*\\r?\\n(##\\r?\\n?)?$")

    --
    Stanimir

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)