2016-01-24 23 views
6

Tôi đang cố gắng thêm chức năng vào máy chủ servant của mình để nhận tệp từ Amazon S3 và truyền lại cho người dùng. Bởi vì các tệp có thể lớn, tôi không muốn tải xuống chúng cục bộ và sau đó phân phát chúng cho khách hàng, tôi muốn truyền trực tiếp chúng trực tiếp từ S3 tới các máy khách.Nhân viên Haskell và phát trực tuyến

Tôi sử dụng Amazonka cho những gì tôi làm với S3 và tôi có thể lấy luồng cho tệp S3 dưới dạng bồn rửa Conduit.

Nhưng bây giờ tôi không biết cách nhận từ Sink đến EitherT ServantErr IO a.

Bất cứ ai có thể giải thích cho tôi cách thực hiện hoặc chỉ cho tôi một số ví dụ về cách thực hiện?

+0

Hiện tại, có PR trong Servant để thêm "Hỗ trợ điểm cuối dòng". https://github.com/haskell-servant/servant/pull/836 – erewok

Trả lời

4

Không có gì trong Servant để thực hiện việc này ra khỏi hộp, tuy nhiên tất cả các bộ phận cần thiết đều có sẵn.

Trước khi chúng tôi bắt đầu, tôi đoán rằng nếu bạn có thể truyền đến một Sink, có nghĩa là bạn có một nguồn (gorsBody của GetObjectResponse là một RsBody, mà là một Source)

Trước hết, Servant cho chúng ta với khả năng thêm hỗ trợ cho các loại trả lại mới, bằng cách tạo một phiên bản mới của HasServer, vì vậy chúng tôi có thể phân phát một số EitherT ServantErr IO (Source ...) và phát trực tuyến.

Để tạo trường hợp đó, chúng tôi phải triển khai route :: Proxy layout -> Server layout -> RoutingApplication. Server layout, trong trường hợp này, chỉ có nghĩa là EitherT ServantErr IO layout, layout là nguồn chúng tôi muốn máy chủ, do đó, đó là hàm trả về nguồn (và có thể không thành công với lỗi HTTP).

Chúng tôi phải trả lại RoutingApplication, là (theo kiểu tiếp tục) một hàm mất Request và trả lại RouteResult Response, có nghĩa là lỗi lỗi chưa từng có hoặc phản hồi. Cả hai RequestResponse đều là tiêu chuẩn không phải là Servant, vì vậy bây giờ chúng ta có thể xem phần còn lại của hệ sinh thái để tìm cách triển khai nó.

May mắn thay, chúng tôi không cần phải đi xa: Network.Wai.Conduit chứa chỉ là những gì chúng ta cần phải thực hiện các chức năng route: responseSource mất một giá trị tình trạng, một số tiêu đề phản ứng và nguồn của bạn và cung cấp cho bạn một Response.

Vì vậy, đó là khá nhiều việc phải làm, nhưng mọi thứ chúng tôi cần đều có. Tìm kiếm source of the instance HasServer * (Get ...) có thể hữu ích.

+0

Tôi nghĩ rằng việc thêm giải thích/tham khảo về cách thực hiện điều này ở cấp WAI sẽ là tốt để hiểu cách điều này phù hợp với cấp độ công chức. Đối với tôi nó không rõ ràng những gì tiêu thụ những gì 'route' trở về và làm thế nào để suy nghĩ về việc thiết lập phong cách tiếp tục ở đây. – user239558

Các vấn đề liên quan