On 03/21/2011 08:28 AM, Paolo Bonzini wrote:
On Sun, Mar 20, 2011 at 08:55, Holger Hans Peter Freyther
<[email protected]>  wrote:
Hi Paolo,

for the HTTP implementation in NetClients it would be nice if instead of
exceptions for the 40x and 30x I would get a proper response. Right now for a
HTTP Redirect I will not be able to get the response code or the content that
was sent. Would you mind adding a method to inhibit these exceptions?

I need to look at the code, but I wonder if you just need to handle
them and resume them.

Alternatively, the response could be included in the exception.

Perhaps something like this would help?

Paolo
>From a0bdf65d33aa63ec97a646d1b767c529ad89da6d Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2011 11:12:26 +0100
Subject: [PATCH 0/5] *** SUBJECT HERE ***

*** BLURB HERE ***

Paolo Bonzini (5):
  add NetClients exception descriptions
  remove useless overrides of #checkResponse:
  pass a response to ProtocolError exceptions
  use ProtocolError for invalid redirects, add location to redirect
    notification
  reorder ProtocolError handlers for ANSI compatibility

 packages/net/Base.st        |  114 +++++++++++++++++++++++++++++++++++++++++--
 packages/net/ChangeLog      |   29 +++++++++++
 packages/net/FTP.st         |    8 +---
 packages/net/HTTP.st        |   35 ++++++++-----
 packages/net/IMAP.st        |    2 +-
 packages/net/NNTP.st        |   13 ++---
 packages/net/POP.st         |    6 --
 packages/net/SMTP.st        |    2 +-
 packages/net/URIResolver.st |   50 ++++++++-----------
 9 files changed, 189 insertions(+), 70 deletions(-)

-- 
1.7.4

>From 4c2ccb7522fd1256d5a008e6a53e07b145939537 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2011 10:44:39 +0100
Subject: [PATCH 1/5] add NetClients exception descriptions

packages/net:
2011-03-21  Paolo Bonzini  <[email protected]>

        * Base.st: Add exception descriptions.  Add WrongStateError.
        * IMAP.st: Use WrongStateError.
---
 packages/net/Base.st   |   30 ++++++++++++++++++++++++++++++
 packages/net/ChangeLog |    5 +++++
 packages/net/IMAP.st   |    2 +-
 3 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/packages/net/Base.st b/packages/net/Base.st
index 4ef04b4..eaaa8a3 100644
--- a/packages/net/Base.st
+++ b/packages/net/Base.st
@@ -1405,6 +1405,12 @@ NetClientError subclass: ConnectionFailedError [
     
     <category: 'NetClients-Framework'>
     <comment: nil>
+
+    description [
+        <category: 'exception handling'>
+
+        ^'The connection attempt failed.'
+    ]
 ]
 
 
@@ -1413,6 +1419,12 @@ NetClientError subclass: ConnectionClosedError [
     
     <category: 'NetClients-Framework'>
     <comment: nil>
+
+    description [
+        <category: 'exception handling'>
+
+        ^'The server closed the connection.'
+    ]
 ]
 
 
@@ -1434,5 +1446,23 @@ NetClientError subclass: LoginIncorrectError [
     
     <category: 'NetClients-Framework'>
     <comment: nil>
+
+    description [
+        <category: 'exception handling'>
+
+        ^'The server rejected your login attempt.'
+    ]
+]
+
+
+NetClientError subclass: WrongStateError [
+    <category: 'NetClients-Framework'>
+    <comment: nil>
+
+    description [
+        <category: 'exception handling'>
+
+        ^'This command cannot be executed in the client''s current state.'
+    ]
 ]
 
diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 7c5a792..20bd1a7 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-21  Paolo Bonzini  <[email protected]>
+
+       * Base.st: Add exception descriptions.  Add WrongStateError.
+       * IMAP.st: Use WrongStateError.
+
 2011-03-12  Paolo Bonzini  <[email protected]>
 
        * gnutls-wrapper.c: Remove dead code signaled by clang analyzer.
