【问题标题】:TIdNNTP fallback to XOVER for legacy/non-compliant NNTP serverTIdNNTP 回退到 XOVER 用于旧版/不兼容的 NNTP 服务器
【发布时间】:2013-10-07 02:25:58
【问题描述】:

我正在使用TIdNNTP,遇到了news.astraweb.com 服务器的情况,它在LIST EXTENSIONS 中宣布它支持新命令HDROVERXHDRXOVER 的正式版本) - 见https://www.rfc-editor.org/rfc/rfc3977#section-8.3https://www.rfc-editor.org/rfc/rfc2980#section-2.8

问题是服务器在发出 OVER 命令(而不是 XOVER)时回复命令代码 500(无效命令)。尽管这显然是不符合 RFC 的行为,但我想看看是否有可能强制 TIdNNTP 使用 XOVER 而不是 OVER,换句话说,以一种“传统”模式工作。同样的事情也适用于像 news.aioe.org 这样的兼容服务器

来自 news.astraweb.com 的日志示例(有问题的服务器)

->CAPABILITIES
<-500 What?
->LIST EXTENSIONS
<-202 Extensions supported:
<-HDR
<-OVER
<-.
->GROUP group.name
<-211 100031 1 100031 group.name
->OVER 100031-100031
<-500 What?

来自 news.aioe.org 的正确日志(按预期工作)

-> CAPABILITIES
<- 101 Capability list:
<- VERSION 2
<- IMPLEMENTATION INN 2.5.2
<- AUTHINFO
<-  SASL
<- HDR
<- LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT
<- OVER
<- POST
<- READER
<- SASL NTLM DIGEST-MD5 CRAM-MD5
<- STARTTLS
<- .
-> STARTTLS
<- 382 Begin TLS negotiation now
-> MODE READER
<- 200 news.aioe.org InterNetNews NNRP server INN 2.5.2 ready (posting ok)
-> CAPABILITIES
<- 101 Capability list:
<- VERSION 2
<- IMPLEMENTATION INN 2.5.2
<- AUTHINFO
<-  USER
<-  SASL
<- 
<- HDR
<- LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT
<- OVER
<- POST
<- READER
<- SASL NTLM DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
<- .
-> GROUP group.name
<- 211 4540 67027 71566 group.name
-> OVER 67027-71566
<- 224 Overview information for 67027-71566 follows
....

目前,TIdNNTP 在服务器宣布支持 OVER 时会自动选择 OVER,并且使用 IdNNTP.XOVER 调用将发出 OVER 命令。可以以某种方式覆盖它吗?做这种遗留支持是否值得费心?

【问题讨论】:

    标签: delphi c++builder indy


    【解决方案1】:

    TIdNNTP 被硬编码为使用OVER,如果服务器声称支持OVER,同样适用于HDR。没有选项可以改变这一点。您必须直接致电SendCmd(),然后您可以根据需要处理响应。

    就个人而言,我会联系 astraweb.com 并让他们知道他们的 NNTP 服务器已损坏。他们不厌其烦地实现了较新的CAPABILITIES 命令,但违反了它的核心要求:

    服务器必须确保功能列表准确反映当前可用的功能(包括扩展)。

    我不倾向于仅仅因为一台服务器不合格而改变 Indy 的行为。如果有其他服务器表现出相同的错误行为,那么添加回退选项会更有意义。

    【讨论】:

    • 我了解,他们可能正在调整他们的服务器以与旧客户端一起使用。我会看到在结果上使用SendCmd() 然后ParseXover()。希望这不会破坏客户端的其余部分或其他内部变量。
    • TIdNNTP.XOver() 不会改变任何内部变量,所以直接调用SendCmd() 不会破坏任何东西。 TIdNNTP.ParseXOver() 旨在由用户代码调用,用于不触发TIdNNTP.OnXOVER 事件的TIdNNTP.XOver() 的重载版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-12-24
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多