comparison src/luan/modules/http/Http.luan @ 2008:bba3e529e346 default tip

chunked encoding
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 27 Aug 2025 01:14:17 -0600
parents 31f006c64782
children
comparison
equal deleted inserted replaced
2007:408f7dd7e503 2008:bba3e529e346
23 local regex = String.regex or error() 23 local regex = String.regex or error()
24 local Time = require "luan:Time.luan" 24 local Time = require "luan:Time.luan"
25 local format_time = Time.format or error() 25 local format_time = Time.format or error()
26 local parse_time = Time.parse or error() 26 local parse_time = Time.parse or error()
27 local Boot = require "luan:Boot.luan" 27 local Boot = require "luan:Boot.luan"
28 local Thread = require "luan:Thread.luan"
28 local LuanJava = require "java:luan.Luan" 29 local LuanJava = require "java:luan.Luan"
29 local Request = require "java:goodjava.webserver.Request" 30 local Request = require "java:goodjava.webserver.Request"
30 local Response = require "java:goodjava.webserver.Response" 31 local Response = require "java:goodjava.webserver.Response"
31 local ResponseOutputStream = require "java:goodjava.webserver.ResponseOutputStream" 32 local ResponseOutputStream = require "java:goodjava.webserver.ResponseOutputStream"
33 local ChunkedOutputStream = require "java:goodjava.webserver.ChunkedOutputStream"
32 local Status = require "java:goodjava.webserver.Status" 34 local Status = require "java:goodjava.webserver.Status"
33 local ServerSentEvents = require "java:goodjava.webserver.ServerSentEvents" 35 local ServerSentEvents = require "java:goodjava.webserver.ServerSentEvents"
34 local OutputStreamWriter = require "java:java.io.OutputStreamWriter" 36 local OutputStreamWriter = require "java:java.io.OutputStreamWriter"
35 local HashMap = require "java:java.util.HashMap" 37 local HashMap = require "java:java.util.HashMap"
36 local Logging = require "luan:logging/Logging.luan" 38 local Logging = require "luan:logging/Logging.luan"
180 response.writer and error "writer already set" 182 response.writer and error "writer already set"
181 response.writer = ResponseOutputStream.new(response.java) 183 response.writer = ResponseOutputStream.new(response.java)
182 return Boot.binary_writer(response.writer) 184 return Boot.binary_writer(response.writer)
183 end 185 end
184 186
187 function response.write_chunked_text(fn)
188 response.writer and error "writer already set"
189 response.writer = "done"
190 local writer = ChunkedOutputStream.new(response.java)
191 writer = OutputStreamWriter.new(writer)
192 writer = Boot.text_writer(writer)
193 Thread.run(function()
194 try
195 fn(writer)
196 finally
197 writer.close()
198 end
199 end)
200 end
201
202 function response.write_chunked_binary(fn)
203 response.writer and error "writer already set"
204 response.writer = "done"
205 local writer = ChunkedOutputStream.new(response.java)
206 writer = Boot.binary_writer(writer)
207 Thread.run(function()
208 try
209 fn(writer)
210 finally
211 writer.close()
212 end
213 end)
214 end
215
185 return response 216 return response
186 end 217 end
187 218
188 function Http.finish() -- called only from java 219 function Http.finish() -- called only from java
189 local response = Http.response or error() 220 local response = Http.response or error()
192 for name, value in pairs(response.headers) do 223 for name, value in pairs(response.headers) do
193 type(name)=="string" or "header name must be string" 224 type(name)=="string" or "header name must be string"
194 value = LuanJava.toJava(value) 225 value = LuanJava.toJava(value)
195 java.headers.put(name,value) 226 java.headers.put(name,value)
196 end 227 end
197 response.writer and response.writer.close() 228 response.writer and response.writer~="done" and response.writer.close()
198 return java 229 return java
199 end 230 end
200 231
201 function Http.error_priority(e) 232 function Http.error_priority(e)
202 return "error" 233 return "error"