Merge pull request #159 from SquidDev-CC/feature/http-extensions
Various extensions to the HTTP API
This commit is contained in:
commit
1b562ae837
|
@ -52,12 +52,16 @@ public void advance( double _dt )
|
||||||
if( h.wasSuccessful() ) {
|
if( h.wasSuccessful() ) {
|
||||||
// Queue the "http_success" event
|
// Queue the "http_success" event
|
||||||
final BufferedReader contents = h.getContents();
|
final BufferedReader contents = h.getContents();
|
||||||
final int responseCode = h.getResponseCode();
|
final Object result = wrapBufferedReader( contents, h.getResponseCode(), h.getResponseHeaders() );
|
||||||
final Object result = wrapBufferedReader( contents, responseCode );
|
|
||||||
m_apiEnvironment.queueEvent( "http_success", new Object[] { url, result } );
|
m_apiEnvironment.queueEvent( "http_success", new Object[] { url, result } );
|
||||||
} else {
|
} else {
|
||||||
// Queue the "http_failure" event
|
// Queue the "http_failure" event
|
||||||
m_apiEnvironment.queueEvent( "http_failure", new Object[] { url, "Could not connect" } );
|
BufferedReader contents = h.getContents();
|
||||||
|
Object result = null;
|
||||||
|
if( contents != null ) {
|
||||||
|
result = wrapBufferedReader( contents, h.getResponseCode(), h.getResponseHeaders() );
|
||||||
|
}
|
||||||
|
m_apiEnvironment.queueEvent( "http_failure", new Object[]{ url, "Could not connect", result } );
|
||||||
}
|
}
|
||||||
it.remove();
|
it.remove();
|
||||||
}
|
}
|
||||||
|
@ -65,7 +69,7 @@ public void advance( double _dt )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ILuaObject wrapBufferedReader( final BufferedReader reader, final int responseCode )
|
private static ILuaObject wrapBufferedReader( final BufferedReader reader, final int responseCode, final Map<String, String> responseHeaders )
|
||||||
{
|
{
|
||||||
return new ILuaObject() {
|
return new ILuaObject() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -75,7 +79,8 @@ public String[] getMethodNames()
|
||||||
"readLine",
|
"readLine",
|
||||||
"readAll",
|
"readAll",
|
||||||
"close",
|
"close",
|
||||||
"getResponseCode"
|
"getResponseCode",
|
||||||
|
"getResponseHeaders",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +136,11 @@ public Object[] callMethod( ILuaContext context, int method, Object[] args ) thr
|
||||||
// getResponseCode
|
// getResponseCode
|
||||||
return new Object[] { responseCode };
|
return new Object[] { responseCode };
|
||||||
}
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
// getResponseHeaders
|
||||||
|
return new Object[] { responseHeaders };
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -6,12 +6,15 @@
|
||||||
|
|
||||||
package dan200.computercraft.core.apis;
|
package dan200.computercraft.core.apis;
|
||||||
|
|
||||||
|
import com.google.common.base.Joiner;
|
||||||
import dan200.computercraft.ComputerCraft;
|
import dan200.computercraft.ComputerCraft;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
@ -130,7 +133,16 @@ public void run()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read response
|
// Read response
|
||||||
InputStream is = connection.getInputStream();
|
InputStream is;
|
||||||
|
int code = connection.getResponseCode();
|
||||||
|
boolean responseSuccess;
|
||||||
|
if (code >= 200 && code < 400) {
|
||||||
|
is = connection.getInputStream();
|
||||||
|
responseSuccess = true;
|
||||||
|
} else {
|
||||||
|
is = connection.getErrorStream();
|
||||||
|
responseSuccess = false;
|
||||||
|
}
|
||||||
InputStreamReader isr;
|
InputStreamReader isr;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -192,9 +204,15 @@ public void run()
|
||||||
{
|
{
|
||||||
// We completed
|
// We completed
|
||||||
m_complete = true;
|
m_complete = true;
|
||||||
m_success = true;
|
m_success = responseSuccess;
|
||||||
m_result = result.toString();
|
m_result = result.toString();
|
||||||
m_responseCode = connection.getResponseCode();
|
m_responseCode = connection.getResponseCode();
|
||||||
|
|
||||||
|
Joiner joiner = Joiner.on( ',' );
|
||||||
|
Map<String, String> headers = m_responseHeaders = new HashMap<String, String>();
|
||||||
|
for (Map.Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
|
||||||
|
headers.put(header.getKey(), joiner.join( header.getValue() ));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,6 +259,12 @@ public int getResponseCode() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getResponseHeaders() {
|
||||||
|
synchronized (m_lock) {
|
||||||
|
return m_responseHeaders;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean wasSuccessful()
|
public boolean wasSuccessful()
|
||||||
{
|
{
|
||||||
synchronized(m_lock) {
|
synchronized(m_lock) {
|
||||||
|
@ -270,4 +294,5 @@ public BufferedReader getContents()
|
||||||
private boolean m_success;
|
private boolean m_success;
|
||||||
private String m_result;
|
private String m_result;
|
||||||
private int m_responseCode;
|
private int m_responseCode;
|
||||||
|
private Map<String, String> m_responseHeaders;
|
||||||
}
|
}
|
||||||
|
|
|
@ -643,11 +643,11 @@ if http then
|
||||||
local ok, err = nativeHTTPRequest( _url, _post, _headers )
|
local ok, err = nativeHTTPRequest( _url, _post, _headers )
|
||||||
if ok then
|
if ok then
|
||||||
while true do
|
while true do
|
||||||
local event, param1, param2 = os.pullEvent()
|
local event, param1, param2, param3 = os.pullEvent()
|
||||||
if event == "http_success" and param1 == _url then
|
if event == "http_success" and param1 == _url then
|
||||||
return param2
|
return param2
|
||||||
elseif event == "http_failure" and param1 == _url then
|
elseif event == "http_failure" and param1 == _url then
|
||||||
return nil, param2
|
return nil, param2, param3
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
New Features in ComputerCraft 1.80:
|
||||||
|
|
||||||
|
* Added .getResponseHeaders() to HTTP responses.
|
||||||
|
* Return a HTTP response when a HTTP error occurs.
|
||||||
|
|
||||||
New Features in ComputerCraft 1.79:
|
New Features in ComputerCraft 1.79:
|
||||||
|
|
||||||
* Ported ComputerCraftEdu to Minecraft 1.8.9
|
* Ported ComputerCraftEdu to Minecraft 1.8.9
|
||||||
|
|
|
@ -5,4 +5,4 @@ http.get( url, [headers] )
|
||||||
http.post( url, postData, [headers] )
|
http.post( url, postData, [headers] )
|
||||||
|
|
||||||
The HTTP API may be disabled in ComputerCraft.cfg
|
The HTTP API may be disabled in ComputerCraft.cfg
|
||||||
A period of time after a http.request() call is made, a "http_success" or "http_failure" event will be raised. Arguments are the url and a file handle if successful. http.get() and http.post() block until this event fires instead.
|
A period of time after a http.request() call is made, a "http_success" or "http_failure" event will be raised. Arguments are the url and a file handle if successful. Arguments are nil, an error message, and (optionally) a file handle if the request failed. http.get() and http.post() block until this event fires instead.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
New Features in ComputerCraft 1.79:
|
New Features in ComputerCraft 1.80:
|
||||||
|
|
||||||
* Ported ComputerCraftEdu to Minecraft 1.8.9
|
* Added .getResponseHeaders() to HTTP responses.
|
||||||
* Fixed a handful of bugs in ComputerCraft
|
* Return a HTTP response when a HTTP error occurs.
|
||||||
|
|
||||||
Type "help changelog" to see the full version history.
|
Type "help changelog" to see the full version history.
|
||||||
|
|
Loading…
Reference in New Issue