net_dav 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 84bab24bbb50aa7f879686a344f6b3109d839099
4
+ data.tar.gz: 34ed1c83a0cd26ccebd8c00aa4193fb2b97c8796
5
+ SHA512:
6
+ metadata.gz: c24bc53644936a52deb68c938d600d3b944d4f23fe06dc90d951219a68045be279716b351198368cc1d97d067491a0f72b204346d3c6e0846afb13bb506d33f5
7
+ data.tar.gz: ab2bcef36d1c28bea11684b472c7ff25a1eda91a8df1809d44d8a999d9d501284ca0231949b7a476dcfdc2adfc44ea9a5e1dd97a5b387bd3dd019e87f8d1b630
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in net_dav.gemspec
4
+ gemspec
@@ -1,4 +1,4 @@
1
- Net::Dav library, in the style of Net::HTTP
1
+ Net::Dav library, in the style of Net::HTTP {<img src="https://travis-ci.org/devrandom/net_dav.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/devrandom/net_dav]
2
2
 
3
3
  == Install
4
4
 
@@ -42,3 +42,8 @@ latter and you have +curb+ installed, you can disable its use by passing the
42
42
  :curl => false
43
43
  option to Net::DAV::start or Net::DAV::new .
44
44
 
45
+ == Other
46
+
47
+ Thanks go to Thomas ( https://github.com/thomasfl/ ) and others for their help.
48
+
49
+ Thomas is writing the easy to use https://github.com/thomasfl/open-uri-and-write based on net_dav.
data/Rakefile CHANGED
@@ -1,69 +1,2 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "net_dav"
8
- gem.summary = %Q{WebDAV client library in the style of Net::HTTP}
9
- gem.description = %Q{WebDAV client library in the style of Net::HTTP, using Net::HTTP and libcurl, if installed}
10
- gem.email = "c1.github@niftybox.net"
11
- gem.homepage = "http://github.com/devrandom/net_dav"
12
- gem.authors = ["Miron Cuperman","Thomas Flemming"]
13
- gem.executables = ["dav"]
14
- gem.add_dependency "nokogiri", ">= 1.3.0"
15
- gem.add_development_dependency "rspec", ">= 1.2.0"
16
- gem.add_development_dependency "webrick-webdav", ">= 1.0"
17
-
18
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
- end
20
- Jeweler::GemcutterTasks.new
21
- rescue LoadError
22
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
23
- end
24
-
25
- require 'spec/rake/spectask'
26
- Spec::Rake::SpecTask.new(:spec) do |spec|
27
- spec.libs << 'lib' << 'spec'
28
- spec.spec_files = FileList['spec/**/*_spec.rb']
29
- end
30
-
31
- Spec::Rake::SpecTask.new(:rcov) do |spec|
32
- spec.libs << 'lib' << 'spec'
33
- spec.pattern = 'spec/**/*_spec.rb'
34
- spec.rcov = true
35
- end
36
-
37
- task :spec => :check_dependencies
38
-
1
+ require "bundler/gem_tasks"
39
2
  task :default => :spec
40
-
41
- desc "release with no version change"
42
- task :dist => [:clean, :release]
43
-
44
- namespace :dist do
45
- desc "release patch"
46
- task :patch => [:clean, "version:bump:patch", :release]
47
- desc "release with minor version bump"
48
- task :minor => [:clean, "version:bump:minor", :release]
49
- end
50
-
51
- desc "build gem into pkg directory"
52
- task :gem => [:build]
53
-
54
- task :clean do
55
- Dir.glob("**/*~").each do |file|
56
- File.unlink file
57
- end
58
- puts "cleaned"
59
- end
60
-
61
- require 'rake/rdoctask'
62
- Rake::RDocTask.new do |rdoc|
63
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
64
-
65
- rdoc.rdoc_dir = 'rdoc'
66
- rdoc.title = "net_dav #{version}"
67
- rdoc.rdoc_files.include('README*')
68
- rdoc.rdoc_files.include('lib/**/*.rb')
69
- end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "net_dav"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -1,9 +1,11 @@
1
1
  require 'net/https'
2
2
  require 'uri'
3
3
  require 'nokogiri'
4
- require 'net/dav/item'
4
+ require File.dirname(__FILE__) + "/dav/item"
5
5
  require 'base64'
6
6
  require 'digest/md5'
7
+ require File.dirname(__FILE__) + "/dav/version"
8
+
7
9
  begin
8
10
  require 'curb'
9
11
  rescue LoadError
@@ -13,10 +15,17 @@ module Net #:nodoc:
13
15
  # Implement a WebDAV client
14
16
  class DAV
15
17
  MAX_REDIRECTS = 10
18
+
19
+ def last_status
20
+ @handler.last_status
21
+ end
22
+
16
23
  class NetHttpHandler
17
24
  attr_writer :user, :pass
18
25
 
19
26
  attr_accessor :disable_basic_auth
27
+ attr_reader :last_status
28
+
20
29
 
21
30
  def verify_callback=(callback)
22
31
  @http.verify_callback = callback
@@ -62,6 +71,8 @@ module Net #:nodoc:
62
71
  end
63
72
 
64
73
  def request_sending_stream(verb, path, stream, length, headers)
74
+ headers ||= {}
75
+ headers = {"User-Agent" => "Ruby"}.merge(headers)
65
76
  req =
66
77
  case verb
67
78
  when :put
@@ -72,12 +83,14 @@ module Net #:nodoc:
72
83
  req.body_stream = stream
73
84
  req.content_length = length
74
85
  headers.each_pair { |key, value| req[key] = value } if headers
75
- req.content_type = 'text/xml; charset="utf-8"'
86
+ req.content_type = 'application/octet-stream'
76
87
  res = handle_request(req, headers)
77
88
  res
78
89
  end
79
90
 
80
91
  def request_sending_body(verb, path, body, headers)
92
+ headers ||= {}
93
+ headers = {"User-Agent" => "Ruby"}.merge(headers)
81
94
  req =
82
95
  case verb
83
96
  when :put
@@ -87,12 +100,14 @@ module Net #:nodoc:
87
100
  end
88
101
  req.body = body
89
102
  headers.each_pair { |key, value| req[key] = value } if headers
90
- req.content_type = 'text/xml; charset="utf-8"'
103
+ req.content_type = 'application/octet-stream'
91
104
  res = handle_request(req, headers)
92
105
  res
93
106
  end
94
107
 
95
108
  def request_returning_body(verb, path, headers, &block)
109
+ headers ||= {}
110
+ headers = {"User-Agent" => "Ruby"}.merge(headers)
96
111
  req =
97
112
  case verb
98
113
  when :get
@@ -106,6 +121,8 @@ module Net #:nodoc:
106
121
  end
107
122
 
108
123
  def request(verb, path, body, headers)
124
+ headers ||= {}
125
+ headers = {"User-Agent" => "Ruby"}.merge(headers)
109
126
  req =
110
127
  case verb
111
128
  when :propfind
@@ -120,6 +137,10 @@ module Net #:nodoc:
120
137
  Net::HTTP::Copy.new(path)
121
138
  when :proppatch
122
139
  Net::HTTP::Proppatch.new(path)
140
+ when :lock
141
+ Net::HTTP::Lock.new(path)
142
+ when :unlock
143
+ Net::HTTP::Unlock.new(path)
123
144
  else
124
145
  raise "unkown verb #{verb}"
125
146
  end
@@ -134,6 +155,13 @@ module Net #:nodoc:
134
155
  # You should choose better exception.
135
156
  raise ArgumentError, 'HTTP redirect too deep' if limit == 0
136
157
 
158
+ case @authorization
159
+ when :basic
160
+ req.basic_auth @user, @pass
161
+ when :digest
162
+ digest_auth(req, @user, @pass, response)
163
+ end
164
+
137
165
  response = nil
138
166
  if block
139
167
  @http.request(req) {|res|
@@ -144,6 +172,8 @@ module Net #:nodoc:
144
172
  else
145
173
  response = @http.request(req)
146
174
  end
175
+
176
+ @last_status = response.code.to_i
147
177
  case response
148
178
  when Net::HTTPSuccess then
149
179
  return response
@@ -151,15 +181,15 @@ module Net #:nodoc:
151
181
  response.error! unless @user
152
182
  response.error! if req['authorization']
153
183
  new_req = clone_req(req.path, req, headers)
154
- if response['www-authenticate'] =~ /^Basic/
184
+ if response['www-authenticate'] =~ /^basic/i
155
185
  if disable_basic_auth
156
186
  raise "server requested basic auth, but that is disabled"
157
187
  end
158
- new_req.basic_auth @user, @pass
188
+ @authorization = :basic
159
189
  else
160
- digest_auth(new_req, @user, @pass, response)
190
+ @authorization = :digest
161
191
  end
162
- return handle_request(new_req, headers, limit - 1, &block)
192
+ return handle_request(req, headers, limit - 1, &block)
163
193
  when Net::HTTPRedirection then
164
194
  location = URI.parse(response['location'])
165
195
  if (@uri.scheme != location.scheme ||
@@ -177,8 +207,13 @@ module Net #:nodoc:
177
207
  def clone_req(path, req, headers)
178
208
  new_req = req.class.new(path)
179
209
  new_req.body = req.body if req.body
180
- new_req.body_stream = req.body_stream if req.body_stream
210
+ if (req.body_stream)
211
+ req.body_stream.rewind
212
+ new_req.body_stream = req.body_stream
213
+ end
214
+ new_req.content_length = req.content_length if req.content_length
181
215
  headers.each_pair { |key, value| new_req[key] = value } if headers
216
+ new_req.content_type = req.content_type if req.content_type
182
217
  return new_req
183
218
  end
184
219
 
@@ -218,6 +253,27 @@ module Net #:nodoc:
218
253
  header = header.join(', ')
219
254
  request['Authorization'] = header
220
255
  end
256
+
257
+ def cert_file(cert_file)
258
+ # expects a OpenSSL::X509::Certificate object as client certificate
259
+ @http.cert = OpenSSL::X509::Certificate.new(File.read(cert_file))
260
+ #puts @http.cert.not_after
261
+ #puts @http.cert.subject
262
+ end
263
+
264
+ def cert_key(cert_file, cert_file_password)
265
+ # expects a OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object
266
+ if cert_file_password then
267
+ @http.key = OpenSSL::PKey::RSA.new(File.read(cert_file),cert_file_password)
268
+ else
269
+ @http.key = OpenSSL::PKey::RSA.new(File.read(cert_file))
270
+ end
271
+ end
272
+
273
+ # path of a CA certification file in PEM format. The file can contain several CA certificates.
274
+ def ca_file(ca_file)
275
+ @http.ca_file = ca_file
276
+ end
221
277
  end
222
278
 
223
279
 
@@ -267,6 +323,9 @@ module Net #:nodoc:
267
323
  end
268
324
  end
269
325
  curl.perform
326
+
327
+ @last_status = curl.response_code
328
+
270
329
  unless curl.response_code >= 200 && curl.response_code < 300
271
330
  header_block = curl.header_str.split(/\r?\n\r?\n/)[-1]
272
331
  msg = header_block.split(/\r?\n/)[0]
@@ -275,6 +334,23 @@ module Net #:nodoc:
275
334
  end
276
335
  curl.body_str
277
336
  end
337
+
338
+ def cert_file(cert_file)
339
+ # expects a cert file
340
+ @curl.cert = cert_file
341
+ end
342
+
343
+ def cert_key(cert_file, cert_file_password)
344
+ if cert_file_password then
345
+ @curl.certpassword = cert_file_password
346
+ end
347
+ @curl.key = cert_key
348
+ end
349
+
350
+ def ca_file(ca_file)
351
+ # path of a cacert bundle for this instance. This file will be used to validate SSL certificates.
352
+ @curl.cacert = ca_file
353
+ end
278
354
 
279
355
  end
280
356
 
@@ -332,6 +408,8 @@ module Net #:nodoc:
332
408
  # You can pass :curl => false if you want to disable use
333
409
  # of the curb (libcurl) gem if present for acceleration
334
410
  def initialize(uri, options = nil)
411
+ @last_status = 0
412
+
335
413
  @have_curl = Curl rescue nil
336
414
  if options && options.has_key?(:curl) && !options[:curl]
337
415
  @have_curl = false
@@ -339,6 +417,7 @@ module Net #:nodoc:
339
417
  @uri = uri
340
418
  @uri = URI.parse(@uri) if @uri.is_a? String
341
419
  @handler = @have_curl ? CurlHandler.new(@uri) : NetHttpHandler.new(@uri)
420
+ @headers = options && options[:headers] ? options[:headers] : {}
342
421
  end
343
422
 
344
423
  # Opens the connection to the host. Yields self to the block.
@@ -360,8 +439,33 @@ module Net #:nodoc:
360
439
  def credentials(user, pass)
361
440
  @handler.user = user
362
441
  @handler.pass = pass
442
+
443
+ # Return something explicitly since this command might be run in a
444
+ # console where the last statement would be printed.
445
+ nil
446
+ end
447
+
448
+ # Set credentials for ssl certificate authentication
449
+ def ssl_certificate(cert_file, *cert_file_password)
450
+ @handler.cert_file(cert_file)
451
+ @handler.cert_key(cert_file, cert_file_password)
452
+
453
+ # Return something explicitly since this command might be run in a
454
+ # console where the last statement would be printed.
455
+ nil
456
+ end
457
+
458
+ # Set additional ssl authorities for ssl certificate authentication
459
+ def ssl_authority(ca_file)
460
+ @handler.ca_file(ca_file)
461
+ nil
363
462
  end
364
463
 
464
+ # Set extra headers for the dav request
465
+ def headers(headers)
466
+ @headers = headers
467
+ end
468
+
365
469
  # Perform a PROPFIND request
366
470
  #
367
471
  # Example:
@@ -391,7 +495,7 @@ module Net #:nodoc:
391
495
  if(!body)
392
496
  body = '<?xml version="1.0" encoding="utf-8"?><DAV:propfind xmlns:DAV="DAV:"><DAV:allprop/></DAV:propfind>'
393
497
  end
394
- res = @handler.request(:propfind, path, body, headers)
498
+ res = @handler.request(:propfind, path, body, headers.merge(@headers))
395
499
  Nokogiri::XML.parse(res.body)
396
500
  end
397
501
 
@@ -440,7 +544,7 @@ module Net #:nodoc:
440
544
  uri = @uri.merge(item.xpath("x:href", namespaces).inner_text)
441
545
  size = item.%(".//x:getcontentlength", namespaces).inner_text rescue nil
442
546
  type = item.%(".//x:collection", namespaces) ? :directory : :file
443
- res = Item.new(self, uri, type, size)
547
+ res = Item.new(self, uri, type, size, item)
444
548
  if type == :file then
445
549
 
446
550
  if(options[:filename])then
@@ -493,7 +597,7 @@ module Net #:nodoc:
493
597
 
494
598
  def get(path, &block)
495
599
  path = @uri.merge(path).path
496
- body = @handler.request_returning_body(:get, path, nil, &block)
600
+ body = @handler.request_returning_body(:get, path, @headers, &block)
497
601
  body
498
602
  end
499
603
 
@@ -505,7 +609,7 @@ module Net #:nodoc:
505
609
  # end
506
610
  def put(path, stream, length)
507
611
  path = @uri.merge(path).path
508
- res = @handler.request_sending_stream(:put, path, stream, length, nil)
612
+ res = @handler.request_sending_stream(:put, path, stream, length, @headers)
509
613
  res.body
510
614
  end
511
615
 
@@ -516,7 +620,7 @@ module Net #:nodoc:
516
620
  #
517
621
  def put_string(path, str)
518
622
  path = @uri.merge(path).path
519
- res = @handler.request_sending_body(:put, path, str, nil)
623
+ res = @handler.request_sending_body(:put, path, str, @headers)
520
624
  res.body
521
625
  end
522
626
 
@@ -526,7 +630,7 @@ module Net #:nodoc:
526
630
  # dav.delete(uri.path)
527
631
  def delete(path)
528
632
  path = @uri.merge(path).path
529
- res = @handler.request(:delete, path, nil, nil)
633
+ res = @handler.request(:delete, path, nil, @headers)
530
634
  res.body
531
635
  end
532
636
 
@@ -538,7 +642,7 @@ module Net #:nodoc:
538
642
  path = @uri.merge(path).path
539
643
  destination = @uri.merge(destination).to_s
540
644
  headers = {'Destination' => destination}
541
- res = @handler.request(:move, path, nil, headers)
645
+ res = @handler.request(:move, path, nil, headers.merge(@headers))
542
646
  res.body
543
647
  end
544
648
 
@@ -550,7 +654,7 @@ module Net #:nodoc:
550
654
  path = @uri.merge(path).path
551
655
  destination = @uri.merge(destination).to_s
552
656
  headers = {'Destination' => destination}
553
- res = @handler.request(:copy, path, nil, headers)
657
+ res = @handler.request(:copy, path, nil, headers.merge(@headers))
554
658
  res.body
555
659
  end
556
660
 
@@ -558,22 +662,49 @@ module Net #:nodoc:
558
662
  # update properties on resources or collections.
559
663
  #
560
664
  # Example:
561
- # dav.proppatch(uri.path,"<d:creationdate>#{new_date}</d:creationdate>")
665
+ # dav.proppatch(uri.path,
666
+ # "<d:set><d:prop>" +
667
+ # "<d:creationdate>#{new_date}</d:creationdate>" +
668
+ # "</d:set></d:prop>" +
669
+ # )
562
670
  def proppatch(path, xml_snippet)
563
671
  path = @uri.merge(path).path
564
672
  headers = {'Depth' => '1'}
565
673
  body = '<?xml version="1.0"?>' +
566
674
  '<d:propertyupdate xmlns:d="DAV:">' +
567
- '<d:set>' +
568
- '<d:prop>' +
569
- xml_snippet +
570
- '</d:prop>' +
571
- '</d:set>' +
675
+ xml_snippet +
572
676
  '</d:propertyupdate>'
573
- res = @handler.request(:proppatch, path, body, headers)
677
+ res = @handler.request(:proppatch, path, body, headers.merge(@headers))
574
678
  Nokogiri::XML.parse(res.body)
575
679
  end
576
680
 
681
+ # Send a lock request to the server
682
+ #
683
+ # On success returns an XML response body with a Lock-Token
684
+ #
685
+ # Example:
686
+ # dav.lock(uri.path, "<d:lockscope><d:exclusive/></d:lockscope><d:locktype><d:write/></d:locktype><d:owner>Owner</d:owner>")
687
+ def lock(path, xml_snippet)
688
+ path = @uri.merge(path).path
689
+ headers = {'Depth' => '1'}
690
+ body = '<?xml version="1.0"?>' +
691
+ '<d:lockinfo xmlns:d="DAV:">' +
692
+ xml_snippet +
693
+ '</d:lockinfo>'
694
+ res = @handler.request(:lock, path, body, headers.merge(@headers))
695
+ Nokogiri::XML.parse(res.body)
696
+ end
697
+
698
+ # Send an unlock request to the server
699
+ #
700
+ # Example:
701
+ # dav.unlock(uri.path, "opaquelocktoken:eee47ade-09ac-626b-02f7-e354175d984e")
702
+ def unlock(path, locktoken)
703
+ headers = {'Lock-Token' => '<'+locktoken+'>'}
704
+ path = @uri.merge(path).path
705
+ res = @handler.request(:unlock, path, nil, headers.merge(@headers))
706
+ end
707
+
577
708
  # Returns true if resource exists on server.
578
709
  #
579
710
  # Example:
@@ -584,7 +715,7 @@ module Net #:nodoc:
584
715
  headers = {'Depth' => '1'}
585
716
  body = '<?xml version="1.0" encoding="utf-8"?><DAV:propfind xmlns:DAV="DAV:"><DAV:allprop/></DAV:propfind>'
586
717
  begin
587
- res = @handler.request(:propfind, path, body, headers)
718
+ res = @handler.request(:propfind, path, body, headers.merge(@headers))
588
719
  rescue
589
720
  return false
590
721
  end
@@ -594,7 +725,7 @@ module Net #:nodoc:
594
725
  # Makes a new directory (collection)
595
726
  def mkdir(path)
596
727
  path = @uri.merge(path).path
597
- res = @handler.request(:mkcol, path, nil, nil)
728
+ res = @handler.request(:mkcol, path, nil, @headers)
598
729
  res.body
599
730
  end
600
731
 
@@ -2,6 +2,40 @@ module Net
2
2
  class DAV
3
3
  # Hold items found using Net::DAV#find
4
4
  class Item
5
+
6
+ # Hold <response> XML element and provides facilities to query attributes
7
+ class Props
8
+
9
+ # The <response> XML element
10
+ attr_reader :response
11
+
12
+ def initialize(response)
13
+ @response = response
14
+ @namespaces = {"x" => "DAV:"}
15
+ end
16
+
17
+ def displayname
18
+ @response./(".//x:displayname", @namespaces).inner_text
19
+ end
20
+
21
+ def contenttype
22
+ @response./(".//x:getcontenttype", @namespaces).inner_text rescue nil
23
+ end
24
+
25
+ def contentlength
26
+ @response./(".//x:getcontentlength", @namespaces).inner_text rescue nil
27
+ end
28
+
29
+ def creationdate
30
+ Time.parse(@response./(".//x:creationdate", @namespaces).inner_text)
31
+ end
32
+
33
+ def lastmodificationdate
34
+ Time.parse(@response./(".//x:getlastmodified", @namespaces).inner_text)
35
+ end
36
+
37
+ end
38
+
5
39
  # URI of item
6
40
  attr_reader :uri
7
41
 
@@ -11,16 +45,20 @@ module Net
11
45
  # Type of item - :directory or :file
12
46
  attr_reader :type
13
47
 
48
+ # Properties holder
49
+ attr_reader :properties
50
+
14
51
  # Synonym for uri
15
52
  def url
16
53
  @uri
17
54
  end
18
55
 
19
- def initialize(dav, uri, type, size) #:nodoc:
56
+ def initialize(dav, uri, type, size, properties) #:nodoc:
20
57
  @uri = uri
21
58
  @size = size.to_i rescue nil
22
59
  @type = type
23
60
  @dav = dav
61
+ @properties = Props.new(properties)
24
62
  end
25
63
 
26
64
  # Get content from server if needed and return as string
@@ -0,0 +1,5 @@
1
+ module Net
2
+ class DAV
3
+ VERSION = "0.5.1"
4
+ end
5
+ end
@@ -1,71 +1,38 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'net/dav/version'
5
5
 
6
- Gem::Specification.new do |s|
7
- s.name = %q{net_dav}
8
- s.version = "0.5.0"
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "net_dav"
8
+ spec.version = Net::DAV::VERSION
9
+ spec.authors = ["Miron Cuperman", "Thomas Flemming"]
10
+ spec.email = ["c1.github@niftybox.net"]
9
11
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Miron Cuperman", "Thomas Flemming"]
12
- s.date = %q{2010-03-12}
13
- s.default_executable = %q{dav}
14
- s.description = %q{WebDAV client library in the style of Net::HTTP, using Net::HTTP and libcurl, if installed}
15
- s.email = %q{c1.github@niftybox.net}
16
- s.executables = ["dav"]
17
- s.extra_rdoc_files = [
18
- "LICENSE",
19
- "README.rdoc"
20
- ]
21
- s.files = [
22
- ".document",
23
- ".gitignore",
24
- "LICENSE",
25
- "README.rdoc",
26
- "Rakefile",
27
- "VERSION",
28
- "bin/dav",
29
- "lib/net/dav.rb",
30
- "lib/net/dav/item.rb",
31
- "net_dav.gemspec",
32
- "net_dav.gif",
33
- "script/multi-test",
34
- "spec/fixtures/file.html",
35
- "spec/integration/net_dav_spec.rb",
36
- "spec/integration/webdav_server.rb",
37
- "spec/spec.opts",
38
- "spec/spec_helper.rb",
39
- "tmp/.gitignore"
40
- ]
41
- s.homepage = %q{http://github.com/devrandom/net_dav}
42
- s.rdoc_options = ["--charset=UTF-8"]
43
- s.require_paths = ["lib"]
44
- s.rubygems_version = %q{1.3.5}
45
- s.summary = %q{WebDAV client library in the style of Net::HTTP}
46
- s.test_files = [
47
- "spec/spec_helper.rb",
48
- "spec/integration/webdav_server.rb",
49
- "spec/integration/net_dav_spec.rb"
50
- ]
12
+ spec.summary = "WebDAV client library in the style of Net::HTTP, using Net::HTTP and libcurl, if installed"
13
+ spec.description = "WebDAV client library in the style of Net::HTTP, using Net::HTTP and libcurl, if installed"
14
+ spec.homepage = "https://github.com/devrandom/net_dav"
51
15
 
52
- if s.respond_to? :specification_version then
53
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
54
- s.specification_version = 3
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ # if spec.respond_to?(:metadata)
19
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
20
+ # else
21
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ # end
55
23
 
56
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
57
- s.add_runtime_dependency(%q<nokogiri>, [">= 1.3.0"])
58
- s.add_development_dependency(%q<rspec>, [">= 1.2.0"])
59
- s.add_development_dependency(%q<webrick-webdav>, [">= 1.0"])
60
- else
61
- s.add_dependency(%q<nokogiri>, [">= 1.3.0"])
62
- s.add_dependency(%q<rspec>, [">= 1.2.0"])
63
- s.add_dependency(%q<webrick-webdav>, [">= 1.0"])
64
- end
65
- else
66
- s.add_dependency(%q<nokogiri>, [">= 1.3.0"])
67
- s.add_dependency(%q<rspec>, [">= 1.2.0"])
68
- s.add_dependency(%q<webrick-webdav>, [">= 1.0"])
69
- end
70
- end
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.12"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "webrick-webdav"
32
+ spec.add_development_dependency "rspec"
33
+
34
+ spec.add_dependency "nokogiri"
71
35
 
36
+
37
+
38
+ end
metadata CHANGED
@@ -1,105 +1,134 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: net_dav
3
- version: !ruby/object:Gem::Version
4
- version: 0.5.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Miron Cuperman
8
8
  - Thomas Flemming
9
9
  autorequire:
10
- bindir: bin
10
+ bindir: exe
11
11
  cert_chain: []
12
-
13
- date: 2010-03-12 00:00:00 -08:00
14
- default_executable: dav
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: nokogiri
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
21
- requirements:
12
+ date: 2016-08-21 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.12'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.12'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '10.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '10.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: webrick-webdav
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
22
46
  - - ">="
23
- - !ruby/object:Gem::Version
24
- version: 1.3.0
25
- version:
26
- - !ruby/object:Gem::Dependency
27
- name: rspec
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
28
49
  type: :development
29
- version_requirement:
30
- version_requirements: !ruby/object:Gem::Requirement
31
- requirements:
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
32
53
  - - ">="
33
- - !ruby/object:Gem::Version
34
- version: 1.2.0
35
- version:
36
- - !ruby/object:Gem::Dependency
37
- name: webrick-webdav
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
38
63
  type: :development
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
41
- requirements:
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: nokogiri
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
42
74
  - - ">="
43
- - !ruby/object:Gem::Version
44
- version: "1.0"
45
- version:
46
- description: WebDAV client library in the style of Net::HTTP, using Net::HTTP and libcurl, if installed
47
- email: c1.github@niftybox.net
48
- executables:
49
- - dav
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ description: WebDAV client library in the style of Net::HTTP, using Net::HTTP and
85
+ libcurl, if installed
86
+ email:
87
+ - c1.github@niftybox.net
88
+ executables: []
50
89
  extensions: []
51
-
52
- extra_rdoc_files:
53
- - LICENSE
54
- - README.rdoc
55
- files:
56
- - .document
57
- - .gitignore
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".document"
93
+ - ".gitignore"
94
+ - ".rspec"
95
+ - ".travis.yml"
96
+ - Gemfile
58
97
  - LICENSE
59
98
  - README.rdoc
60
99
  - Rakefile
61
- - VERSION
100
+ - bin/console
62
101
  - bin/dav
102
+ - bin/setup
63
103
  - lib/net/dav.rb
64
104
  - lib/net/dav/item.rb
105
+ - lib/net/dav/version.rb
65
106
  - net_dav.gemspec
66
107
  - net_dav.gif
67
108
  - script/multi-test
68
- - spec/fixtures/file.html
69
- - spec/integration/net_dav_spec.rb
70
- - spec/integration/webdav_server.rb
71
- - spec/spec.opts
72
- - spec/spec_helper.rb
73
109
  - tmp/.gitignore
74
- has_rdoc: true
75
- homepage: http://github.com/devrandom/net_dav
110
+ homepage: https://github.com/devrandom/net_dav
76
111
  licenses: []
77
-
112
+ metadata: {}
78
113
  post_install_message:
79
- rdoc_options:
80
- - --charset=UTF-8
81
- require_paths:
114
+ rdoc_options: []
115
+ require_paths:
82
116
  - lib
83
- required_ruby_version: !ruby/object:Gem::Requirement
84
- requirements:
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
85
119
  - - ">="
86
- - !ruby/object:Gem::Version
87
- version: "0"
88
- version:
89
- required_rubygems_version: !ruby/object:Gem::Requirement
90
- requirements:
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
91
124
  - - ">="
92
- - !ruby/object:Gem::Version
93
- version: "0"
94
- version:
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
95
127
  requirements: []
96
-
97
128
  rubyforge_project:
98
- rubygems_version: 1.3.5
129
+ rubygems_version: 2.2.2
99
130
  signing_key:
100
- specification_version: 3
101
- summary: WebDAV client library in the style of Net::HTTP
102
- test_files:
103
- - spec/spec_helper.rb
104
- - spec/integration/webdav_server.rb
105
- - spec/integration/net_dav_spec.rb
131
+ specification_version: 4
132
+ summary: WebDAV client library in the style of Net::HTTP, using Net::HTTP and libcurl,
133
+ if installed
134
+ test_files: []
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.5.0
@@ -1 +0,0 @@
1
- Content
@@ -1,124 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require File.expand_path(File.dirname(__FILE__) + '/webdav_server')
3
-
4
- describe "Net::Dav" do
5
-
6
- before(:all) do
7
- # Start webdav server in subprocess
8
- @pid = fork do
9
- webdav_server(:port => 10080, :authentication => false)
10
- end
11
- # Wait for webdavserver to start
12
- wait_for_server("http://localhost:10080/")
13
- end
14
-
15
- it "should create a Net::Dav object" do
16
- Net::DAV.new("http://localhost.localdomain/").should_not be_nil
17
- end
18
-
19
- it "should read properties from webdav server" do
20
- dav = Net::DAV.new("http://localhost:10080/")
21
- @props = dav.propfind("/").to_s
22
- @props.should match(/200 OK/)
23
- end
24
-
25
- it "should raise if finding non-existent path" do
26
- dav = Net::DAV.new("http://localhost:10080/")
27
- lambda do
28
- dav.find("/") do |item|
29
- end
30
- end.should_not raise_error
31
- end
32
-
33
- it "should raise if finding non-existent path" do
34
- dav = Net::DAV.new("http://localhost:10080/")
35
- lambda do
36
- dav.find("/asdf") do |item|
37
- end
38
- end.should raise_error Net::HTTPServerException
39
- end
40
-
41
- it "should write files to webdav server" do
42
- dav = Net::DAV.new("http://localhost:10080/")
43
- @props = find_props_or_error(dav, "/new_file.html")
44
- @props.should match(/404.*Not found/i)
45
-
46
- dav.put_string("/new_file.html","File contents")
47
-
48
- @props = find_props_or_error(dav, "/new_file.html")
49
- @props.should match(/200 OK/i)
50
- end
51
-
52
- it "should delete files from webdav server" do
53
- dav = Net::DAV.new("http://localhost:10080/")
54
-
55
- @props = find_props_or_error(dav, "/new_file.html")
56
- @props.should match(/200 OK/i)
57
-
58
- dav.delete("/new_file.html")
59
- @props = find_props_or_error(dav, "/new_file.html")
60
- @props.should match(/404.*Not found/i)
61
- end
62
-
63
- it "should copy files on webdav server" do
64
- dav = Net::DAV.new("http://localhost:10080/")
65
-
66
- @props = find_props_or_error(dav, "/file.html")
67
- @props.should match(/200 OK/i)
68
-
69
- dav.copy("/file.html","/copied_file.html")
70
- @props = find_props_or_error(dav, "/copied_file.html")
71
- @props.should match(/200 OK/i)
72
-
73
- dav.delete("/copied_file.html")
74
-
75
- @props = find_props_or_error(dav, "/copied_file.html")
76
- @props.should match(/404.*Not found/i)
77
- end
78
-
79
- it "should move files on webdav server" do
80
- dav = Net::DAV.new("http://localhost:10080/")
81
-
82
- @props = find_props_or_error(dav, "/file.html")
83
- @props.should match(/200 OK/i)
84
-
85
- dav.move("/file.html","/moved_file.html")
86
- @props = find_props_or_error(dav, "/moved_file.html")
87
- @props.should match(/200 OK/i)
88
-
89
- @props = find_props_or_error(dav, "/file.html")
90
- @props.should match(/404.*Not found/i)
91
-
92
- dav.move("/moved_file.html","/file.html")
93
- @props = find_props_or_error(dav, "/file.html")
94
- @props.should match(/200 OK/i)
95
- end
96
-
97
- it "should retrieve acl" do
98
- dav = Net::DAV.new("http://localhost:10080/")
99
- @props = dav.propfind("/", :acl).to_s
100
- @props.should match(/200 OK/i)
101
- end
102
-
103
- it "should detect if resource or collection exists on server" do
104
- dav = Net::DAV.new("http://localhost:10080/")
105
- dav.exists?('/file.html').should == true
106
- dav.exists?('/totally_unknown_file.html').should == false
107
- end
108
-
109
- # proppatch seems to work, but our simple webdav server don't update properties
110
- # it "should alter properties on resources on webdav server" do
111
- # dav = Net::DAV.new("http://localhost:10080/")
112
- # @props = find_props_or_error(dav, "/file.html")
113
- # puts @props
114
- # dav.proppatch("/file.html", "<d:resourcetype>static-file</d:resourcetype>")
115
- # @props = find_props_or_error(dav, "/file.html")
116
- # puts @props
117
- # end
118
-
119
- after(:all) do
120
- # Shut down webdav server
121
- Process.kill('SIGKILL', @pid) rescue nil
122
- end
123
-
124
- end
@@ -1,87 +0,0 @@
1
- #!/usr/bin/ruby
2
- # -*- coding: utf-8 -*-
3
- require 'rubygems'
4
- require 'webrick'
5
- require 'webrick/httpservlet/webdavhandler'
6
-
7
- # Web server with WebDAV extensions
8
- #
9
- # Usage: ruby webdav_server.rb
10
-
11
- # Code based on:
12
- # http://github.com/aslakhellesoy/webdavjs/blob/master/spec/webdav_server.rb
13
-
14
-
15
- # Monkey patch REXML to always nil-indent. The indentation is broken in REXML
16
- # on Ruby 1.8.6 and even when fixed it confuses OS-X.
17
- module REXML
18
- module Node
19
- alias old_to_s to_s
20
- def to_s(indent=nil)
21
- old_to_s(nil)
22
- end
23
- end
24
- end
25
-
26
- # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/223386
27
- # http://gmarrone.objectblues.net/cgi-bin/wiki/WebDAV_-_Linux_server%2c_Mac_OS_X_client
28
- module WEBrick
29
- module HTTPServlet
30
- class WebDAVHandlerVersion2 < WebDAVHandler
31
-
32
- def do_OPTIONS(req, res)
33
- super
34
- res["DAV"] = "1,2"
35
- end
36
-
37
- def do_LOCK(req, res)
38
- res.body << "<XXX-#{Time.now.to_s}/>"
39
- end
40
-
41
- end
42
-
43
- class WebDAVHandlerVersion3 < WebDAVHandlerVersion2
44
-
45
- # Enable authentication
46
- $REALM = "WebDav share"
47
- $USER = "myuser"
48
- $PASS = "mypass"
49
-
50
- def service(req, res)
51
- HTTPAuth.basic_auth(req, res, $REALM) {|user, pass|
52
- # this block returns true if
53
- # authentication token is valid
54
- user == $USER && pass == $PASS
55
- }
56
- super
57
- end
58
-
59
- end
60
-
61
- end
62
- end
63
-
64
- def webdav_server(*options)
65
- port = 10080
66
- if(options and options[0][:port])
67
- port = options[0][:port]
68
- end
69
- log = WEBrick::Log.new
70
- log.level = WEBrick::Log::DEBUG if $DEBUG
71
- serv = WEBrick::HTTPServer.new({:Port => port, :Logger => log})
72
-
73
- dir = File.expand_path(File.dirname(__FILE__)) + '/../fixtures'
74
- if(options and options[0][:authentication])
75
- serv.mount("/", WEBrick::HTTPServlet::WebDAVHandlerVersion3, dir)
76
- else
77
- serv.mount("/", WEBrick::HTTPServlet::WebDAVHandlerVersion2, dir)
78
- end
79
-
80
- trap(:INT){ serv.shutdown }
81
- serv.start
82
- end
83
-
84
- if($0 == __FILE__)
85
-
86
- webdav_server(:port => 10080,:authentication => false)
87
- end
@@ -1 +0,0 @@
1
- --color
@@ -1,42 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'rubygems'
4
- require 'net/dav'
5
- require 'spec'
6
- require 'spec/autorun'
7
-
8
- Spec::Runner.configure do |config|
9
-
10
- end
11
-
12
- # Wait for webdav server to start up
13
- def wait_for_server(address)
14
- server_running = false
15
- dav = Net::DAV.new(address)
16
- count = 0
17
- while(not(server_running))
18
- begin
19
- sleep(0.1)
20
- props = dav.propfind("/").to_s
21
- if(props.match(/200 OK/))
22
- server_running = true
23
- else
24
- warn "Webdav server should return \"200 OK\" "
25
- exit(1)
26
- end
27
- rescue
28
- count += 1
29
- puts "Server not running. Retrying..." if ((count % 10) == 0)
30
- end
31
- end
32
- dav = nil
33
- end
34
-
35
- # Profind helper. Returns properties or error
36
- def find_props_or_error(dav, path)
37
- begin
38
- return dav.propfind(path).to_s
39
- rescue Net::HTTPServerException => e
40
- return e.to_s
41
- end
42
- end