Merge pull request #159 from SquidDev-CC/feature/http-extensions

Various extensions to the HTTP API
This commit is contained in:
Daniel Ratcliffe 2017-05-01 18:11:21 +01:00 committed by GitHub
commit 1b562ae837
6 changed files with 53 additions and 13 deletions

View File

@ -52,12 +52,16 @@ public void advance( double _dt )
if( h.wasSuccessful() ) {
// Queue the "http_success" event
final BufferedReader contents = h.getContents();
final int responseCode = h.getResponseCode();
final Object result = wrapBufferedReader( contents, responseCode );
final Object result = wrapBufferedReader( contents, h.getResponseCode(), h.getResponseHeaders() );
m_apiEnvironment.queueEvent( "http_success", new Object[] { url, result } );
} else {
// 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();
}
@ -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() {
@Override
@ -75,7 +79,8 @@ public String[] getMethodNames()
"readLine",
"readAll",
"close",
"getResponseCode"
"getResponseCode",
"getResponseHeaders",
};
}
@ -131,6 +136,11 @@ public Object[] callMethod( ILuaContext context, int method, Object[] args ) thr
// getResponseCode
return new Object[] { responseCode };
}
case 4:
{
// getResponseHeaders
return new Object[] { responseHeaders };
}
default:
{
return null;

View File

@ -6,12 +6,15 @@
package dan200.computercraft.core.apis;
import com.google.common.base.Joiner;
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;
import java.util.regex.Pattern;
@ -130,7 +133,16 @@ public void run()
}
// 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;
try
{
@ -192,9 +204,15 @@ public void run()
{
// We completed
m_complete = true;
m_success = true;
m_success = responseSuccess;
m_result = result.toString();
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()
{
synchronized(m_lock) {
@ -270,4 +294,5 @@ public BufferedReader getContents()
private boolean m_success;
private String m_result;
private int m_responseCode;
private Map<String, String> m_responseHeaders;
}

View File

@ -643,11 +643,11 @@ if http then
local ok, err = nativeHTTPRequest( _url, _post, _headers )
if ok then
while true do
local event, param1, param2 = os.pullEvent()
local event, param1, param2, param3 = os.pullEvent()
if event == "http_success" and param1 == _url then
return param2
elseif event == "http_failure" and param1 == _url then
return nil, param2
return nil, param2, param3
end
end
end

View File

@ -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:
* Ported ComputerCraftEdu to Minecraft 1.8.9

View File

@ -5,4 +5,4 @@ http.get( url, [headers] )
http.post( url, postData, [headers] )
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.

View File

@ -1,6 +1,6 @@
New Features in ComputerCraft 1.79:
New Features in ComputerCraft 1.80:
* Ported ComputerCraftEdu to Minecraft 1.8.9
* Fixed a handful of bugs in ComputerCraft
* Added .getResponseHeaders() to HTTP responses.
* Return a HTTP response when a HTTP error occurs.
Type "help changelog" to see the full version history.