diff --git a/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java b/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java index 8fd82d4ee..651346139 100644 --- a/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java +++ b/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java @@ -9,10 +9,7 @@ package dan200.computercraft.core.apis; import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; -import dan200.computercraft.core.apis.http.HTTPCheck; -import dan200.computercraft.core.apis.http.HTTPExecutor; -import dan200.computercraft.core.apis.http.HTTPRequest; -import dan200.computercraft.core.apis.http.WebsocketConnector; +import dan200.computercraft.core.apis.http.*; import javax.annotation.Nonnull; import java.io.Closeable; @@ -53,7 +50,7 @@ public class HTTPAPI implements ILuaAPI @Override public void advance( double _dt ) { - // Wait for all of our http requests + // Wait for all of our http requests synchronized( m_httpTasks ) { Iterator> it = m_httpTasks.iterator(); @@ -64,7 +61,7 @@ public class HTTPAPI implements ILuaAPI } } } - + @Override public void shutdown( ) { @@ -132,7 +129,7 @@ public class HTTPAPI implements ILuaAPI } } } - + // Get binary boolean binary = false; if( args.length >= 4 ) @@ -167,7 +164,7 @@ public class HTTPAPI implements ILuaAPI { URL url = HTTPRequest.checkURL( urlString ); HTTPCheck check = new HTTPCheck( m_apiEnvironment, urlString, url ); - synchronized( m_httpTasks ) + synchronized( m_httpTasks ) { m_httpTasks.add( HTTPExecutor.EXECUTOR.submit( check ) ); } diff --git a/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java b/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java deleted file mode 100644 index bfc94d767..000000000 --- a/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * This file is part of ComputerCraft - http://www.computercraft.info - * Copyright Daniel Ratcliffe, 2011-2017. Do not distribute without permission. - * Send enquiries to dratcliffe@gmail.com - */ - -package dan200.computercraft.core.apis; - -import com.google.common.base.Joiner; -import com.google.common.io.ByteStreams; -import dan200.computercraft.ComputerCraft; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class HTTPRequest -{ - public static URL checkURL( String urlString ) throws HTTPRequestException - { - URL url; - try - { - url = new URL( urlString ); - } - catch( MalformedURLException e ) - { - throw new HTTPRequestException( "URL malformed" ); - } - - // Validate the URL - String protocol = url.getProtocol().toLowerCase(); - if( !protocol.equals("http") && !protocol.equals("https") ) - { - throw new HTTPRequestException( "URL not http" ); - } - - // Compare the URL to the whitelist - if( !ComputerCraft.http_whitelist.matches( url.getHost() ) || ComputerCraft.http_blacklist.matches( url.getHost() ) ) - { - throw new HTTPRequestException( "Domain not permitted" ); - } - - return url; - } - - public HTTPRequest( String url, final String postText, final Map headers, boolean binary ) throws HTTPRequestException - { - // Parse the URL - m_urlString = url; - m_url = checkURL( m_urlString ); - m_binary = binary; - - // Start the thread - m_cancelled = false; - m_complete = false; - m_success = false; - m_result = null; - m_responseCode = -1; - - Thread thread = new Thread( () -> - { - try - { - // Connect to the URL - HttpURLConnection connection = (HttpURLConnection)m_url.openConnection(); - - if( postText != null ) - { - connection.setRequestMethod( "POST" ); - connection.setDoOutput( true ); - } - else - { - connection.setRequestMethod( "GET" ); - } - - // Set headers - connection.setRequestProperty( "accept-charset", "UTF-8" ); - if( postText != null ) - { - connection.setRequestProperty( "content-type", "application/x-www-form-urlencoded; charset=utf-8" ); - connection.setRequestProperty( "content-encoding", "UTF-8" ); - } - if( headers != null ) - { - for( Map.Entry header : headers.entrySet() ) - { - connection.setRequestProperty( header.getKey(), header.getValue() ); - } - } - - // Send POST text - if( postText != null ) - { - OutputStream os = connection.getOutputStream(); - OutputStreamWriter osw; - try - { - osw = new OutputStreamWriter( os, "UTF-8" ); - } - catch( UnsupportedEncodingException e ) - { - osw = new OutputStreamWriter( os ); - } - BufferedWriter writer = new BufferedWriter( osw ); - writer.write( postText, 0, postText.length() ); - writer.close(); - } - - // Read response - InputStream is; - int code = connection.getResponseCode(); - boolean responseSuccess; - if (code >= 200 && code < 400) { - is = connection.getInputStream(); - responseSuccess = true; - } else { - is = connection.getErrorStream(); - responseSuccess = false; - } - - byte[] result = ByteStreams.toByteArray( is ); - is.close(); - - synchronized( m_lock ) - { - if( m_cancelled ) - { - // We cancelled - m_complete = true; - m_success = false; - m_result = null; - } - else - { - // We completed - m_complete = true; - m_success = responseSuccess; - m_result = result; - m_responseCode = connection.getResponseCode(); - m_encoding = connection.getContentEncoding(); - - Joiner joiner = Joiner.on( ',' ); - Map headers1 = m_responseHeaders = new HashMap<>(); - for (Map.Entry> header : connection.getHeaderFields().entrySet()) { - headers1.put(header.getKey(), joiner.join( header.getValue() )); - } - } - } - - connection.disconnect(); // disconnect - - } - catch( IOException e ) - { - synchronized( m_lock ) - { - // There was an error - m_complete = true; - m_success = false; - m_result = null; - } - } - } ); - thread.setDaemon(true); - thread.start(); - } - - public String getURL() { - return m_urlString; - } - - public void cancel() - { - synchronized(m_lock) { - m_cancelled = true; - } - } - - public boolean isComplete() - { - synchronized(m_lock) { - return m_complete; - } - } - - public int getResponseCode() { - synchronized(m_lock) { - return m_responseCode; - } - } - - public Map getResponseHeaders() { - synchronized (m_lock) { - return m_responseHeaders; - } - } - - public boolean wasSuccessful() - { - synchronized(m_lock) { - return m_success; - } - } - - public boolean isBinary() - { - return m_binary; - } - - public InputStream getContents() - { - byte[] result; - synchronized(m_lock) { - result = m_result; - } - - if( result != null ) { - return new ByteArrayInputStream( result ); - } - return null; - } - - public String getEncoding() { - return m_encoding; - } - - private final Object m_lock = new Object(); - private final URL m_url; - private final String m_urlString; - - private boolean m_complete; - private boolean m_cancelled; - private boolean m_success; - private String m_encoding; - private byte[] m_result; - private boolean m_binary; - private int m_responseCode; - private Map m_responseHeaders; -} diff --git a/src/main/java/dan200/computercraft/core/apis/http/HTTPCheck.java b/src/main/java/dan200/computercraft/core/apis/http/HTTPCheck.java index 401d11e95..52e25432a 100644 --- a/src/main/java/dan200/computercraft/core/apis/http/HTTPCheck.java +++ b/src/main/java/dan200/computercraft/core/apis/http/HTTPCheck.java @@ -1,6 +1,5 @@ package dan200.computercraft.core.apis.http; -import dan200.computercraft.core.apis.HTTPRequestException; import dan200.computercraft.core.apis.IAPIEnvironment; import java.net.URL; diff --git a/src/main/java/dan200/computercraft/core/apis/http/HTTPRequest.java b/src/main/java/dan200/computercraft/core/apis/http/HTTPRequest.java index 28f41c362..a5f205110 100644 --- a/src/main/java/dan200/computercraft/core/apis/http/HTTPRequest.java +++ b/src/main/java/dan200/computercraft/core/apis/http/HTTPRequest.java @@ -12,7 +12,6 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.ILuaObject; import dan200.computercraft.api.lua.LuaException; -import dan200.computercraft.core.apis.HTTPRequestException; import dan200.computercraft.core.apis.IAPIEnvironment; import dan200.computercraft.core.apis.handles.BinaryInputHandle; import dan200.computercraft.core.apis.handles.EncodedInputHandle; diff --git a/src/main/java/dan200/computercraft/core/apis/HTTPRequestException.java b/src/main/java/dan200/computercraft/core/apis/http/HTTPRequestException.java similarity index 82% rename from src/main/java/dan200/computercraft/core/apis/HTTPRequestException.java rename to src/main/java/dan200/computercraft/core/apis/http/HTTPRequestException.java index d7832bdf1..063f4359d 100644 --- a/src/main/java/dan200/computercraft/core/apis/HTTPRequestException.java +++ b/src/main/java/dan200/computercraft/core/apis/http/HTTPRequestException.java @@ -1,4 +1,4 @@ -package dan200.computercraft.core.apis; +package dan200.computercraft.core.apis.http; public class HTTPRequestException extends Exception { diff --git a/src/main/java/dan200/computercraft/core/apis/http/WebsocketConnector.java b/src/main/java/dan200/computercraft/core/apis/http/WebsocketConnector.java index 16f8a50ea..0d1ecd92b 100644 --- a/src/main/java/dan200/computercraft/core/apis/http/WebsocketConnector.java +++ b/src/main/java/dan200/computercraft/core/apis/http/WebsocketConnector.java @@ -8,7 +8,6 @@ package dan200.computercraft.core.apis.http; import dan200.computercraft.ComputerCraft; import dan200.computercraft.core.apis.HTTPAPI; -import dan200.computercraft.core.apis.HTTPRequestException; import dan200.computercraft.core.apis.IAPIEnvironment; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelInitializer;