Advertisement
Guest User

Untitled

a guest
Jan 25th, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. require "pathname"
  2. require "net/http"
  3. require "uri"
  4.  
  5. require "sinatra"
  6. require "skinny"
  7. require 'sinatra'
  8. require 'sinatra/cross_origin'
  9.  
  10. require "mail_catcher/events"
  11. require "mail_catcher/mail"
  12.  
  13. class Sinatra::Request
  14. include Skinny::Helpers
  15. end
  16.  
  17. module MailCatcher
  18. module Web
  19. class Application < Sinatra::Base
  20. register Sinatra::CrossOrigin
  21. set :development, ENV["MAILCATCHER_ENV"] == "development"
  22. set :root, File.expand_path("#{__FILE__}/../../../..")
  23.  
  24. set :allow_origin, :any
  25. set :allow_methods, [:get, :post, :options, :put]
  26. set :max_age, "1728000"
  27. set :expose_headers, ['Content-Type']
  28.  
  29. if development?
  30. require "sprockets-helpers"
  31.  
  32. configure do
  33. enable :cross_origin
  34. require "mail_catcher/web/assets"
  35. Sprockets::Helpers.configure do |config|
  36. config.environment = Assets
  37. config.prefix = "/assets"
  38. config.digest = false
  39. config.public_path = public_folder
  40. config.debug = true
  41. end
  42. end
  43.  
  44. helpers do
  45. include Sprockets::Helpers
  46. end
  47. else
  48. configure do
  49. enable :cross_origin
  50. end
  51. helpers do
  52. def javascript_tag(name)
  53. %{<script src="/assets/#{name}.js"></script>}
  54. end
  55.  
  56. def stylesheet_tag(name)
  57. %{<link rel="stylesheet" href="/assets/#{name}.css">}
  58. end
  59. end
  60. end
  61.  
  62. options "*" do
  63. response.headers["Allow"] = "HEAD,GET,PUT,POST,DELETE,OPTIONS"
  64.  
  65. response.headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Cache-Control, Accept"
  66.  
  67. 200
  68. end
  69.  
  70. get "/" do
  71. erb :index
  72. end
  73.  
  74. delete "/" do
  75. if MailCatcher.quittable?
  76. MailCatcher.quit!
  77. status 204
  78. else
  79. status 403
  80. end
  81. end
  82.  
  83. get "/messages" do
  84. if request.websocket?
  85. request.websocket!(
  86. :on_start => proc do |websocket|
  87. subscription = Events::MessageAdded.subscribe { |message| websocket.send_message message.to_json }
  88. websocket.on_close do |websocket|
  89. Events::MessageAdded.unsubscribe subscription
  90. end
  91. end)
  92. else
  93. cross_origin
  94. content_type :json
  95. Mail.messages.to_json
  96. end
  97. end
  98.  
  99. delete "/messages" do
  100. Mail.delete!
  101. status 204
  102. end
  103.  
  104. get "/messages/:id.json" do
  105. id = params[:id].to_i
  106. if message = Mail.message(id)
  107. content_type :json
  108. message.merge({
  109. "formats" => [
  110. "source",
  111. ("html" if Mail.message_has_html? id),
  112. ("plain" if Mail.message_has_plain? id)
  113. ].compact,
  114. "attachments" => Mail.message_attachments(id).map do |attachment|
  115. attachment.merge({"href" => "/messages/#{escape(id)}/parts/#{escape(attachment["cid"])}"})
  116. end,
  117. }).to_json
  118. else
  119. not_found
  120. end
  121. end
  122.  
  123. get "/messages/:id.html" do
  124. id = params[:id].to_i
  125. if part = Mail.message_part_html(id)
  126. content_type part["type"], :charset => (part["charset"] || "utf8")
  127.  
  128. body = part["body"]
  129.  
  130. # Rewrite body to link to embedded attachments served by cid
  131. body.gsub! /cid:([^'"> ]+)/, "#{id}/parts/\\1"
  132.  
  133. content_type :html
  134. body
  135. else
  136. not_found
  137. end
  138. end
  139.  
  140. get "/messages/:id.plain" do
  141. id = params[:id].to_i
  142. if part = Mail.message_part_plain(id)
  143. content_type part["type"], :charset => (part["charset"] || "utf8")
  144. part["body"]
  145. else
  146. not_found
  147. end
  148. end
  149.  
  150. get "/messages/:id.source" do
  151. id = params[:id].to_i
  152. if message = Mail.message(id)
  153. content_type "text/plain"
  154. message["source"]
  155. else
  156. not_found
  157. end
  158. end
  159.  
  160. get "/messages/:id.eml" do
  161. id = params[:id].to_i
  162. if message = Mail.message(id)
  163. content_type "message/rfc822"
  164. message["source"]
  165. else
  166. not_found
  167. end
  168. end
  169.  
  170. get "/messages/:id/parts/:cid" do
  171. id = params[:id].to_i
  172. if part = Mail.message_part_cid(id, params[:cid])
  173. content_type part["type"], :charset => (part["charset"] || "utf8")
  174. attachment part["filename"] if part["is_attachment"] == 1
  175. body part["body"].to_s
  176. else
  177. not_found
  178. end
  179. end
  180.  
  181. get "/messages/:id/analysis.?:format?" do
  182. id = params[:id].to_i
  183. if part = Mail.message_part_html(id)
  184. # TODO: Server-side cache? Make the browser cache based on message create time? Hmm.
  185. uri = URI.parse("http://api.getfractal.com/api/v2/validate#{"/format/#{params[:format]}" if params[:format].present?}")
  186. response = Net::HTTP.post_form(uri, :api_key => "5c463877265251386f516f7428", :html => part["body"])
  187. content_type ".#{params[:format]}" if params[:format].present?
  188. body response.body
  189. else
  190. not_found
  191. end
  192. end
  193.  
  194. delete "/messages/:id" do
  195. id = params[:id].to_i
  196. if message = Mail.message(id)
  197. Mail.delete_message!(id)
  198. status 204
  199. else
  200. not_found
  201. end
  202. end
  203.  
  204. not_found do
  205. erb :"404"
  206. end
  207. end
  208. end
  209. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement