Skip to content

Commit

Permalink
* lib/net/http.rb: new method Net::HTTPRequest#body(=).
Browse files Browse the repository at this point in the history
* lib/net/http.rb: new method Net::HTTPRequest#body_stream(=).


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5909 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
aamine committed Mar 6, 2004
1 parent 3eedf91 commit 316bf4e
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 19 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
Sun Mar 7 03:11:00 2004 Minero Aoki <[email protected]>

* lib/net/http.rb: new method Net::HTTPRequest#body(=).

* lib/net/http.rb: new method Net::HTTPRequest#body_stream(=).

Sun Mar 7 02:06:07 2004 Minero Aoki <[email protected]>

* lib/net/http.rb: spin off https code again.
Expand Down
89 changes: 70 additions & 19 deletions lib/net/http.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#
# = net/http.rb
#
# Copyright (C) 1999-2003 Yukihiro Matsumoto
# Copyright (C) 1999-2003 Minero Aoki
# Copyright (C) 1999-2004 Yukihiro Matsumoto
# Copyright (C) 1999-2004 Minero Aoki
# Copyright (C) 2001 GOTOU Yuuzou
#
# Written and maintained by Minero Aoki <[email protected]>.
# HTTPS support added by GOTOU Yuuzou <[email protected]>.
Expand Down Expand Up @@ -920,8 +921,9 @@ def request(req, body = nil, &block) # :yield: +response+
req.proxy_basic_auth proxy_user(), proxy_pass()
end

req.set_body_internal body
begin_transport req
req.exec @socket, @curr_http_version, edit_path(req.path), body
req.exec @socket, @curr_http_version, edit_path(req.path)
begin
res = HTTPResponse.read_new(@socket)
end while res.kind_of?(HTTPContinue)
Expand Down Expand Up @@ -1196,13 +1198,17 @@ def initialize(m, reqbody, resbody, path, initheader = nil)
@path = path

@header = {}
return unless initheader
initheader.each do |k,v|
key = k.downcase
warn "net/http: warning: duplicated HTTP header: #{k}" if @header.key?(key) and $VERBOSE
@header[key] = v.strip
if initheader
initheader.each do |k,v|
key = k.downcase
warn "net/http: warning: duplicated HTTP header: #{k}" if @header.key?(key) and $VERBOSE
@header[key] = v.strip
end
end
@header['accept'] ||= '*/*'

@body = nil
@body_stream = nil
end

attr_reader :method
Expand All @@ -1220,19 +1226,43 @@ def response_body_permitted?
@response_has_body
end

alias body_exist? response_body_permitted?
def body_exist?
warn "Net::HTTPRequest#body_exist? is obsolete; use response_body_permitted?" if $VERBOSE
response_body_permitted?
end

attr_reader :body

def body=(str)
@body = str
@body_stream = nil
str
end

attr_reader :body_stream

def body_stream=(input)
@body = nil
@body_stream = input
input
end

def set_body_internal(str) #:nodoc: internal use only
raise ArgumentError, "both of body argument and HTTPRequest#body set" if str and (@body or @body_stream)
self.body = str if str
end

#
# write
#

def exec(sock, ver, path, body) #:nodoc: internal use only
if body
raise ArgumentError, 'HTTP request body is not permitted' \
unless request_body_permitted?
send_request_with_body sock, ver, path, body
def exec(sock, ver, path) #:nodoc: internal use only
if @body
send_request_with_body sock, ver, path, @body
elsif @body_stream
send_request_with_body_stream sock, ver, path, @body_stream
else
request sock, ver, path
write_header sock, ver, path
end
end

Expand All @@ -1245,14 +1275,35 @@ def send_request_with_body(sock, ver, path, body)
warn 'net/http: warning: Content-Type did not set; using application/x-www-form-urlencoded' if $VERBOSE
@header['content-type'] = 'application/x-www-form-urlencoded'
end
request sock, ver, path
write_header sock, ver, path
sock.write body
end

def request(sock, ver, path)
def send_request_with_body_stream(sock, ver, path, f)
unless @header['content-length']
raise ArgumentError, "request body Content-Length not given but Transfer-Encoding is not `chunked'; give up" unless chunked?
end
unless @header['content-type']
warn 'net/http: warning: Content-Type did not set; using application/x-www-form-urlencoded' if $VERBOSE
@header['content-type'] = 'application/x-www-form-urlencoded'
end
write_header sock, ver, path
if chunked?
while s = f.read(1024)
sock.write(sprintf("%x\r\n", s.length) << s << "\r\n")
end
sock.write "0\r\n\r\n"
else
while s = f.read(1024)
sock.write s
end
end
end

def write_header(sock, ver, path)
buf = "#{@method} #{path} HTTP/#{ver}\r\n"
each_capitalized do |k,v|
buf << k + ': ' + v + "\r\n"
buf << "#{k}: #{v}\r\n"
end
buf << "\r\n"
sock.write buf
Expand Down Expand Up @@ -1743,7 +1794,7 @@ def initialize(httpv, code, msg) #:nodoc: internal use only
alias msg message # :nodoc: obsolete

def inspect
"#<#{self.class} #{@code} readbody=#{@read}>"
"#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
end

# For backward compatibility.
Expand Down

0 comments on commit 316bf4e

Please sign in to comment.