Op 07-12-2021 om 23:49 schreef Ben Engbers:

After a long nightly session, I ended up with inserting a wait between sending the authentication nonce and reading the status byte.

writeBin(auth, private$conn)
Sys.sleep(.1)
Accepted <- readBin(conn, what = "raw", n = 1)

The new code, which now uses a non-blocking socket, takes less than 4 seconds to execute the 53 tests. Compared to the 120 seconds when using a blocking socket, this was worth the effort.

Ben


Hi Tomas,

I have implemented your suggestions as follows: (I'm not certain yet if the first check in done - total_length == 0 is realy needed)

Creating the socket:

CreateSocket = function(host, port = 1984L, username, password) {
   tryCatch(
     {conn <- private$conn <- socketConnection(
       host = "localhost", port,
       open = "w+b", server = FALSE, blocking = FALSE, encoding = "UTF-8")
     }, error = function(e) {
       stop("Cannot open the connection")
      }
   )

#### Authenticating

response <- readBin_(conn) %>% rawToChar()
===> # browser()
splitted <-strsplit(response, "\\:")
ifelse(length(splitted[[1]]) > 1,
   { realm <- splitted[[1]][1]
     code  <- paste(username, realm, password, sep=":")
     nonce <- splitted[[1]][2] },
   { code  <- password
     nonce <- splitted[[1]][1]}
   )
code <- md5(paste(md5(code), nonce, sep = "")) %>% charToRaw()
# send username + code
auth <- c(charToRaw(username), as.raw(0x00), code, as.raw(0x00))
writeBin(auth, private$conn)
Accepted <- readBin(conn, what = "raw", n = 1) == 0x00
if (!Accepted) {
close(private$conn)
stop("Access denied")
}

The first time readBin is used is while authenticating a new session.
This code fails ;-(

But when I insert a  call to browser() after the first authentication line, I can execute all the following code without problems. This results in a fully functional session. And all the other following calls to readBin_ return the correct data. This means that 'done' and 'readBin' do exactly what they are intended to do.

Question
Why does creating and authenticating fail when a call to browser() is missing? (Or why does authentication succeed after I have used the debugger?

Best,
Ben
______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to