📄 magneturihandlerimpl.java
字号:
/*
* Created on 03-Mar-2005
* Created by Paul Gardner
* Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program 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 for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package com.aelitis.net.magneturi.impl;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.*;
import javax.imageio.ImageIO;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.util.*;
import com.aelitis.net.magneturi.MagnetURIHandler;
import com.aelitis.net.magneturi.MagnetURIHandlerListener;
import com.aelitis.net.magneturi.MagnetURIHandlerProgressListener;
/**
* @author parg
*
*/
public class
MagnetURIHandlerImpl
extends MagnetURIHandler
{
private static final LogIDs LOGID = LogIDs.NET;
// see http://magnet-uri.sourceforge.net/magnet-draft-overview.txt
private static MagnetURIHandlerImpl singleton;
private static AEMonitor class_mon = new AEMonitor( "MagnetURLHandler:class" );
private static final int DOWNLOAD_TIMEOUT = 3*60*1000;
protected static final String NL = "\015\012";
public static MagnetURIHandler
getSingleton()
{
try{
class_mon.enter();
if ( singleton == null ){
singleton = new MagnetURIHandlerImpl();
}
return( singleton );
}finally{
class_mon.exit();
}
}
private int port;
private List listeners = new ArrayList();
private Map info_map = new HashMap();
protected
MagnetURIHandlerImpl()
{
ServerSocket socket = null;
for (int i=45100;i<=45199;i++){
try{
socket = new ServerSocket(i, 50, InetAddress.getByName("127.0.0.1"));
port = i;
break;
}catch( Throwable e ){
}
}
if ( socket == null ){
// no free sockets, not much we can do
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, LogEvent.LT_ERROR,
"MagnetURI: no free sockets, giving up"));
}else{
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "MagnetURI: bound on "
+ socket.getLocalPort()));
final ServerSocket f_socket = socket;
Thread t =
new AEThread("MagnetURIHandler")
{
public void
runSupport()
{
int errors = 0;
int ok = 0;
while(true){
try{
final Socket sck = f_socket.accept();
ok++;
errors = 0;
Thread t =
new AEThread( "MagnetURIHandler:processor" )
{
public void
runSupport()
{
boolean close_socket = true;
try{
String address = sck.getInetAddress().getHostAddress();
if ( address.equals("localhost") || address.equals("127.0.0.1")) {
BufferedReader br = new BufferedReader(new InputStreamReader(sck.getInputStream(),Constants.DEFAULT_ENCODING));
String line = br.readLine();
if ( line != null ){
if ( line.toUpperCase().startsWith( "GET " )){
Logger.log(new LogEvent(LOGID,
"MagnetURIHandler: processing '" + line + "'"));
line = line.substring(4);
int pos = line.lastIndexOf(' ');
line = line.substring( 0, pos );
close_socket = process( line, sck.getOutputStream() );
}else{
Logger.log(new LogEvent(LOGID, LogEvent.LT_WARNING,
"MagnetURIHandler: invalid command - '" + line
+ "'"));
}
}else{
Logger.log(new LogEvent(LOGID, LogEvent.LT_WARNING,
"MagnetURIHandler: connect from "
+ "'" + address + "': no data read"));
}
}else{
Logger.log(new LogEvent(LOGID, LogEvent.LT_WARNING,
"MagnetURIHandler: connect from "
+ "invalid address '" + address + "'"));
}
}catch( Throwable e ){
if ( !(e instanceof IOException || e instanceof SocketException )){
Debug.printStackTrace(e);
}
}finally{
try{
// leave client to close socket if not requested
if ( close_socket ){
sck.close();
}
}catch( Throwable e ){
}
}
}
};
t.setDaemon( true );
t.start();
}catch( Throwable e ){
Debug.printStackTrace(e);
errors++;
if ( errors > 100 ){
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID,
"MagnetURIHandler: bailing out, too many socket errors"));
}
}
}
}
};
t.setDaemon( true );
t.start();
}
}
protected boolean
process(
String get,
OutputStream os )
throws IOException
{
//System.out.println( "get = " + get );
// magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C
Map params = new HashMap();
List source_params = new ArrayList();
int pos = get.indexOf( '?' );
if ( pos != -1 ){
StringTokenizer tok = new StringTokenizer( get.substring( pos+1 ), "&" );
while( tok.hasMoreTokens()){
String arg = tok.nextToken();
pos = arg.indexOf( '=' );
if ( pos == -1 ){
params.put( arg.trim(), "" );
}else{
try{
String lhs = arg.substring( 0, pos ).trim();
String rhs = URLDecoder.decode( arg.substring( pos+1 ).trim(), Constants.DEFAULT_ENCODING);
params.put( lhs, rhs );
if ( lhs.equalsIgnoreCase( "xsource" )){
source_params.add( rhs );
}
}catch( UnsupportedEncodingException e ){
Debug.printStackTrace( e );
}
}
}
}
if ( get.startsWith( "/magnet10/badge.img" )){
for (int i=0;i<listeners.size();i++){
byte[] data = ((MagnetURIHandlerListener)listeners.get(i)).badge();
if ( data != null ){
writeReply( os, "image/gif", data );
return( true );
}
}
writeNotFound( os );
return( true );
}else if ( get.startsWith( "/magnet10/canHandle.img?" )){
String urn = (String)params.get( "xt" );
if ( urn != null && urn.startsWith( "urn:btih:")){
for (int i=0;i<listeners.size();i++){
byte[] data = ((MagnetURIHandlerListener)listeners.get(i)).badge();
if ( data != null ){
writeReply( os, "image/gif", data );
return( true );
}
}
}
writeNotFound( os );
return( true );
}else if ( get.startsWith( "/azversion" )){
writeReply( os, "text/plain", Constants.AZUREUS_VERSION );
return( true );
}else if ( get.startsWith( "/magnet10/options.js?" ) ||
get.startsWith( "/magnet10/default.js?" )){
String resp = "";
resp += getJS( "magnetOptionsPreamble" );
resp += getJSS( "<a href=\\\"http://127.0.0.1:\"+(45100+magnetCurrentSlot)+\"/select/?\"+magnetQueryString+\"\\\" target=\\\"_blank\\\">" );
resp += getJSS( "<img src=\\\"http://127.0.0.1:\"+(45100+magnetCurrentSlot)+\"/magnet10/badge.img\\\">" );
resp += getJSS( "Download with Azureus" );
resp += getJSS( "</a>" );
resp += getJS( "magnetOptionsPostamble" );
resp += "magnetOptionsPollSuccesses++";
writeReply( os, "application/x-javascript", resp );
return( true );
}else if ( get.startsWith( "/magnet10/pause" )){
try{
Thread.sleep( 250 );
}catch( Throwable e ){
}
writeNotFound( os );
return( true );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -