Skip to content
This repository was archived by the owner on Jul 6, 2023. It is now read-only.

Commit b9565ac

Browse files
authored
Merge pull request #204 from sherfert/bolt-fallback-4.0
Automatically fall back to bolt protocol
2 parents 5494d30 + a6ad7cb commit b9565ac

File tree

3 files changed

+66
-3
lines changed

3 files changed

+66
-3
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.neo4j.shell.commands;
2+
3+
import org.junit.Test;
4+
5+
import org.neo4j.shell.ConnectionConfig;
6+
import org.neo4j.shell.CypherShell;
7+
import org.neo4j.shell.ShellParameterMap;
8+
import org.neo4j.shell.StringLinePrinter;
9+
import org.neo4j.shell.cli.Format;
10+
import org.neo4j.shell.prettyprint.PrettyConfig;
11+
import static org.junit.Assert.assertTrue;
12+
13+
import static org.neo4j.shell.DatabaseManager.ABSENT_DB_NAME;
14+
15+
public class CypherShellProtocolIntegrationTest{
16+
17+
@Test
18+
public void shouldConnectWithNeo4jProtocol() throws Exception {
19+
CypherShell shell = new CypherShell( new StringLinePrinter(), new PrettyConfig( Format.PLAIN, true, 1000), false, new ShellParameterMap());
20+
// This should work even on older databases without the neo4j protocol, by falling back to bolt
21+
shell.connect( new ConnectionConfig( "neo4j://", "localhost", 7687, "neo4j", "neo", false, ABSENT_DB_NAME ) );
22+
assertTrue(shell.isConnected());
23+
}
24+
}

cypher-shell/src/main/java/org/neo4j/shell/state/BoltStateHandler.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.neo4j.driver.Values;
2727
import org.neo4j.driver.exceptions.ClientException;
2828
import org.neo4j.driver.exceptions.SessionExpiredException;
29+
import org.neo4j.driver.internal.DriverFactory;
2930
import org.neo4j.driver.summary.DatabaseInfo;
3031
import org.neo4j.driver.summary.ResultSummary;
3132
import org.neo4j.function.ThrowingAction;
@@ -155,9 +156,25 @@ public void connect( @Nonnull ConnectionConfig connectionConfig, ThrowingAction<
155156
}
156157
final AuthToken authToken = AuthTokens.basic(connectionConfig.username(), connectionConfig.password());
157158
try {
158-
setActiveDatabase(connectionConfig.database());
159-
driver = getDriver(connectionConfig, authToken);
160-
reconnect(command);
159+
try {
160+
setActiveDatabase(connectionConfig.database());
161+
driver = getDriver(connectionConfig, authToken);
162+
reconnect(command);
163+
} catch (org.neo4j.driver.exceptions.ServiceUnavailableException e) {
164+
if (!connectionConfig.scheme().equals(DriverFactory.BOLT_ROUTING_URI_SCHEME + "://")) {
165+
throw e;
166+
}
167+
connectionConfig = new ConnectionConfig(
168+
DriverFactory.BOLT_URI_SCHEME + "://",
169+
connectionConfig.host(),
170+
connectionConfig.port(),
171+
connectionConfig.username(),
172+
connectionConfig.password(),
173+
connectionConfig.encryption(),
174+
connectionConfig.database());
175+
driver = getDriver(connectionConfig, authToken);
176+
reconnect();
177+
}
161178
} catch (Throwable t) {
162179
try {
163180
silentDisconnect();

cypher-shell/src/test/java/org/neo4j/shell/state/BoltStateHandlerTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.neo4j.driver.Value;
2121
import org.neo4j.driver.exceptions.ClientException;
2222
import org.neo4j.driver.exceptions.SessionExpiredException;
23+
import org.neo4j.driver.internal.DriverFactory;
2324
import org.neo4j.driver.summary.DatabaseInfo;
2425
import org.neo4j.driver.summary.ResultSummary;
2526
import org.neo4j.driver.summary.ServerInfo;
@@ -416,6 +417,27 @@ public void turnOnEncryptionIfRequested() throws CommandException {
416417
assertTrue(provider.config.encrypted());
417418
}
418419

420+
@Test
421+
public void fallbackToBolt() throws CommandException {
422+
final String[] uriScheme = new String[1];
423+
RecordingDriverProvider provider = new RecordingDriverProvider() {
424+
@Override
425+
public Driver apply(String uri, AuthToken authToken, Config config) {
426+
uriScheme[0] = uri.substring(0, uri.indexOf(':'));
427+
if (uriScheme[0].equals("neo4j")) {
428+
throw new org.neo4j.driver.exceptions.ServiceUnavailableException("Please fall back");
429+
}
430+
super.apply(uri, authToken, config);
431+
return new FakeDriver();
432+
}
433+
};
434+
BoltStateHandler handler = new BoltStateHandler(provider, false);
435+
ConnectionConfig config = new ConnectionConfig("neo4j://", "", -1, "", "", false, ABSENT_DB_NAME);
436+
handler.connect(config);
437+
438+
assertEquals("bolt", uriScheme[0]);
439+
}
440+
419441
private Driver stubResultSummaryInAnOpenSession(Result resultMock, Session sessionMock, String version) {
420442
return stubResultSummaryInAnOpenSession(resultMock, sessionMock, version, DEFAULT_DEFAULT_DB_NAME);
421443
}

0 commit comments

Comments
 (0)