namespace web; joinHeaders = function(h,...){ if( type(h) == "table" ){ if( ! #h ){ var lst = {}; var push = ..table.push; for(k,v in h){ k = ..string.trimright(k,": ") + ": "; if( type(v) == 'table' ){ for(i=1;#v){ var v = tostring(v[i]); if(#v){ if( ..string.find(v,":") ) v = ..string.hex(v,"%",'\x80'); push( lst,k,v,'\r\n' ); } } } else{ v = tostring(v); if(#v){ if( ..string.find(v,":") ) v = ..string.hex(v,"%",'\x80'); push( lst,k,v,'\r\n' ) } } } h = ..string.join(lst); } else { h = ..string.join(h,'\r\n') + '\r\n'; } } elseif( #h ) { if( ..string.startsWith(h,'\r\n') ){ h = ..string.right(h,-3); } if( ! ..string.endsWith(h,'\r\n') ){ h = h + '\r\n'; } } if(!...) return h; return ..string.concat( h, joinHeaders(...) ) } /**intellisense(web) joinHeaders(.(HTTP头,->->->) = 拼接 HTTP 头,支持任意个参数,\nHTTP 头可以是字符串、表(数组、键值对)。\n\n字符串参数总是移除最前面的回车换行,并在尾部添加回车换行。\n单个字符串参数如果包含多个 HTTP 头应当以回车换行分隔。\n如果表参数是键值对,则值包含的宽字符进行 UrlEncode 编码(UTF8)。\n键值对的值也可以是多个值组成的数组。\n如果表参数是数组,则使用回车换行作为分隔符拼接为字符串。\n\n返回拼接后的字符串,HTTP 头之间以回车换行分隔,尾部总是添加回车换行 end intellisense**/