2013-04-02 28 views
14

Ứng dụng của tôi sử dụng bookmarklet và tôi cần cho phép CORS MyRouteR để mã bookmarklet của tôi có thể sử dụng tuyến đường này cho các yêu cầu AJAX.Cho phép các yêu cầu xuất xứ chéo trong Yesod

Trong bản nháp đầu tiên của cấu hình/tuyến đường tôi đã cung cấp MyRouteR hỗ trợ chỉ cho một phương thức yêu cầu, PUT. Nhưng hóa ra là (duh) tôi cũng cần hỗ trợ phương pháp OPTIONS, trình duyệt nào sử dụng các yêu cầu preflight của CORS.

tôi đã kết thúc những điều sau đây config/tuyến:

/myroute MyRouteR PUT OPTIONS 

tôi đã loại hy vọng sẽ có một số máy móc có liên quan trong Template Haskell rằng quá trình config/tuyến đường để việc bổ sung các tùy chọn để này danh sách phương thức của tuyến đường sẽ tự động dẫn đến sự hỗ trợ của CORS, nhưng không có súc sắc. Không phải là kết thúc của thế giới, nhưng nó sẽ có ý nghĩa và cảm thấy thanh lịch theo cách đó.

Để làm CORS công việc, tôi đã đưa ra lộ trình một handler OPTIONS:

optionsMyRouteR :: Handler RepPlain 
optionsMyRouteR = do 
    addHeader "Access-Control-Allow-Origin" "*" 
    addHeader "Access-Control-Allow-Methods" "PUT, OPTIONS" 
    return $ RepPlain $ toContent ("" :: Text) 

putMyRouteR :: Handler RepJson 
putMyRouteR = do 
    addHeader "Access-Control-Allow-Origin" "*" 
    -- more stuff ... 

này hoạt động, nhưng nó cảm thấy hơi un-Yesodic vì nó rất soạn sẵn. Vì vậy, hai câu hỏi:

  1. Chúng ta có tính từ tốt hơn Yesodic không?
  2. Có cách nào khác, cách tốt hơn để cho phép tuyến đường hỗ trợ các yêu cầu có xuất xứ gốc không?
+1

tôi đã thay đổi 'setHeader' cho 'addHeader' trên vì' setHeader' đã bị phản đối trong thời gian trung bình –

Trả lời

3

UPDATE: người khác công bố một số trung gian chung cho việc này: http://hackage.haskell.org/package/wai-cors.


Tôi hiện đang làm việc trên các điều tương tự và chưa thực hiện một giải pháp, tuy nhiên tôi tưởng tượng nó có thể được thực hiện thông qua một WAI Middleware tương tự như các mẫu mã trên wiki trang Allowing WOFF fonts to be accessed from other domains (CORS). Điều này sẽ cho phép bạn viết mã CORS một lần mà không lặp lại chính mình.

Mẫu mã từ liên kết ở trên để thêm truy cập chéo nguồn gốc cho các phông chữ WOFF:

addCORStoWOFF :: W.Middleware 
addCORStoWOFF app = fmap updateHeaders . app 
    where 
    updateHeaders (W.ResponseFile status headers fp mpart) = W.ResponseFile status (new headers) fp mpart 
    updateHeaders (W.ResponseBuilder status headers builder) = W.ResponseBuilder status (new headers) builder 
    updateHeaders (W.ResponseSource status headers src)  = W.ResponseSource status (new headers) src 
    new headers | woff  = cors : headers 
       | otherwise =  headers 
     where woff = lookup HT.hContentType headers == Just "application/font-woff" 
      cors = ("Access-Control-Allow-Origin", "*") 
+0

tôi m chưa sẵn sàng chấp nhận câu trả lời chỉ vì tôi chưa thử nghiệm nó; Tôi có một cách giải quyết khác tại chỗ và nó hoạt động tốt đủ cho bây giờ. Tôi sẽ cố gắng thử nghiệm điều này sớm thôi. Nếu bất cứ ai khác kiểm tra nó và thấy nó hoạt động tốt, xin vui lòng cân nhắc. –

+0

Cảm ơn, tôi sẽ cho bạn biết nếu nó làm việc cho tôi. Tôi có thể sẽ thử nghiệm một thời gian này trong tháng này vì tôi cần nó. –

+0

Xin vui lòng, nhập khẩu – FtheBuilder

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