From b3991c25ba493979c5c6af0155f9f477d59bc135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 31 May 2014 16:46:04 +0200 Subject: [PATCH] Fixed http request persistence. Fixed repeated userdata persistence. Fixed internet.request not blocking when no data was available. --- .../lua/component/internet/lib/internet.lua | 17 ++++++++++++----- .../assets/opencomputers/lua/kernel.lua | 13 +++++++++---- .../cil/oc/server/component/InternetCard.scala | 6 ++++-- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/main/resources/assets/opencomputers/lua/component/internet/lib/internet.lua b/src/main/resources/assets/opencomputers/lua/component/internet/lib/internet.lua index 5fdd6f87b..94a386919 100644 --- a/src/main/resources/assets/opencomputers/lua/component/internet/lib/internet.lua +++ b/src/main/resources/assets/opencomputers/lua/component/internet/lib/internet.lua @@ -31,11 +31,18 @@ function internet.request(url, data) end return function() - local data, reason = result.read() - if not data and reason then - error(reason, 2) - else - return data + while true do + local data, reason = result.read() + if not data then + if reason then + error(reason, 2) + else + return nil -- eof + end + elseif #data > 0 then + return data + end + -- else: no data, block end end end diff --git a/src/main/resources/assets/opencomputers/lua/kernel.lua b/src/main/resources/assets/opencomputers/lua/kernel.lua index 15373d6f2..13967684e 100644 --- a/src/main/resources/assets/opencomputers/lua/kernel.lua +++ b/src/main/resources/assets/opencomputers/lua/kernel.lua @@ -244,17 +244,22 @@ sandbox._G = sandbox -- wrap and isolate it, to make sure it can't be touched by user code. -- These functions provide the logic for wrapping and unwrapping (when -- pushed to user code and when pushed back to the host, respectively). -local wrapUserdata, wrapSingleUserdata, unwrapUserdata -local wrappedUserdata = setmetatable({}, { +local wrapUserdata, wrapSingleUserdata, unwrapUserdata, wrappedUserdataMeta +wrappedUserdataMeta = { -- Weak keys, clean up once a proxy is no longer referenced anywhere. __mode="k", -- We need custom persist logic here to avoid ERIS trying to save the -- userdata referenced in this table directly. It will be repopulated -- in the load methods of the persisted userdata wrappers (see below). __persist = function() - return function() return {} end + return function() + -- When using special persistence we have to manually reassign the + -- metatable of the persisted value. + return setmetatable({}, wrappedUserdataMeta) + end end -}) +} +local wrappedUserdata = setmetatable({}, wrappedUserdataMeta) local function processArguments(...) local args = table.pack(...) diff --git a/src/main/scala/li/cil/oc/server/component/InternetCard.scala b/src/main/scala/li/cil/oc/server/component/InternetCard.scala index 8b47a83b4..12b5d49a0 100644 --- a/src/main/scala/li/cil/oc/server/component/InternetCard.scala +++ b/src/main/scala/li/cil/oc/server/component/InternetCard.scala @@ -269,14 +269,16 @@ object InternetCard { } } - class Request(val owner: Option[InternetCard] = None) extends AbstractValue { + class Request extends AbstractValue { + private var owner: Option[InternetCard] = None private var url: URL = null private var post: Option[String] = None private var data: Option[Array[Byte]] = None private var error: Option[String] = None def this(owner: InternetCard, url: URL, post: Option[String]) { - this(Option(owner)) + this() + this.owner = Option(owner) this.url = url this.post = post scheduleRequest()