diff --git a/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java b/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java index cc31d8fe1..fd9b5de26 100644 --- a/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java +++ b/src/main/java/dan200/computercraft/core/apis/HTTPAPI.java @@ -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 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; diff --git a/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java b/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java index c0525504b..c07259d89 100644 --- a/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java +++ b/src/main/java/dan200/computercraft/core/apis/HTTPRequest.java @@ -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 headers = m_responseHeaders = new HashMap(); + for (Map.Entry> header : connection.getHeaderFields().entrySet()) { + headers.put(header.getKey(), joiner.join( header.getValue() )); + } } } @@ -241,6 +259,12 @@ public int getResponseCode() { } } + public Map 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 m_responseHeaders; } diff --git a/src/main/resources/assets/computercraft/lua/bios.lua b/src/main/resources/assets/computercraft/lua/bios.lua index 7c4e44256..5b4a10f52 100644 --- a/src/main/resources/assets/computercraft/lua/bios.lua +++ b/src/main/resources/assets/computercraft/lua/bios.lua @@ -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 diff --git a/src/main/resources/assets/computercraft/lua/rom/help/changelog b/src/main/resources/assets/computercraft/lua/rom/help/changelog index ac4d31afa..fc7deb024 100644 --- a/src/main/resources/assets/computercraft/lua/rom/help/changelog +++ b/src/main/resources/assets/computercraft/lua/rom/help/changelog @@ -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 diff --git a/src/main/resources/assets/computercraft/lua/rom/help/http b/src/main/resources/assets/computercraft/lua/rom/help/http index 336496e26..12cba33dd 100644 --- a/src/main/resources/assets/computercraft/lua/rom/help/http +++ b/src/main/resources/assets/computercraft/lua/rom/help/http @@ -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. diff --git a/src/main/resources/assets/computercraft/lua/rom/help/whatsnew b/src/main/resources/assets/computercraft/lua/rom/help/whatsnew index f2bc57854..c39e2ef99 100644 --- a/src/main/resources/assets/computercraft/lua/rom/help/whatsnew +++ b/src/main/resources/assets/computercraft/lua/rom/help/whatsnew @@ -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.