diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-10-20 00:37:24 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-10-20 00:37:24 -0700 |
commit | d059fe743df6a5e8a72fc1418f2c3ba1ed5ac1e6 (patch) | |
tree | a532d18a9993d429dfdcba2b87bc9e8897a8a6c2 /html/092socket.mu.html | |
parent | f24eeaab13d12b87bb219cb42861c5fe7d091053 (diff) | |
download | mu-d059fe743df6a5e8a72fc1418f2c3ba1ed5ac1e6.tar.gz |
3524
Diffstat (limited to 'html/092socket.mu.html')
-rw-r--r-- | html/092socket.mu.html | 89 |
1 files changed, 85 insertions, 4 deletions
diff --git a/html/092socket.mu.html b/html/092socket.mu.html index 197e72cb..062217fe 100644 --- a/html/092socket.mu.html +++ b/html/092socket.mu.html @@ -19,6 +19,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #c00000; } +.CommentedCode { color: #6c6c6c; } .muRecipe { color: #ff8700; } .muScenario { color: #00af00; } --> @@ -47,11 +48,11 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Comment"># `start-reading-socket` and `start-writing-socket`, add port-connections to</span> <span class="Comment"># the local-network.</span> <span class="Comment">#</span> -<span class="Comment"># For reading, `transmit-from-socket` will check for a</span> +<span class="Comment"># For reading, `receive-from-socket` will check for a</span> <span class="Comment"># port-connection on the port parameter that's been passed in. If there's</span> -<span class="Comment"># no port-connectin for that port, it will return nothing and log. If</span> -<span class="Comment"># there is a port-connection for that port, it will transmit the contents</span> -<span class="Comment"># to the passed in sink.</span> +<span class="Comment"># no port-connection for that port, it will return nothing and log an error.</span> +<span class="Comment"># If there is a port-connection for that port, it will transmit the contents</span> +<span class="Comment"># to the provided sink.</span> <span class="Comment">#</span> <span class="Comment"># For writing, `start-writing-socket` returns a sink connecting the</span> <span class="Comment"># caller to the socket on the passed-in port.</span> @@ -91,6 +92,51 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color ] ] +<span class="muRecipe">def</span> start-reading-from-network resources:&:resources, host:text, path:text<span class="muRecipe"> -> </span>contents:&:source:char [ + <span class="Constant">local-scope</span> + <span class="Constant">load-ingredients</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> resources + <span class="Comment"># real network</span> + socket:num<span class="Special"> <- </span>$open-client-socket host, <span class="Constant">80/http-port</span> + assert socket, <span class="Constant">[contents]</span> + req:text<span class="Special"> <- </span>interpolate <span class="Constant">[GET _ HTTP/1.1]</span>, path + request-socket socket, req + contents:&:source:char, sink:&:sink:char<span class="Special"> <- </span>new-channel <span class="Constant">10000</span> + start-running receive-from-socket socket, sink + <span class="muControl">return</span> + <span class="Delimiter">}</span> + <span class="Comment"># fake network</span> +<span class="CommentedCode">#? i:num <- copy 0</span> +<span class="CommentedCode">#? data:&:@:resource <- get *fs, data:offset</span> +<span class="CommentedCode">#? len:num <- length *data</span> +<span class="CommentedCode">#? {</span> +<span class="CommentedCode">#? done?:bool <- greater-or-equal i, len</span> +<span class="CommentedCode">#? break-if done?</span> +<span class="CommentedCode">#? tmp:resource <- index *data, i</span> +<span class="CommentedCode">#? i <- add i, 1</span> +<span class="CommentedCode">#? curr-filename:text <- get tmp, name:offset</span> +<span class="CommentedCode">#? found?:bool <- equal filename, curr-filename</span> +<span class="CommentedCode">#? loop-unless found?</span> +<span class="CommentedCode">#? contents:&:source:char, sink:&:sink:char <- new-channel 30</span> +<span class="CommentedCode">#? curr-contents:text <- get tmp, contents:offset</span> +<span class="CommentedCode">#? start-running transmit-from-text curr-contents, sink</span> +<span class="CommentedCode">#? return</span> +<span class="CommentedCode">#? }</span> + <span class="muControl">return</span> <span class="Constant">0/not-found</span> +] + +<span class="muRecipe">def</span> request-socket socket:num, s:text<span class="muRecipe"> -> </span>socket:num [ + <span class="Constant">local-scope</span> + <span class="Constant">load-ingredients</span> + write-to-socket socket, s + $write-to-socket socket, <span class="Constant">13/cr</span> + $write-to-socket socket, <span class="Constant">10/lf</span> + <span class="Comment"># empty line to delimit request</span> + $write-to-socket socket, <span class="Constant">13/cr</span> + $write-to-socket socket, <span class="Constant">10/lf</span> +] + <span class="muRecipe">def</span> start-writing-socket network:&:local-network, port:num<span class="muRecipe"> -> </span>sink:&:sink:char, routine-id:num [ <span class="Constant">local-scope</span> <span class="Constant">load-ingredients</span> @@ -149,6 +195,41 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color <span class="Delimiter">}</span> put-index *new-port-connections, len, *new-port-connection ] + +<span class="muRecipe">def</span> receive-from-socket session:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ + <span class="Constant">local-scope</span> + <span class="Constant">load-ingredients</span> + <span class="Delimiter">{</span> + req:text, eof?:bool<span class="Special"> <- </span>$read-from-socket session, <span class="Constant">4096/bytes</span> + bytes-read:num<span class="Special"> <- </span>length *req + i:num<span class="Special"> <- </span>copy <span class="Constant">0</span> + <span class="Delimiter">{</span> + done?:bool<span class="Special"> <- </span>greater-or-equal i, bytes-read + <span class="muControl">break-if</span> done? + c:char<span class="Special"> <- </span>index *req, i <span class="Comment"># todo: unicode</span> + sink<span class="Special"> <- </span>write sink, c + i<span class="Special"> <- </span>add i, <span class="Constant">1</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + <span class="muControl">loop-unless</span> eof? + <span class="Delimiter">}</span> + sink<span class="Special"> <- </span>close sink +] + +<span class="muRecipe">def</span> write-to-socket socket:num, s:text [ + <span class="Constant">local-scope</span> + <span class="Constant">load-ingredients</span> + len:num<span class="Special"> <- </span>length *s + i:num<span class="Special"> <- </span>copy <span class="Constant">0</span> + <span class="Delimiter">{</span> + done?:bool<span class="Special"> <- </span>greater-or-equal i, len + <span class="muControl">break-if</span> done? + c:char<span class="Special"> <- </span>index *s, i + $write-to-socket socket, c + i<span class="Special"> <- </span>add i, <span class="Constant">1</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> +] </pre> </body> </html> |