diff options
-rw-r--r-- | 091socket.cc | 10 | ||||
-rw-r--r-- | 092socket.mu | 12 |
2 files changed, 16 insertions, 6 deletions
diff --git a/091socket.cc b/091socket.cc index 4ea0d2b6..2aebbed8 100644 --- a/091socket.cc +++ b/091socket.cc @@ -321,6 +321,14 @@ case _CLOSE_SOCKET: { raise << maybe(get(Recipe, r).name) << "first ingredient of '$close-socket' should be a number, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end(); break; } + if (SIZE(inst.products) != 1) { + raise << maybe(get(Recipe, r).name) << "'$close-socket' requires exactly one product, but got '" << inst.original_string << "'\n" << end(); + break; + } + if (inst.products.at(0).name != inst.ingredients.at(0).name) { + raise << maybe(get(Recipe, r).name) << "product of '$close-socket' must be first ingredient '" << inst.ingredients.at(0).original_string << "', but got '" << inst.products.at(0).original_string << "'\n" << end(); + break; + } break; } :(before "End Primitive Recipe Implementations") @@ -329,6 +337,8 @@ case _CLOSE_SOCKET: { socket_t* socket = reinterpret_cast<socket_t*>(x); close(socket->fd); delete socket; + products.resize(1); + products.at(0).push_back(0); // make sure we can't reuse the socket break; } diff --git a/092socket.mu b/092socket.mu index 57c8120d..803c6557 100644 --- a/092socket.mu +++ b/092socket.mu @@ -20,7 +20,7 @@ F - example-server-test: $open-server-socket failed] memory-should-contain [ 10:array:character <- [abc] ] - $close-socket socket + socket <- $close-socket socket ] # helper just for this scenario def example-handler query:text -> response:text [ @@ -52,7 +52,7 @@ scenario example-client-test [ type request-handler = (recipe text -> text) -def serve-one-request socket:num, request-handler:request-handler [ +def serve-one-request socket:num, request-handler:request-handler -> socket:num [ local-scope load-ingredients session:num <- $accept socket @@ -63,7 +63,7 @@ F - example-server-test: $accept failed] query:text <- drain contents response:text <- call request-handler, query write-to-socket session, response - $close-socket session + session <- $close-socket session ] def start-reading-from-network resources:&:resources, uri:text -> contents:&:source:char [ @@ -101,7 +101,7 @@ def request-socket socket:num, s:text -> socket:num [ $write-to-socket socket, 10/lf ] -def receive-from-socket socket:num, sink:&:sink:char -> sink:&:sink:char [ +def receive-from-socket socket:num, sink:&:sink:char -> sink:&:sink:char, socket:num [ local-scope load-ingredients { @@ -128,11 +128,11 @@ def receive-from-socket socket:num, sink:&:sink:char -> sink:&:sink:char [ sink <- close sink ] -def receive-from-client-socket-and-close socket:num, sink:&:sink:char -> sink:&:sink:char [ +def receive-from-client-socket-and-close socket:num, sink:&:sink:char -> sink:&:sink:char, socket:num [ local-scope load-ingredients sink <- receive-from-socket socket, sink - $close-socket socket + socket <- $close-socket socket ] def write-to-socket socket:num, s:text [ |