gamnit: make `SpriteSet` public so clients can use its services
[nit.git] / lib / app / http_request.nit
index d4c28e5..8ab0f1d 100644 (file)
@@ -17,7 +17,7 @@ module http_request
 
 import app_base
 import pthreads
-import json::serialization
+import json
 
 import linux::http_request is conditional(linux)
 import android::http_request is conditional(android)
@@ -44,6 +44,8 @@ end
 # * `on_load`
 # * `on_fail`
 # * `after`
+#
+# See full example at `examples/http_request_example.nit`.
 abstract class AsyncHttpRequest
        super Thread
 
@@ -89,14 +91,15 @@ abstract class AsyncHttpRequest
                        if deserializer.errors.not_empty then
                                app.run_on_ui_thread new RestRunnableOnFail(self, deserializer.errors.first)
                        else
-                               app.run_on_ui_thread new RestRunnableOnLoad(self, res)
+                               app.run_on_ui_thread new RestRunnableOnLoad(self, res, rep.code)
                        end
                else
                        # Return text data
-                       app.run_on_ui_thread new RestRunnableOnLoad(self, rep.value)
+                       app.run_on_ui_thread new RestRunnableOnLoad(self, rep.value, rep.code)
                        return null
                end
 
+               app.run_on_ui_thread new RestRunnableJoin(self)
 
                return null
        end
@@ -110,7 +113,7 @@ abstract class AsyncHttpRequest
        # In this case, `result` may be any deserialized object.
        #
        # Otherwise, if `not deserialize_json`, `result` contains the content of the response as a `String`.
-       fun on_load(result: nullable Object) do end
+       fun on_load(result: nullable Object, http_status_code: Int) do end
 
        # Invoked when the HTTP request has failed and no data was received or deserialization failed
        fun on_fail(error: Error) do print_error "HTTP request '{uri}' failed with: {error}"
@@ -119,6 +122,23 @@ abstract class AsyncHttpRequest
        fun after do end
 end
 
+# Minimal implementation of `AsyncHttpRequest` where `uri` is an attribute
+#
+# Prints on communication errors and when the server returns an HTTP status code not in the 200s.
+#
+# ~~~nitish
+# var request = new SimpleAsyncHttpRequest("http://example.com")
+# request.start
+# ~~~
+class SimpleAsyncHttpRequest
+       super AsyncHttpRequest
+
+       redef var uri
+
+       redef fun on_load(data, status) do if status < 200 or status >= 299
+       then print_error "HTTP request '{uri}' received HTTP status code: {status}"
+end
+
 redef class Text
        # Execute an HTTP GET request synchronously at the URI `self`
        #
@@ -163,9 +183,11 @@ private class RestRunnableOnLoad
 
        var res: nullable Object
 
+       var code: Int
+
        redef fun main
        do
-               sender_thread.on_load(res)
+               sender_thread.on_load(res, code)
                sender_thread.after
        end
 end
@@ -181,3 +203,9 @@ private class RestRunnableOnFail
                sender_thread.after
        end
 end
+
+private class RestRunnableJoin
+       super HttpRequestTask
+
+       redef fun main do sender_thread.join
+end