Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Propagate half-closes correctly in forward #163

Merged
merged 2 commits into from
May 29, 2024
Merged

Conversation

euank
Copy link
Contributor

@euank euank commented May 28, 2024

Before, the following would not work as you would expect:

// # One terminal
// $ ncat --recv-only -l 9090

// ngrok-go code
fwd, err := sess.ListenAndForward(
  ctx,
  "127.0.0.1:9090",
  config.TCPEndpoint(),
)

// fwd.URL() is 0.tcp.jp.ngrok.io:14517 for this example

// another terminal
// $ ncat --send-only 0.tcp.jp.ngrok.io 14517 < hello-world.txt

What we would expect from the above would be for the send side to send "hello world" and exit, and then the recv side to print "hello world" and also exit.

This is what happens if you do ncat --send-only localhost 9090 instead of copying through the ngrok tcp tunnel.

Before this change, when copying through ngrok the recv side would not exit because the 'Close' of the connection did not get propagated through the 'join'.

I've also added a unit test showing this.

Thank you to @abakum for originally noticing this issue and offering a fix over in #137.
In the hopes of landing this more quickly, I've written a new version, derived from the internal ngrok agent's join code, which should thus be easier to review etc.

To try and give credit correctly, I've maintained the original commit from #137 as well.

@euank euank force-pushed the join-halfclose branch from 981f6b2 to f64ed57 Compare May 28, 2024 04:02
Before, the following would not work as you would expect:

```go
// # One terminal
// $ ncat --recv-only -l 9090

// ngrok-go code
fwd, err := sess.ListenAndForward(
  ctx,
  "127.0.0.1:9090",
  config.TCPEndpoint(),
)

// fwd.URL() is 0.tcp.jp.ngrok.io:14517 for this example

// another terminal
// $ ncat --send-only 0.tcp.jp.ngrok.io 14517 < hello-world.txt
```

What we would expect from the above would be for the send side to send
"hello world" and exit, and then the recv side to print "hello world"
and also exit.

This is what happens if you do `ncat --send-only localhost 9090`
instead of copying through the ngrok tcp tunnel.

Before this change, when copying through ngrok the recv side would not
exit because the 'Close' of the connection did not get propagated
through the 'join'.

I've also added a unit test showing this.

Thank you to @abakum for originally noticing this issue and offering a
fix over in ngrok#137.
In the hopes of landing this more quickly, I've written a new version, derived from
the internal ngrok agent's join code, which should thus be easier to
review etc.

To try and give credit correctly, I've maintained the original commits
from ngrok#137 as well.
@euank euank force-pushed the join-halfclose branch from f64ed57 to c67a6d2 Compare May 28, 2024 04:03
Copy link
Contributor

@bobzilladev bobzilladev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, and does line up with the internal join.

@bobzilladev
Copy link
Contributor

Ah, need the authtoken to run tests, will work out of the box as a branch on ngrok org if moved there.

@euank
Copy link
Contributor Author

euank commented May 29, 2024

Thanks for the review; I created a dummy PR over in #165 to verify it's happy wrt CI!
It would be nice if we could figure something out to allow external PRs to get proper CI too. Regardless, merging based on review + CI here

@euank euank merged commit 4917562 into ngrok:main May 29, 2024
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants