-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathdcssd
executable file
·136 lines (115 loc) · 4.83 KB
/
dcssd
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/env ruby
if (%w( -h --help help ) & ARGV).length > 0
puts "Usage: dcssd [-hv]"
puts "Starts dotcss server in the foreground. Kill with Control+C."
exit
end
if (%w( -v --version version ) & ARGV).length > 0
puts 'dcssd 2.2.0'
exit
end
if Dir.glob('*.css').empty? and not Dir.glob(File.join(ENV['HOME'], ".css/*.css")).empty?
Dir.chdir(File.join(ENV['HOME'], ".css"))
end
require 'webrick'
require 'webrick/https'
dotcss = Class.new(WEBrick::HTTPServlet::AbstractServlet) do
def do_GET(request, response)
body = build_body(request.path)
response.status = body.empty? ? 204 : 200
if origin = detect_origin(request)
response['Access-Control-Allow-Origin'] = origin
end
response['Content-Type'] = 'text/css'
response.body = body
end
def build_body(path)
files = []
paths = path.gsub('/', '').split('.')
until paths.empty?
file = File.expand_path(paths.join('.'))
files << file if File.file?(file)
paths.shift
end
files.sort_by! { |f| f.length }
# Default CSS to the front of the line!
files.unshift File.expand_path('default.css')
body = "/* dotcss is working */\n"
files.each do |file|
body << File.read(file) + "\n" if File.file?(file)
end
body
end
def detect_origin(req)
path = req.path
origin = req.header['origin']
search = path.gsub('/','').gsub(/\.js$/,'') + '$'
if origin.length == 1 && path.length != 1 && origin[0].match(search)
origin[0]
end
end
end
ssl_info = DATA.read
ssl_cert = ssl_info.scan(/(-----BEGIN CERTIFICATE-----.+?-----END CERTIFICATE-----)/m)[0][0]
ssl_key = ssl_info.scan(/(-----BEGIN RSA PRIVATE KEY-----.+?-----END RSA PRIVATE KEY-----)/m)[0][0]
server_options = {
:BindAddress => "127.0.0.1",
:Port => 1243,
:AccessLog => [],
:SSLEnable => true,
:SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
:SSLPrivateKey => OpenSSL::PKey::RSA.new(ssl_key),
:SSLCertificate => OpenSSL::X509::Certificate.new(ssl_cert),
:SSLCertName => [["CN", WEBrick::Utils::getservername]],
}
server = WEBrick::HTTPServer.new(server_options)
server.mount('/', dotcss)
%w( INT TERM ).each do |sig|
trap(sig) { server.shutdown }
end
server.start
__END__
-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEA1am0IPQ0mGHk4wR9+l4BB7BpRgEUnFwMOfCs+/M7sVilekEI
gHjK8KbmxtjaEqBcS9zGyUMSaichw3RRjAMKaHG3+YJ1f6eCSPEJW9FnRxqeN7+3
0dSmLpTG+gU+SitG1KRME+12ybXafMkp+9REFrZJuyELv2bxwUIMKAwE3AvtqYfQ
Udlg0XdwWqyZAwk3rtewu6KFLpIW8aW0aFG55u6h1L3tAbVlKoRNn2oSqP/W8gZ6
IgnOXfmZjxF3Ek5Sqd5Ujd7D5zhuoOxs8/isR2Uk8bUJ4fXdnFz3dSz4pVnu2T2H
VrldgJ+SueE7lmH7OzAaf4yuOqnNlKM/g4bKqQIDAQABAoH/fgabONTSMQ+M8lqz
8/l+ogpsDd6VSaUBkStk3Tea/gBLmtDBMwYMreXEOYWvG017I0QV/KCTPAnY4HC7
qNoiSXjKC2Hn7GPhdSS3YHEjec05haiPxDSp0M/wjYiKNTVRkhtWxGpMpq2dMf11
xhRuFPdwhe/3/e26q0NJ6FUuiJtsrTL1RSn7ntG+4SEMbIfyf/syx4ImvLSY76Q9
XfnaZXiOuZsUK2ByEFtpToXocYg2OdVZNwYSsFMh2JQXgsl7KMSUhFVmTE+cxYjB
wsly7R/FUMGLhWzsIai9w3c5pITpiFA/lxxFYi2zu5An8bUPIrVDI9jY2D2iJAel
a+CBAoGBAOnss6pmJb0QzdVDq+6V9TkSPFxaUEPeZzuxm3FseasMBtTWxJZ1Tm2f
ZK5eUsB+gTbAb0RT//ZqaxMD500lI+E5viOU7uqA/ztwT3+NxeLAIemWlsgPQtpA
QBnBAtQ14G9lTBXqnxrBE2sseEfgK+cxwdi1y+3rW568GhHP57JRAoGBAOnTgbHX
Jn7R85TRtH8at9DIzrO5+ja5hdbFkZe8v/MZFadcozUFsjc4YqGFBE7U+vjDULn2
GJ0Z4DTgbGNq0/4+ib7mbySeqT7q2sKDywOoMsq3eFkWkFqTEujazpyfYNJwK3T5
56KL7KUo7xMQTBzHtMmsvxPnvUQ9Ih9fqWTZAoGAQ4dQSmWYiV7bfLA/Zu2lT+di
w2pS93SxqnrYG8Mr0GP1aOXi9GhCzsSPxQJ3sxgR5yNgO4JgRttrs56R3CRXmkIY
EJ+C5PF+PMNsP69Gq/G5GHyfZHt7WhPoLUcZsPcoph/A+iaz7X5FQ9AfnOgq5F/p
zMyWZUVnOoikofW5tjECgYAz9Wb1gMyyE69f23WTZPmBsI2WDHaYYINoJUDkCfJR
b7qLFR/DMX/Xm3T3VVqOte8LBkPS/uebSVu0BEaxlNSEw5rSS9xYs9UCASgZXzXm
myKmPzzD9yqepd3m1nBhB115halydfHOAe/VB5KQlueC4bG/ut4+6xj4p+kENbqr
iQKBgQCWbKTa05Kt/HYK05Cyob9oTg9WR45rlWc/E2gqZV/QCXT3GFB1luQ8hfbZ
agOkGGSNJpCyS8060UXGUKuu0zd+g9p1ztzrf6FbS//zsfowNI1XsyJ49tF1EI9T
3GBEo993YlNZW989DYqrBya2VxmnPYe45N7Agtw4X2EOXDnQ5g==
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICwzCCAaugAwIBAgIJANXFw/H+y9c+MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
BAMTCWxvY2FsaG9zdDAeFw0xNzA1MDcxOTQ1MzFaFw0yNzA1MDUxOTQ1MzFaMBQx
EjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBANWptCD0NJhh5OMEffpeAQewaUYBFJxcDDnwrPvzO7FYpXpBCIB4yvCm5sbY
2hKgXEvcxslDEmonIcN0UYwDCmhxt/mCdX+ngkjxCVvRZ0canje/t9HUpi6UxvoF
PkorRtSkTBPtdsm12nzJKfvURBa2SbshC79m8cFCDCgMBNwL7amH0FHZYNF3cFqs
mQMJN67XsLuihS6SFvGltGhRuebuodS97QG1ZSqETZ9qEqj/1vIGeiIJzl35mY8R
dxJOUqneVI3ew+c4bqDsbPP4rEdlJPG1CeH13Zxc93Us+KVZ7tk9h1a5XYCfkrnh
O5Zh+zswGn+MrjqpzZSjP4OGyqkCAwEAAaMYMBYwFAYDVR0RBA0wC4IJbG9jYWxo
b3N0MA0GCSqGSIb3DQEBCwUAA4IBAQAGVzR8n6K02MKYReb3+ODtI6FOP/F7yq+S
qHSzlMpDd0dqoiIRsN0kGPTjjsPcgGqRq5Oh/PsavWDF4OctDgyTTwWosoCyW5kC
COr4xv/l32btR46RdyXMevhe67d7JFrtZQZxsoz/56djNGO5DXqvyT0A1td98Yfx
9Eii5ZSd85WmsJs/KN/N9z8wLdPqjKiMXLTlhv4EG7xhw8mftso2zJF+VUyGGYwB
kSsAVNnivgOU9LO0yqztCOM/+ImKVSJc6ma1sB9htIbWDBrlcDa1EC5bkLoXLdrb
ETxj0DxlQasE2ShsCx15l9GrhmqkH8JFSridPC37A5hBshliBttc
-----END CERTIFICATE-----