diff --git a/packages/net/IMAP.st b/packages/net/IMAP.st
index c6a2d14..6a7cc91 100644
--- a/packages/net/IMAP.st
+++ b/packages/net/IMAP.st
@@ -1494,7 +1494,7 @@ Object subclass: IMAPState [
 
     signalError [
        <category: 'errors'>
-       ^self protocolError: 'wrong state'
+       ^WrongStateError signal
     ]
 
     client: aValue [
-- 
1.7.4


>From 8e8b53fea56ece87f03d416a04f1b5d1e9da4d65 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2011 10:46:25 +0100
Subject: [PATCH 2/5] remove useless overrides of #checkResponse:

packages/net:
2011-03-21  Paolo Bonzini  <[email protected]>

        * FTP.st: Remove useless override.
        * HTTP.st: Remove useless override.
        * POP.st: Remove useless override.
---
 packages/net/ChangeLog |    6 ++++++
 packages/net/FTP.st    |    6 ------
 packages/net/HTTP.st   |    6 ------
 packages/net/POP.st    |    6 ------
 4 files changed, 6 insertions(+), 18 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 20bd1a7..71d9b2f 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,11 @@
 2011-03-21  Paolo Bonzini  <[email protected]>
 
+       * FTP.st: Remove useless override.
+       * HTTP.st: Remove useless override.
+       * POP.st: Remove useless override.
+
+2011-03-21  Paolo Bonzini  <[email protected]>
+
        * Base.st: Add exception descriptions.  Add WrongStateError.
        * IMAP.st: Use WrongStateError.
 
diff --git a/packages/net/FTP.st b/packages/net/FTP.st
index 42f423a..e5987fb 100644
--- a/packages/net/FTP.st
+++ b/packages/net/FTP.st
@@ -537,12 +537,6 @@ NetProtocolInterpreter subclass: FTPProtocolInterpreter [
        self checkResponse
     ]
 
-    checkResponse: response [
-       <category: 'private'>
-       ^self checkResponse: response
-           ifError: [self protocolError: response statusMessage]
-    ]
-
     checkResponse: response ifError: errorBlock [
        <category: 'private'>
        | status |
diff --git a/packages/net/HTTP.st b/packages/net/HTTP.st
index dc0653c..2aa1832 100644
--- a/packages/net/HTTP.st
+++ b/packages/net/HTTP.st
@@ -298,12 +298,6 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
        ^self readResponseInto: aStream
     ]
 
-    checkResponse: response [
-       <category: 'private'>
-       ^self checkResponse: response
-           ifError: [self protocolError: response statusMessage]
-    ]
-
     checkResponse: response ifError: errorBlock [
        <category: 'private'>
        | status |
diff --git a/packages/net/POP.st b/packages/net/POP.st
index b37d4de..0537d30 100644
--- a/packages/net/POP.st
+++ b/packages/net/POP.st
@@ -357,12 +357,6 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
        self checkResponse
     ]
 
-    checkResponse: response [
-       <category: 'private'>
-       ^self checkResponse: response
-           ifError: [self protocolError: response statusMessage]
-    ]
-
     checkResponse: response ifError: errorBlock [
        <category: 'private'>
        | status |
-- 
1.7.4


>From 55b6d21b3712de1c5815f572f4deda1cd11c265e Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2011 10:49:48 +0100
Subject: [PATCH 3/5] pass a response to ProtocolError exceptions

packages/net:
2011-03-21  Paolo Bonzini  <[email protected]>

        * Base.st: Add response variable to ProtocolError.  Add
        UnexpectedResponseError.
        * FTP.st: Use #unexpectedResponse:.
        * NNTP.st: Use #errorResponse: and #unexpectedResponse:.
        * SMTP.st: Use #errorResponse:
---
 packages/net/Base.st   |   53 ++++++++++++++++++++++++++++++++++++++++++++---
 packages/net/ChangeLog |    7 ++++++
 packages/net/FTP.st    |    2 +-
 packages/net/NNTP.st   |   13 +++--------
 packages/net/SMTP.st   |    2 +-
 5 files changed, 62 insertions(+), 15 deletions(-)

diff --git a/packages/net/Base.st b/packages/net/Base.st
index eaaa8a3..b767187 100644
--- a/packages/net/Base.st
+++ b/packages/net/Base.st
@@ -765,7 +765,7 @@ Object subclass: NetProtocolInterpreter [
     checkResponse: response [
        <category: 'private'>
        self checkResponse: response
-           ifError: [self protocolError: response statusMessage]
+           ifError: [self errorResponse: response]
     ]
 
     checkResponse: reponse ifError: errorBlock [
@@ -799,11 +799,18 @@ Object subclass: NetProtocolInterpreter [
            signal: 'Login incorrect: ' , messageText
     ]
 
-    protocolError: messageText [
+    errorResponse: aResponse [
        <category: 'private'>
        ^(ProtocolError new)
-           tag: messageText;
-           signal: 'Protocol error: ' , messageText
+           response: aResponse;
+           signal
+    ]
+
+    unexpectedResponse: aResponse [
+       <category: 'private'>
+       ^(UnexpectedResponseError new)
+           response: aResponse;
+           signal
     ]
 
     lineEndConvention [
@@ -1431,9 +1438,27 @@ NetClientError subclass: ConnectionClosedError [
 
 NetClientError subclass: ProtocolError [
     
+    | response |
+
     <category: 'NetClients-Framework'>
     <comment: nil>
 
+    description [
+       <category: 'exception handling'>
+       ^'Protocol Error'
+    ]
+
+    response [
+       <category: 'exception handling'>
+       ^response
+    ]
+
+    response: aResponse [
+       <category: 'exception handling'>
+       response := aResponse.
+        self messageText: '%1: %2' % {self description. response statusMessage}
+    ]
+
     isResumable [
        <category: 'exception handling'>
        ^true
@@ -1442,6 +1467,26 @@ NetClientError subclass: ProtocolError [
 
 
 
+NetClientError subclass: UnexpectedResponseError [
+    
+    | response |
+
+    <category: 'NetClients-Framework'>
+    <comment: nil>
+
+    description [
+       <category: 'exception handling'>
+       ^'Unexpected Response'
+    ]
+
+    isResumable [
+       <category: 'exception handling'>
+       ^false
+    ]
+]
+
+
+
 NetClientError subclass: LoginIncorrectError [
     
     <category: 'NetClients-Framework'>
diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 71d9b2f..d4afc91 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,3 +1,10 @@
+
+       * Base.st: Add response variable to ProtocolError.  Add
+       UnexpectedResponseError.
+       * FTP.st: Use #unexpectedResponse:.
+       * NNTP.st: Use #errorResponse: and #unexpectedResponse:.
+       * SMTP.st: Use #errorResponse:
+
 2011-03-21  Paolo Bonzini  <[email protected]>
 
        * FTP.st: Remove useless override.
diff --git a/packages/net/FTP.st b/packages/net/FTP.st
index e5987fb..d1ae0a1 100644
--- a/packages/net/FTP.st
+++ b/packages/net/FTP.st
@@ -429,7 +429,7 @@ NetProtocolInterpreter subclass: FTPProtocolInterpreter [
        response := self getResponse.
        self checkResponse: response.
        response status = 227 
-           ifFalse: [^self protocolError: response statusMessage].
+           ifFalse: [^self unexpectedResponse: response].
 
        "227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)"
        stream := response statusMessage readStream.
diff --git a/packages/net/NNTP.st b/packages/net/NNTP.st
index 272002e..b32062d 100644
--- a/packages/net/NNTP.st
+++ b/packages/net/NNTP.st
@@ -523,12 +523,10 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
        <category: 'private'>
        | textFollows |
        textFollows := self checkResponse: response
-                   ifError: 
-                       [self protocolError: response statusMessage.
-                       false].
+                   ifError: [self errorResponse: response. ^self].
        textFollows ifFalse: [^self].
        self skipMessageUntilPeriod.
-       ^self protocolError: 'Unexpected reply: ' , response statusMessage
+       self unexpectedResponse: response
     ]
 
     checkResponse: response ifError: errorBlock [
@@ -745,11 +743,8 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
        <category: 'private'>
        | textFollows |
        textFollows := self checkResponse: response
-                   ifError: 
-                       [self protocolError: response statusMessage.
-                       false].
-       textFollows 
-           ifFalse: [^self protocolError: 'Unexpected reply: ' , response 
statusMessage]
+                   ifError: [self errorResponse: response. ^self].
+       textFollows ifFalse: [self unexpectedResponse: response. ^self]
     ]
 
     defaultPortNumber [
diff --git a/packages/net/SMTP.st b/packages/net/SMTP.st
index 59a6b4d..8b15875 100644
--- a/packages/net/SMTP.st
+++ b/packages/net/SMTP.st
@@ -425,7 +425,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
                        ["User not local; please try"
 
                        self noSuchRecipientNotify: forwardPath]
-                   ifFalse: [self protocolError: response statusMessage]]
+                   ifFalse: [self errorResponse: response]]
     ]
 
     smtpReset [
-- 
1.7.4


>From 77368283a0184c9e8d9a1b09cda8530ad3c8f7c8 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2011 11:02:07 +0100
Subject: [PATCH 4/5] use ProtocolError for invalid redirects, add location to 
redirect notification

packages/net:
2011-03-21  Paolo Bonzini  <[email protected]>

        * Base.st: Add ProtocolNotification.
        * HTTP.st: Use it for redirects.
        * URIResolver.st: Simplify.

2011-03-21  Paolo Bonzini  <[email protected]>
---
 packages/net/Base.st        |   31 +++++++++++++++++++++++++++++++
 packages/net/ChangeLog      |    7 +++++++
 packages/net/HTTP.st        |   29 +++++++++++++++++++++--------
 packages/net/URIResolver.st |   42 ++++++++++++++++++------------------------
 4 files changed, 77 insertions(+), 32 deletions(-)

diff --git a/packages/net/Base.st b/packages/net/Base.st
index b767187..fced264 100644
--- a/packages/net/Base.st
+++ b/packages/net/Base.st
@@ -1436,6 +1436,37 @@ NetClientError subclass: ConnectionClosedError [
 
 
 
+Notification subclass: ProtocolNotification [
+    
+    | response |
+
+    <category: 'NetClients-Framework'>
+    <comment: nil>
+
+    description [
+       <category: 'exception handling'>
+       ^'Protocol Notification'
+    ]
+
+    response [
+       <category: 'exception handling'>
+       ^response
+    ]
+
+    response: aResponse [
+       <category: 'exception handling'>
+       response := aResponse.
+        self messageText: '%1: %2' % {self description. response statusMessage}
+    ]
+
+    isResumable [
+       <category: 'exception handling'>
+       ^true
+    ]
+]
+
+
+
 NetClientError subclass: ProtocolError [
     
     | response |
diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index d4afc91..522916f 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,3 +1,10 @@
+2011-03-21  Paolo Bonzini  <[email protected]>
+
+       * Base.st: Add ProtocolNotification.
+       * HTTP.st: Use it for redirects.
+       * URIResolver.st: Simplify.
+
+2011-03-21  Paolo Bonzini  <[email protected]>
 
        * Base.st: Add response variable to ProtocolError.  Add
        UnexpectedResponseError.
diff --git a/packages/net/HTTP.st b/packages/net/HTTP.st
index 2aa1832..e839de1 100644
--- a/packages/net/HTTP.st
+++ b/packages/net/HTTP.st
@@ -346,9 +346,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 
                status = 302    "Moved Temporarily"]) 
            ifTrue: 
-               [| location |
-               location := response fieldAt: 'Location' ifAbsent: [nil].
-               ^self redirectionNotify: location value].
+               [^self redirectionNotify: response ifInvalid: errorBlock].
        status = 303 
            ifTrue: 
                ["Method"
@@ -438,11 +436,16 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
        ^errorBlock value
     ]
 
-    redirectionNotify: redirectLocation [
+    redirectionNotify: aResponse ifInvalid: errorBlock [
        <category: 'private'>
-       ^(HTTPRedirection new)
-           tag: redirectLocation;
-           signal
+        | ex |
+       ex := HTTPRedirection new.
+       ex response: aResponse.
+        ex location isNil
+            ifTrue: [ ^errorBlock value ]
+            ifFalse: [
+                ex tag: ex location. "backwards compatibility"
+               ex signal ].
     ]
 ]
 
@@ -547,10 +550,20 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 
 Namespace current: NetClients.HTTP [
 
-Notification subclass: HTTPRedirection [
+ProtocolNotification subclass: HTTPRedirection [
     
     <category: 'NetClients-HTTP'>
     <comment: nil>
+
+    | location |
+
+    location [
+        location isNil ifFalse: [^location].
+        response isNil ifTrue: [^nil].
+       location := response fieldAt: 'Location' ifAbsent: [nil].
+        location isNil ifFalse: [location := location value].
+       ^location
+    ]
 ]
 
 ]
diff --git a/packages/net/URIResolver.st b/packages/net/URIResolver.st
index 247f2d8..b5cf81a 100644
--- a/packages/net/URIResolver.st
+++ b/packages/net/URIResolver.st
@@ -529,18 +529,15 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
                do: 
                    [:ex | 
                    | location |
-                   location := ex tag.
-                   location isNil 
-                       ifTrue: [^self errorContents: 'Moved elsewhere']
-                       ifFalse: 
-                           [client reporter statusString: 'Redirecting'.
-                           stream close.
-                           stream := nil.
-                           tmpFile exists ifTrue: [tmpFile remove].
-                           ^(self class on: (url construct: (URL fromString: 
location)))
-                               noCache: self noCache;
-                               reporter: self reporter;
-                               contents]]] 
+                   location := ex location.
+                   client reporter statusString: 'Redirecting'.
+                   stream close.
+                   stream := nil.
+                   tmpFile exists ifTrue: [tmpFile remove].
+                   ^(self class on: (url construct: (URL fromString: 
location)))
+                       noCache: self noCache;
+                       reporter: self reporter;
+                       contents]] 
                ensure: [stream isNil ifFalse: [stream close]].
        ^protocolError 
            ifTrue: 
@@ -609,18 +606,15 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
                do: 
                    [:ex | 
                    | location |
-                   location := ex tag.
-                   location isNil 
-                       ifTrue: [^self errorContents: 'Moved elsewhere']
-                       ifFalse: 
-                           [client reporter statusString: 'Redirecting'.
-                           stream close.
-                           stream := nil.
-                           tmpFile exists ifTrue: [tmpFile remove].
-                           ^(self class on: (url construct: (URL fromString: 
location)))
-                               noCache: self noCache;
-                               reporter: self reporter;
-                               getHead]]] 
+                   location := ex location.
+                   client reporter statusString: 'Redirecting'.
+                   stream close.
+                   stream := nil.
+                   tmpFile exists ifTrue: [tmpFile remove].
+                   ^(self class on: (url construct: (URL fromString: 
location)))
+                       noCache: self noCache;
+                       reporter: self reporter;
+                       getHead]] 
                ensure: [stream isNil ifFalse: [stream close]].
        ^protocolError 
            ifTrue: 
-- 
1.7.4


>From a0bdf65d33aa63ec97a646d1b767c529ad89da6d Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2011 11:02:46 +0100
Subject: [PATCH 5/5] reorder ProtocolError handlers for ANSI compatibility

packages/net:
2011-03-21  Paolo Bonzini  <[email protected]>

        * URIResolver.st: Reorder exceptions.
---
 packages/net/ChangeLog      |    4 ++++
 packages/net/URIResolver.st |    8 ++++----
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 522916f..165fefe 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,9 @@
 2011-03-21  Paolo Bonzini  <[email protected]>
 
+       * URIResolver.st: Reorder exceptions.
+
+2011-03-21  Paolo Bonzini  <[email protected]>
+
        * Base.st: Add ProtocolNotification.
        * HTTP.st: Use it for redirects.
        * URIResolver.st: Simplify.
diff --git a/packages/net/URIResolver.st b/packages/net/URIResolver.st
index b5cf81a..a01d80d 100644
--- a/packages/net/URIResolver.st
+++ b/packages/net/URIResolver.st
@@ -518,13 +518,13 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
        [
        [response := requestBlock value: requestHeaders value: stream]
                ensure: [client close]] 
-               on: NetClientError
-               do: [:ex | ^self errorContents: ex messageText]
                on: ProtocolError
                do: 
                    [:ex | 
                    protocolError := true.
                    ex pass]
+               on: NetClientError
+               do: [:ex | ^self errorContents: ex messageText]
                on: HTTP.HTTPRedirection
                do: 
                    [:ex | 
@@ -595,13 +595,13 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
                    requestHeaders: requestHeaders
                    into: stream] 
                ensure: [client close]] 
-               on: NetClientError
-               do: [:ex | ^self errorContents: ex messageText]
                on: ProtocolError
                do: 
                    [:ex | 
                    protocolError := true.
                    ex pass]
+               on: NetClientError
+               do: [:ex | ^self errorContents: ex messageText]
                on: HTTP.HTTPRedirection
                do: 
                    [:ex | 
-- 
1.7.4

_______________________________________________
help-smalltalk mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to