Project

General

Profile

Actions

Bug #2291

closed

Net::FTPでソケットをオープンする前にbinary=を呼び出すと落ちる

Added by matsuda (Akira Matsuda) over 14 years ago. Updated almost 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.2dev (2009-09-29 trunk 25153) [i386-darwin9.8.0]
Backport:
[ruby-dev:39548]

Description

=begin
% cat ftp_binary.rb
require 'net/ftp'
f = Net::FTP.new
f.binary = true

% ruby ftp_binary.rb
/Users/matsuda/ruby_trunk/lib/ruby/1.9.1/net/ftp.rb:224:in putline': undefined method write' for nil:NilClass (NoMethodError)
from /Users/matsuda/ruby_trunk/lib/ruby/1.9.1/net/ftp.rb:291:in block in voidcmd' from /Users/matsuda/ruby_trunk/lib/ruby/1.9.1/monitor.rb:190:in mon_synchronize'
from /Users/matsuda/ruby_trunk/lib/ruby/1.9.1/net/ftp.rb:290:in voidcmd' from /Users/matsuda/ruby_trunk/lib/ruby/1.9.1/net/ftp.rb:146:in binary='
from ftp_binary.rb:3:in `'
=end

Actions #1

Updated by naruse (Yui NARUSE) over 14 years ago

  • Status changed from Open to Assigned
  • Assignee set to shugo (Shugo Maeda)

=begin
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 52bd375..239bd3c 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -132,6 +132,7 @@ module Net
@passive = false
@debug_mode = false
@resume = false

  •  @sock = nil
     if host
      connect(host)
      if user
    

@@ -143,7 +144,7 @@ module Net
def binary=(newmode)
if newmode != @binary
@binary = newmode

  •    @binary ? voidcmd("TYPE I") : voidcmd("TYPE A")
    
  •    @binary ? voidcmd("TYPE I") : voidcmd("TYPE A") unless closed?
     end
    
    end

こんな感じですかね
=end

Actions #2

Updated by naruse (Yui NARUSE) over 14 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r25518.
Akira, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Actions #3

Updated by shugo (Shugo Maeda) over 14 years ago

  • Status changed from Closed to Assigned

=begin
この修正で問題ないとしたら、ちょっとAPIが変だと思うので、もうちょっと考えさせてください。

一応commit前に自分に確認してもらえるとうれしいです。

=end

Actions #4

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
前田です。

2009年10月27日23:55 Shugo Maeda :

この修正で問題ないとしたら、ちょっとAPIが変だと思うので、もうちょっと考えさせてください。

やっぱりこの修正だと、ftp.connect前にftp.binary = trueとすると、その後にloginやgetbinaryfile
などでbinary modeにセットしようとしてもTYPEコマンドが発行されなくなってしまうようです。

Net::FTP#binary=は、新しいモードが現在と同じだとTYPEコマンドを発行しないため。

(1) connect前にftp.binary = trueとしたことを覚えておいて、ftp.connect時にTYPEコマンドを
発行するようにする。
(2) connect前にftp.binary=実行した場合は、潔く(?)例外を挙げる。

といった対応が考えられますが、特にconnect前にNet::FTP#binary=を使いたい理由があるでしょうか。
なければ(2)の方がシンプルなので、(2)にしたいのですが。

--
Shugo Maeda

=end

Actions #5

Updated by naruse (Yui NARUSE) over 14 years ago

=begin
あぁ、仰るとおりです。

(1) connect前にftp.binary = trueとしたことを覚えておいて、ftp.connect時にTYPEコマンドを
発行するようにする。

こちらだったら以下のような感じですかね。

diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 239bd3c..351e624 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -128,7 +128,7 @@ module Net
#
def initialize(host = nil, user = nil, passwd = nil, acct = nil)
super()

  •  @binary = false
    
  •  @binary = nil
     @passive = false
     @debug_mode = false
     @resume = false
    

@@ -194,6 +194,7 @@ module Net
@sock = open_socket(host, port)
voidresp
end

  •  @binary ? voidcmd("TYPE I") : voidcmd("TYPE A") unless @binary.nil?
    

    end

=end

Actions #6

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
前田です。

2009年10月28日0:48 Yui NARUSE :

(1) connect前にftp.binary = trueとしたことを覚えておいて、ftp.connect時にTYPEコマンドを
発行するようにする。

こちらだったら以下のような感じですかね。

よく考えたらlogin後でないとTYPEコマンドを発行できないですね。
また、現状では、Net::FTP#loginでbinary = trueにしているので、login前に
値を設定しても意味がありません。

このあたりは1.8と挙動が違うのですが、意図としてはデフォルトをbinary mode
にしたいということです。
1.9でNet::FTP#binary=がTYPEコマンドを発行するようになったのは、
getbinaryfileなどの呼び出しのたびにTYPEコマンドが発行されるのを
避けるためです。
この影響で、binary=の設定がlogin後でないとできなくなったので、loginメソッド
の中でself.binary = trueとするように修正されました。

そもそも元のNet::FTP#binary=自体が自分が書いたコードじゃない気がするので

経緯をはっきり覚えてないんですが。

(1)の方針で行くなら、FTPサーバ上のモードを表すインスタンス変数を行しく
導入する必要がある気がします。

とりあえず、r25518のbinary=の方の修正はいったんrevertしておきます。

--
Shugo Maeda

=end

Actions #7

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
前田です。

2009年10月28日11:09 Shugo Maeda :

(1)の方針で行くなら、FTPサーバ上のモードを表すインスタンス変数を行しく
導入する必要がある気がします。

すみません、T-Codeのせいでありえないtypoをしてしまいました。
sub(/行しく/, "新しく")してください。

--
Shugo Maeda

=end

Actions #8

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
前田です。

2009年10月28日11:09 Shugo Maeda :

(1)の方針で行くなら、FTPサーバ上のモードを表すインスタンス変数を行しく
導入する必要がある気がします。

とりあえず、r25518のbinary=の方の修正はいったんrevertしておきます。

結局ログイン状態を表すインスタンス変数を導入して、@binaryのデフォルト値を
trueにしました。
login時に@binaryの値によって適切なTYPEコマンドを発行するようにしました。

--
Shugo Maeda

=end

Actions #9

Updated by shugo (Shugo Maeda) over 14 years ago

  • Status changed from Assigned to Closed

=begin
This issue was solved with changeset r25519.
Akira, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0