forked from samuelkadolph/ruby-pac
-
Notifications
You must be signed in to change notification settings - Fork 2
/
proxy_pac_file.rb
94 lines (78 loc) · 2.12 KB
/
proxy_pac_file.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# frozen_string_literal: true
module ProxyPacRb
# Pac file
class ProxyPacFile
include Comparable
attr_accessor :valid, :type, :message, :readable, :javascript, :parsable, :source, :content
def initialize(source:)
if source.is_a? ProxyPacFile
self.valid = source.valid
self.type = source.type
self.message = source.message
self.readable = source.readable
self.javascript = source.javascript
self.parsable = source.parsable
self.content = source.content
self.source = source.source
else
@source = source
@valid = false
@parsable = false
@readable = false
end
end
def content?
!@content.nil?
end
def <=>(other)
content <=> other.content
end
def type?(t)
type == t
end
def readable?
readable == true
end
def valid?
valid == true
end
def parsable?
parsable == true
end
def javascript?
!javascript.nil?
end
def find(url, fail_safe: true)
if fail_safe == true
raise ProxyPacInvalidError, "The proxy.pac \"#{source}\" is not readable: #{message}. Stopping here." unless readable?
raise ProxyPacInvalidError, "The proxy.pac \"#{source}\" is not valid: #{message}. Stopping here." unless valid?
raise ProxyPacInvalidError, "The proxy.pac \"#{source}\" is could not be parsed. There's no compiled javascript to use to lookup a url: #{message}. Stopping here." unless javascript?
end
uri = Addressable::URI.heuristic_parse(url)
if hostname?(url)
uri.scheme = 'http'
uri.path = '/'
uri.host = url
end
raise UrlInvalidError, 'url is missing host' unless uri.host
javascript.FindProxyForURL(uri.to_s, uri.host)
end
private
def hostname?(name)
/
\A
(
(
[a-zA-Z0-9]
| [a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]
)\.
)*
(
[A-Za-z0-9]
| [A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]
)
\Z
/x === name
end
end
end