parsav  Diff

Differences From Artifact [36e7e8aa84]:

To Artifact [fbf604f655]:


   413    413   		var ok = true
   414    414   		if self.aid == 0 or self.who.rights.powers.[pow:asvalue()]() == false then
   415    415   			ok = false
   416    416   			self:complain(403,'insufficient privileges',['you lack the <strong>'..pow:asvalue()..'</strong> power and cannot perform this action'])
   417    417   		end
   418    418   	in ok end
   419    419   end)
          420  +
          421  +local pstr2mg, mg2pstr
          422  +do -- aaaaaaaaaaaaaaaaaaaaaaaa
          423  +	mgstr = lib.util.find(lib.net.mg_http_message.entries, function(v)
          424  +		if v.field == 'body' or v[1] == 'body' then return v.type end
          425  +	end)
          426  +	terra pstr2mg(p: pstring): mgstr
          427  +		return mgstr { ptr = p.ptr, len = p.ct }
          428  +	end
          429  +	terra mg2pstr(m: mgstr): pstring
          430  +		return pstring { ptr = m.ptr, ct = m.len }
          431  +	end
          432  +end
   420    433   
   421    434   -- CALL ONLY ONCE PER VAR
   422         -terra convo:postv(name: rawstring)
          435  +terra convo:postv_next(name: pstring, start: &pstring)
   423    436   	if self.varbuf.ptr == nil then
   424    437   		self.varbuf = self.srv.pool:alloc(int8, self.msg.body.len + self.msg.query.len)
   425    438   		self.vbofs = self.varbuf.ptr
   426    439   	end
   427         -	var o = lib.net.mg_http_get_var(&self.msg.body, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))
          440  +	var conv = pstr2mg(@start)
          441  +	var o = lib.net.mg_http_get_var(
          442  +		&conv,
          443  +		name.ptr, self.vbofs,
          444  +		self.varbuf.ct - (self.vbofs - self.varbuf.ptr)
          445  +	)
   428    446   	if o > 0 then
          447  +		start:advance(name.ct + o + 2)
   429    448   		var r = self.vbofs
   430    449   		self.vbofs = self.vbofs + o + 1
   431    450   		@(self.vbofs - 1) = 0
   432    451   		var norm = lib.str.normalize([lib.mem.ptr(int8)]{ptr = r, ct = o})
   433    452   		return norm.ptr, norm.ct
   434    453   	else return nil, 0 end
   435    454   end
   436         -terra convo:ppostv(name: rawstring)
          455  +terra convo:postv(name: pstring)
          456  +	var start = mg2pstr(self.msg.body)
          457  +	return self:postv_next(name, &start)
          458  +end
          459  +terra convo:ppostv(name: pstring)
   437    460   	var s,l = self:postv(name)
   438    461   	return pstring { ptr = s, ct = l }
   439    462   end
          463  +do
          464  +	local struct postiter { co: &convo where: pstring name: pstring }
          465  +	terra convo:eachpostv(name: pstring)
          466  +		return postiter { co = self, where = mg2pstr(self.msg.body), name = name } 
          467  +	end
          468  +	postiter.metamethods.__for = function(self, body)
          469  +		return quote
          470  +			while true do
          471  +				var str, len = self.co:postv_next(self.name, &self.where)
          472  +				if str == nil then break end
          473  +				[ body(`pstring {str, len}) ]
          474  +			end
          475  +		end
          476  +	end
          477  +end
   440    478   
   441    479   terra convo:getv(name: rawstring)
   442    480   	if self.varbuf.ptr == nil then
   443    481   		self.varbuf = self.srv.pool:alloc(int8, self.msg.query.len + self.msg.body.len)
   444    482   		self.vbofs = self.varbuf.ptr
   445    483   	end
   446    484   	var o = lib.net.mg_http_get_var(&self.msg.query, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))