Software /
code /
prosody
Comparison
util/httpstream.lua @ 3565:e2cc09e83a3e
util.httpstream: A little refactoring of the coroutine control flow.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 06 Nov 2010 01:08:30 +0500 |
parent | 3564:90f4e6dc1c11 |
child | 3566:75d287daad16 |
comparison
equal
deleted
inserted
replaced
3564:90f4e6dc1c11 | 3565:e2cc09e83a3e |
---|---|
5 local deadroutine = coroutine.create(function() end); | 5 local deadroutine = coroutine.create(function() end); |
6 coroutine.resume(deadroutine); | 6 coroutine.resume(deadroutine); |
7 | 7 |
8 module("httpstream") | 8 module("httpstream") |
9 | 9 |
10 local function parser(data, success_cb, parser_type) | 10 local function parser(success_cb, parser_type) |
11 local data = coroutine.yield(); | |
11 local function readline() | 12 local function readline() |
12 local pos = data:find("\r\n", nil, true); | 13 local pos = data:find("\r\n", nil, true); |
13 while not pos do | 14 while not pos do |
14 data = data..coroutine.yield(); | 15 data = data..coroutine.yield(); |
15 pos = data:find("\r\n", nil, true); | 16 pos = data:find("\r\n", nil, true); |
92 else coroutine.yield("unknown-parser-type"); end | 93 else coroutine.yield("unknown-parser-type"); end |
93 end | 94 end |
94 | 95 |
95 function new(success_cb, error_cb, parser_type) | 96 function new(success_cb, error_cb, parser_type) |
96 local co = coroutine.create(parser); | 97 local co = coroutine.create(parser); |
98 coroutine.resume(co, success_cb, parser_type) | |
97 return { | 99 return { |
98 feed = function(self, data) | 100 feed = function(self, data) |
99 if not data then | 101 if not data then |
100 if parser_type == "client" then coroutine.resume(co, "", success_cb, parser_type); end | 102 if parser_type == "client" then coroutine.resume(co, ""); end |
101 co = deadroutine; | 103 co = deadroutine; |
102 return error_cb(); | 104 return error_cb(); |
103 end | 105 end |
104 local success, result = coroutine.resume(co, data, success_cb, parser_type); | 106 local success, result = coroutine.resume(co, data); |
105 if result then | 107 if result then |
106 co = deadroutine; | 108 co = deadroutine; |
107 return error_cb(result); | 109 return error_cb(result); |
108 end | 110 end |
109 end; | 111 end; |