提交 2e952539 编写于 作者: C chegar

7189567: java net obselete protocol

Reviewed-by: alanb, ahgross
上级 51ea0f8c
......@@ -128,8 +128,6 @@ FILES_java = \
sun/net/www/content/audio/x_wav.java \
sun/net/www/protocol/ftp/Handler.java \
sun/net/www/protocol/ftp/FtpURLConnection.java \
sun/net/www/protocol/gopher/GopherClient.java \
sun/net/www/protocol/gopher/Handler.java \
sun/net/www/protocol/mailto/Handler.java \
sun/net/www/protocol/mailto/MailToURLConnection.java \
sun/net/idn/Punycode.java \
......
/*
* Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.net.www.protocol.gopher;
import java.io.*;
import java.util.*;
import java.net.*;
import sun.net.www.*;
import sun.net.NetworkClient;
import java.net.URL;
import java.net.URLStreamHandler;
import sun.security.action.GetBooleanAction;
/** Class to maintain the state of a gopher fetch and handle the protocol */
public class GopherClient extends NetworkClient implements Runnable {
/* The following three data members are left in for binary
* backwards-compatibility. Unfortunately, HotJava sets them directly
* when it wants to change the settings. The new design has us not
* cache these, so this is unnecessary, but eliminating the data members
* would break HJB 1.1 under JDK 1.2.
*
* These data members are not used, and their values are meaningless.
* REMIND: Take them out for JDK 2.0!
*/
/**
* @deprecated
*/
@Deprecated
public static boolean useGopherProxy;
/**
* @deprecated
*/
@Deprecated
public static String gopherProxyHost;
/**
* @deprecated
*/
@Deprecated
public static int gopherProxyPort;
static {
useGopherProxy = java.security.AccessController.doPrivileged(
new sun.security.action.GetBooleanAction("gopherProxySet"))
.booleanValue();
gopherProxyHost = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("gopherProxyHost"));
gopherProxyPort = java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction("gopherProxyPort", 80))
.intValue();
}
PipedOutputStream os;
URL u;
int gtype;
String gkey;
sun.net.www.URLConnection connection;
GopherClient(sun.net.www.URLConnection connection) {
this.connection = connection;
}
/**
* @return true if gopher connections should go through a proxy, according
* to system properties.
*/
public static boolean getUseGopherProxy() {
return java.security.AccessController.doPrivileged(
new GetBooleanAction("gopherProxySet")).booleanValue();
}
/**
* @return the proxy host to use, or null if nothing is set.
*/
public static String getGopherProxyHost() {
String host = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("gopherProxyHost"));
if ("".equals(host)) {
host = null;
}
return host;
}
/**
* @return the proxy port to use. Will default reasonably.
*/
public static int getGopherProxyPort() {
return java.security.AccessController.doPrivileged(
new sun.security.action.GetIntegerAction("gopherProxyPort", 80))
.intValue();
}
/** Given a url, setup to fetch the gopher document it refers to */
InputStream openStream(URL u) throws IOException {
this.u = u;
this.os = os;
int i = 0;
String s = u.getFile();
int limit = s.length();
int c = '1';
while (i < limit && (c = s.charAt(i)) == '/')
i++;
gtype = c == '/' ? '1' : c;
if (i < limit)
i++;
gkey = s.substring(i);
openServer(u.getHost(), u.getPort() <= 0 ? 70 : u.getPort());
MessageHeader msgh = new MessageHeader();
switch (gtype) {
case '0':
case '7':
msgh.add("content-type", "text/plain");
break;
case '1':
msgh.add("content-type", "text/html");
break;
case 'g':
case 'I':
msgh.add("content-type", "image/gif");
break;
default:
msgh.add("content-type", "content/unknown");
break;
}
if (gtype != '7') {
serverOutput.print(decodePercent(gkey) + "\r\n");
serverOutput.flush();
} else if ((i = gkey.indexOf('?')) >= 0) {
serverOutput.print(decodePercent(gkey.substring(0, i) + "\t" +
gkey.substring(i + 1) + "\r\n"));
serverOutput.flush();
msgh.add("content-type", "text/html");
} else {
msgh.add("content-type", "text/html");
}
connection.setProperties(msgh);
if (msgh.findValue("content-type") == "text/html") {
os = new PipedOutputStream();
PipedInputStream ret = new PipedInputStream();
ret.connect(os);
new Thread(this).start();
return ret;
}
return new GopherInputStream(this, serverInput);
}
/** Translate all the instances of %NN into the character they represent */
private String decodePercent(String s) {
if (s == null || s.indexOf('%') < 0)
return s;
int limit = s.length();
char d[] = new char[limit];
int dp = 0;
for (int sp = 0; sp < limit; sp++) {
int c = s.charAt(sp);
if (c == '%' && sp + 2 < limit) {
int s1 = s.charAt(sp + 1);
int s2 = s.charAt(sp + 2);
if ('0' <= s1 && s1 <= '9')
s1 = s1 - '0';
else if ('a' <= s1 && s1 <= 'f')
s1 = s1 - 'a' + 10;
else if ('A' <= s1 && s1 <= 'F')
s1 = s1 - 'A' + 10;
else
s1 = -1;
if ('0' <= s2 && s2 <= '9')
s2 = s2 - '0';
else if ('a' <= s2 && s2 <= 'f')
s2 = s2 - 'a' + 10;
else if ('A' <= s2 && s2 <= 'F')
s2 = s2 - 'A' + 10;
else
s2 = -1;
if (s1 >= 0 && s2 >= 0) {
c = (s1 << 4) | s2;
sp += 2;
}
}
d[dp++] = (char) c;
}
return new String(d, 0, dp);
}
/** Turn special characters into the %NN form */
private String encodePercent(String s) {
if (s == null)
return s;
int limit = s.length();
char d[] = null;
int dp = 0;
for (int sp = 0; sp < limit; sp++) {
int c = s.charAt(sp);
if (c <= ' ' || c == '"' || c == '%') {
if (d == null)
d = s.toCharArray();
if (dp + 3 >= d.length) {
char nd[] = new char[dp + 10];
System.arraycopy(d, 0, nd, 0, dp);
d = nd;
}
d[dp] = '%';
int dig = (c >> 4) & 0xF;
d[dp + 1] = (char) (dig < 10 ? '0' + dig : 'A' - 10 + dig);
dig = c & 0xF;
d[dp + 2] = (char) (dig < 10 ? '0' + dig : 'A' - 10 + dig);
dp += 3;
} else {
if (d != null) {
if (dp >= d.length) {
char nd[] = new char[dp + 10];
System.arraycopy(d, 0, nd, 0, dp);
d = nd;
}
d[dp] = (char) c;
}
dp++;
}
}
return d == null ? s : new String(d, 0, dp);
}
/** This method is run as a seperate thread when an incoming gopher
document requires translation to html */
public void run() {
int qpos = -1;
try {
if (gtype == '7' && (qpos = gkey.indexOf('?')) < 0) {
PrintStream ps = new PrintStream(os, false, encoding);
ps.print("<html><head><title>Searchable Gopher Index</title></head>\n<body><h1>Searchable Gopher Index</h1><isindex>\n</body></html>\n");
} else if (gtype != '1' && gtype != '7') {
byte buf[] = new byte[2048];
try {
int n;
while ((n = serverInput.read(buf)) >= 0)
os.write(buf, 0, n);
} catch(Exception e) {
}
} else {
PrintStream ps = new PrintStream(os, false, encoding);
String title = null;
if (gtype == '7')
title = "Results of searching for \"" + gkey.substring(qpos + 1)
+ "\" on " + u.getHost();
else
title = "Gopher directory " + gkey + " from " + u.getHost();
ps.print("<html><head><title>");
ps.print(title);
ps.print("</title></head>\n<body>\n<H1>");
ps.print(title);
ps.print("</h1><dl compact>\n");
BufferedReader ds = new BufferedReader(new InputStreamReader(serverInput));
String s;
while ((s = ds.readLine()) != null) {
int len = s.length();
while (len > 0 && s.charAt(len - 1) <= ' ')
len--;
if (len <= 0)
continue;
int key = s.charAt(0);
int t1 = s.indexOf('\t');
int t2 = t1 > 0 ? s.indexOf('\t', t1 + 1) : -1;
int t3 = t2 > 0 ? s.indexOf('\t', t2 + 1) : -1;
if (t3 < 0) {
// ps.print("<br><i>"+s+"</i>\n");
continue;
}
String port = t3 + 1 < len ? ":" + s.substring(t3 + 1, len) : "";
String host = t2 + 1 < t3 ? s.substring(t2 + 1, t3) : u.getHost();
ps.print("<dt><a href=\"gopher://" + host + port + "/"
+ s.substring(0, 1) + encodePercent(s.substring(t1 + 1, t2)) + "\">\n");
ps.print("<img align=middle border=0 width=25 height=32 src=");
switch (key) {
default:
ps.print(System.getProperty("java.net.ftp.imagepath.file"));
break;
case '0':
ps.print(System.getProperty("java.net.ftp.imagepath.text"));
break;
case '1':
ps.print(System.getProperty("java.net.ftp.imagepath.directory"));
break;
case 'g':
ps.print(System.getProperty("java.net.ftp.imagepath.gif"));
break;
}
ps.print(".gif align=middle><dd>\n");
ps.print(s.substring(1, t1) + "</a>\n");
}
ps.print("</dl></body>\n");
ps.close();
}
} catch (UnsupportedEncodingException e) {
throw new InternalError(encoding+ " encoding not found", e);
} catch (IOException e) {
} finally {
try {
closeServer();
os.close();
} catch (IOException e2) {
}
}
}
}
/** An input stream that does nothing more than hold on to the NetworkClient
that created it. This is used when only the input stream is needed, and
the network client needs to be closed when the input stream is closed. */
class GopherInputStream extends FilterInputStream {
NetworkClient parent;
GopherInputStream(NetworkClient o, InputStream fd) {
super(fd);
parent = o;
}
public void close() {
try {
parent.closeServer();
super.close();
} catch (IOException e) {
}
}
}
/*
* Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.net.www.protocol.gopher;
import java.io.*;
import java.util.*;
import sun.net.NetworkClient;
import java.net.URL;
import java.net.URLStreamHandler;
import java.net.Proxy;
import java.net.InetSocketAddress;
import java.net.SocketPermission;
import java.security.Permission;
import sun.net.www.protocol.http.HttpURLConnection;
/**
* A class to handle the gopher protocol.
*/
public class Handler extends java.net.URLStreamHandler {
protected int getDefaultPort() {
return 70;
}
public java.net.URLConnection openConnection(URL u)
throws IOException {
return openConnection(u, null);
}
public java.net.URLConnection openConnection(URL u, Proxy p)
throws IOException {
/* if set for proxy usage then go through the http code to get */
/* the url connection. */
if (p == null && GopherClient.getUseGopherProxy()) {
String host = GopherClient.getGopherProxyHost();
if (host != null) {
InetSocketAddress saddr = InetSocketAddress.createUnresolved(host, GopherClient.getGopherProxyPort());
p = new Proxy(Proxy.Type.HTTP, saddr);
}
}
if (p != null) {
return new HttpURLConnection(u, p);
}
return new GopherURLConnection(u);
}
}
class GopherURLConnection extends sun.net.www.URLConnection {
Permission permission;
GopherURLConnection(URL u) {
super(u);
}
public void connect() throws IOException {
}
public InputStream getInputStream() throws IOException {
return new GopherClient(this).openStream(url);
}
public Permission getPermission() {
if (permission == null) {
int port = url.getPort();
port = port < 0 ? 70 : port;
String host = url.getHost() + ":" + url.getPort();
permission = new SocketPermission(host, "connect");
}
return permission;
}
}
......@@ -322,10 +322,6 @@ public class Test {
test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
.s("ftp").h("ftp.is.co.za").p("/rfc/rfc1808.txt").z();
test("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles")
.s("gopher").h("spinaltap.micro.umn.edu")
.p("/00/Weather/California/Los%20Angeles").z();
test("http://www.math.uio.no/faq/compression-faq/part1.html")
.s("http").h("www.math.uio.no").p("/faq/compression-faq/part1.html").z();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册