-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Transfer-Encoding header lost with EventSource #47
Comments
I cannot reproduce with:
I see Could you please double check? 🙏 |
rails new myapp
cd myapp
rails g controller sse index events
# put some code in events method
HTTP_PORT=8088 bin/thrust rails server Then access http://localhost:8088/sse/events |
My bad, I was I think there's some buffering involved with the GzipHandler. If you change your Rails controller code as follows then it should work: class SseController < ApplicationController
include ActionController::Live
def index
end
def events
response.headers['Content-Type'] = 'text/event-stream'
sse = SSE.new(response.stream, event: "message")
5.times {
- sse.write({ message: "hello world" })
+ sse.write({ message: "hello world" * 1000 })
sleep 1
}
ensure
response.stream.close
end
end |
I also encountered this problem, debugged for a long time, initially thought it was a kamal proxy issue, because there is a issues over there. Then I switched to caddy and it still occurred, so I'm sure it's not this problem. Then I debugged rack and found no anomalies, later I reviewed the dockerfile code and found this part, and discovered that someone else had the same issue as me. I disabled thruster and found that my program was working normally. class ChatsController < ApplicationController
include ActionController::Live
def index
@prompts = Prompt.all
@default_prompt = @prompts.first
@fields = @default_prompt&.fields
end
def create
response.headers["Content-Type"] = "text/event-stream"
response.headers["Last-Modified"] = Time.now.httpdate
sse = SSE.new(response.stream, retry: 300, event: "chat-output")
prompt = Prompt.find(params[:prompt_id])
prompt.chat(fields: params.require(:fields).permit!) do |message, html_content, accumulated, done|
if done
[
turbo_stream.update("chat_output", html_content),
turbo_stream.update("submit_button", partial: "shared/normal_button"),
turbo_stream.update("chat-output-bottom", partial: "chats/copy", locals: { markdown_content: accumulated })
].join("\n").then { sse.write({ template: _1 }) }
else
turbo_stream.append("chat_output", message.gsub("\n", "<br>")).then {
sse.write({ template: _1 })
}
end
logger.info "message: #{message}"
end
ensure
sse.close
end
end Dockerfile: EXPOSE 80
# CMD ["./bin/thrust", "./bin/rails", "server"]
CMD ["bundle", "exec", "falcon", "host"] |
bin/rails s
worksBut with thruster
bin/thrust bin/rails s
, transfer-encoding is missing. This cause a problem, messages returned as a whole text.Rails 8.0.0.beta1
ruby 3.3.1 (2024-04-23 revision c56cd86388) [arm64-darwin23]
The text was updated successfully, but these errors were encountered: