Module: WorkhorseHelper

Included in:
ApplicationController
Defined in:
app/helpers/workhorse_helper.rb

Overview

Helpers to send Git blobs, diffs, patches or archives through Workhorse. Workhorse will also serve files when using send_file.

Instance Method Summary collapse

Instance Method Details

#attachment_content_disposition(blob) ⇒ Object



81
82
83
# File 'app/helpers/workhorse_helper.rb', line 81

def attachment_content_disposition(blob)
  ActionDispatch::Http::ContentDisposition.format(disposition: 'attachment', filename: blob.name)
end

#content_disposition_for_blob(blob, inline) ⇒ Object



63
64
65
66
67
# File 'app/helpers/workhorse_helper.rb', line 63

def content_disposition_for_blob(blob, inline)
  return inline_content_disposition(blob) if inline

  attachment_content_disposition(blob)
end

#inline_content_disposition(blob) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
# File 'app/helpers/workhorse_helper.rb', line 69

def inline_content_disposition(blob)
  # We need to validate the .xhtml extension to avoid content sniffing
  # since some specific browsers ignore the Content-Disposition header.
  #
  # Using `split` instead of `File.extname` to handle files with multiple extensions
  #
  # Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/458229
  filename = blob.name.ends_with?('.xhtml') ? blob.name.split('.')[0] : nil

  ActionDispatch::Http::ContentDisposition.format(disposition: 'inline', filename: filename)
end

#send_artifacts_entry(file, entry) ⇒ Object

Send an entry from artifacts through Workhorse and set safe content type



39
40
41
42
43
44
# File 'app/helpers/workhorse_helper.rb', line 39

def send_artifacts_entry(file, entry)
  headers.store(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
  headers.store(*Gitlab::Workhorse.detect_content_type)

  head :ok
end

#send_dependency(dependency_headers, url, filename, ssrf_params: {}) ⇒ Object



46
47
48
49
50
51
52
53
# File 'app/helpers/workhorse_helper.rb', line 46

def send_dependency(dependency_headers, url, filename, ssrf_params: {})
  headers.store(*Gitlab::Workhorse.send_dependency(dependency_headers, url, **ssrf_params))
  headers['Content-Disposition'] =
    ActionDispatch::Http::ContentDisposition.format(disposition: 'attachment', filename: filename)
  headers['Content-Type'] = 'application/gzip'

  head :ok
end

#send_git_archive(repository, **kwargs) ⇒ Object

Archive a Git repository and send it through Workhorse



33
34
35
36
# File 'app/helpers/workhorse_helper.rb', line 33

def send_git_archive(repository, **kwargs)
  headers.store(*Gitlab::Workhorse.send_git_archive(repository, **kwargs))
  head :ok
end

#send_git_blob(repository, blob, inline: true) ⇒ Object

Send a Git blob through Workhorse



7
8
9
10
11
12
13
14
15
16
# File 'app/helpers/workhorse_helper.rb', line 7

def send_git_blob(repository, blob, inline: true)
  headers.store(*Gitlab::Workhorse.send_git_blob(repository, blob))

  headers['Content-Disposition'] = content_disposition_for_blob(blob, inline)

  # If enabled, this will override the values set above
  workhorse_set_content_type!

  render plain: ""
end

#send_git_diff(repository, diff_refs) ⇒ Object

Send a Git diff through Workhorse



19
20
21
22
23
# File 'app/helpers/workhorse_helper.rb', line 19

def send_git_diff(repository, diff_refs)
  headers.store(*Gitlab::Workhorse.send_git_diff(repository, diff_refs))
  headers['Content-Disposition'] = 'inline'
  head :ok
end

#send_git_patch(repository, diff_refs) ⇒ Object

Send a Git patch through Workhorse



26
27
28
29
30
# File 'app/helpers/workhorse_helper.rb', line 26

def send_git_patch(repository, diff_refs)
  headers.store(*Gitlab::Workhorse.send_git_patch(repository, diff_refs))
  headers['Content-Disposition'] = 'inline'
  head :ok
end

#set_workhorse_internal_api_content_typeObject



55
56
57
# File 'app/helpers/workhorse_helper.rb', line 55

def set_workhorse_internal_api_content_type
  headers['Content-Type'] = Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE
end

#workhorse_set_content_type!Object



59
60
61
# File 'app/helpers/workhorse_helper.rb', line 59

def workhorse_set_content_type!
  headers[Gitlab::Workhorse::DETECT_HEADER] = "true"
end