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)