< prev index next >

src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java

Print this page

        

@@ -38,10 +38,15 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.lang.module.ModuleDescriptor;
 import java.lang.module.ModuleFinder;
 import java.lang.module.ModuleReference;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.channels.UnresolvedAddressException;
 import java.nio.charset.Charset;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.InvalidPathException;
 import java.nio.file.Path;

@@ -2966,12 +2971,37 @@
         });
         return true;
     }
 
     private boolean cmdOpen(String filename) {
+        if (filename.startsWith("http://") || filename.startsWith("https://")) {
+            return runUrl(filename, "/open");
+        } else {
         return runFile(filename, "/open");
     }
+    }
+
+    private boolean runUrl(String fileUrl, String context) {
+        try {
+            var httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL).build();
+            var request = HttpRequest.newBuilder(URI.create(fileUrl)).build();
+            var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
+
+            if (response.statusCode() == 200) {
+                var scanner = new Scanner(response.body());
+                run(new ScannerIOContext(scanner));
+                return true;
+            } else {
+                errormsg("jshell.err.url.not.accessible", context, fileUrl, response.statusCode());
+                return false;
+            }
+        } catch (UnresolvedAddressException | InterruptedException | IOException e) {
+            errormsg("jshell.err.url.exception", context, fileUrl, e);
+        }
+
+        return false;
+    }
 
     private boolean runFile(String filename, String context) {
         if (!filename.isEmpty()) {
             try {
                 Scanner scanner;
< prev index next >