Hi Paolo,

the first patches are various refactorings to the URIResolver code, the later
fixes some bugs (okay you have pushed a fix for the SSL issue anyway) that I
have encountered while trying to use the HTTPClient for SoapOpera.

cheers
        holger
>From 7c44217798e5572ceb06a224dd97da0407d3d374 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Sun, 6 Mar 2011 16:03:17 +0100
Subject: [PATCH 1/7] netclients: Create URIResolver>>#defaultHeaders

Align the HTTP GET/POST/HEAD code and share the HTTP header
construction code in those.
---
 packages/net/ChangeLog      |    4 ++++
 packages/net/URIResolver.st |   26 ++++++++++++++------------
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 0fbd2e5..84e6d35 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-06  Holger Hans Peter Freyther  <[email protected]>
+
+	* URIResolver.st: Add #defaultHeaders for HTTP.
+
 2011-01-11  Paolo Bonzini  <[email protected]>
 
 	* gnutls-wrapper.c: Support older GnuTLS.
diff --git a/packages/net/URIResolver.st b/packages/net/URIResolver.st
index f3eafbd..1c52658 100644
--- a/packages/net/URIResolver.st
+++ b/packages/net/URIResolver.st
@@ -75,6 +75,17 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	^entity stream
     ]
 
+    defaultHeaders [
+	"The default headers for HTTP like requests"
+	| requestHeaders |
+	requestHeaders := OrderedCollection new.
+	requestHeaders add: 'User-Agent: GNU-Smalltalk/' , Smalltalk version.
+	requestHeaders add: 'Accept: text/html, image/gif, */*; q=0.2'.
+	noCache ifTrue: [requestHeaders add: 'Pragma: no-cache'].
+
+	^ requestHeaders
+    ]
+
     connectClient [
 	<category: 'private'>
 	| host |
@@ -494,11 +505,8 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
     requestHttpContents: urlString [
 	<category: 'http accessing'>
 	| requestHeaders tmpFile stream protocolError response string |
-	requestHeaders := OrderedCollection new.
-	requestHeaders add: 'User-Agent: GNU-Smalltalk/' , Smalltalk version.
-	requestHeaders add: 'Accept: text/html, image/gif, */*; q=0.2'.
+	requestHeaders := self defaultHeaders.
 	requestHeaders add: 'Host: ' , url host.
-	noCache ifTrue: [requestHeaders add: 'Pragma: no-cache'].
 	client reporter statusString: 'Connecting'.
 	protocolError := false.
 	client reporter 
@@ -568,11 +576,8 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
     requestHttpHead: urlString [
 	<category: 'http accessing'>
 	| requestHeaders tmpFile stream protocolError response string |
-	requestHeaders := OrderedCollection new.
-	requestHeaders add: 'User-Agent: GNU-Smalltalk/' , Smalltalk version.
-	requestHeaders add: 'Accept: text/html, image/gif, */*; q=0.2'.
+	requestHeaders := self defaultHeaders.
 	requestHeaders add: 'Host: ' , url host.
-	noCache ifTrue: [requestHeaders add: 'Pragma: no-cache'].
 	client reporter statusString: 'Connecting'.
 	client reporter 
 	    statusString: 'Connect: Host contacted. Waiting for reply...'.
@@ -645,10 +650,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
     postHttpContents: contents urlString: urlString [
 	<category: 'http accessing'>
 	| requestHeaders tmpFile stream protocolError response string |
-	requestHeaders := OrderedCollection new.
-	requestHeaders add: 'User-Agent: GNU-Smalltalk/' , Smalltalk version.
-	requestHeaders add: 'Accept: text/html, image/gif, */*; q=0.2'.
-	noCache ifTrue: [requestHeaders add: 'Pragma: no-cache'].
+	requestHeaders := self defaultHeaders.
 	client reporter 
 	    statusString: 'Connect: Host contacted. Waiting for reply...'.
 	stream := self tmpFile.
-- 
1.7.4

>From 86946b6637b1e61f80e6d69d51f90ea886b12ae2 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Sun, 6 Mar 2011 16:06:40 +0100
Subject: [PATCH 2/7] netclients: Always set Host in the HTTP header

It looks like a mistake that the post code did not
set the host header. Fix it by setting it in the
defaultHeaders method.
---
 packages/net/ChangeLog      |    4 ++++
 packages/net/URIResolver.st |    3 +--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 84e6d35..3453547 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,9 @@
 2011-03-06  Holger Hans Peter Freyther  <[email protected]>
 
+	* URIResolver.st: Always set the 'Host' header for HTTP.
+
+2011-03-06  Holger Hans Peter Freyther  <[email protected]>
+
 	* URIResolver.st: Add #defaultHeaders for HTTP.
 
 2011-01-11  Paolo Bonzini  <[email protected]>
diff --git a/packages/net/URIResolver.st b/packages/net/URIResolver.st
index 1c52658..c2dc296 100644
--- a/packages/net/URIResolver.st
+++ b/packages/net/URIResolver.st
@@ -81,6 +81,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	requestHeaders := OrderedCollection new.
 	requestHeaders add: 'User-Agent: GNU-Smalltalk/' , Smalltalk version.
 	requestHeaders add: 'Accept: text/html, image/gif, */*; q=0.2'.
+	requestHeaders add: 'Host: ' , url host.
 	noCache ifTrue: [requestHeaders add: 'Pragma: no-cache'].
 
 	^ requestHeaders
@@ -506,7 +507,6 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	<category: 'http accessing'>
 	| requestHeaders tmpFile stream protocolError response string |
 	requestHeaders := self defaultHeaders.
-	requestHeaders add: 'Host: ' , url host.
 	client reporter statusString: 'Connecting'.
 	protocolError := false.
 	client reporter 
@@ -577,7 +577,6 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	<category: 'http accessing'>
 	| requestHeaders tmpFile stream protocolError response string |
 	requestHeaders := self defaultHeaders.
-	requestHeaders add: 'Host: ' , url host.
 	client reporter statusString: 'Connecting'.
 	client reporter 
 	    statusString: 'Connect: Host contacted. Waiting for reply...'.
-- 
1.7.4

>From b062f5753ede71723cc65204059c3dfa6ecc841a Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Sun, 6 Mar 2011 18:10:46 +0100
Subject: [PATCH 3/7] netclient: URIResolver>>#postHttpContents align with getHttpContents

---
 packages/net/ChangeLog      |    4 ++++
 packages/net/URIResolver.st |    7 ++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 3453547..be27e30 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,9 @@
 2011-03-06  Holger Hans Peter Freyther  <[email protected]>
 
+	* URIResolver.st: Align GET and POST for HTTP.
+
+2011-03-06  Holger Hans Peter Freyther  <[email protected]>
+
 	* URIResolver.st: Always set the 'Host' header for HTTP.
 
 2011-03-06  Holger Hans Peter Freyther  <[email protected]>
diff --git a/packages/net/URIResolver.st b/packages/net/URIResolver.st
index c2dc296..d126c7c 100644
--- a/packages/net/URIResolver.st
+++ b/packages/net/URIResolver.st
@@ -650,11 +650,12 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	<category: 'http accessing'>
 	| requestHeaders tmpFile stream protocolError response string |
 	requestHeaders := self defaultHeaders.
+	client reporter statusString: 'Connecting'.
+	protocolError := false.
 	client reporter 
 	    statusString: 'Connect: Host contacted. Waiting for reply...'.
 	stream := self tmpFile.
 	tmpFile := stream file.
-	protocolError := false.
 	
 	[
 	[
@@ -698,14 +699,14 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 		    body: string;
 		    url: url;
 		    canCache: false;
-		    guessMimeTypeFromResponse: response;
+		    guessMimeType;
 		    yourself]
 	    ifFalse: 
 		[(WebEntity new)
 		    url: url;
 		    canCache: false;
 		    localFileName: tmpFile name;
-		    guessMimeTypeFromResponse: response;
+		    guessMimeType;
 		    yourself]
     ]
 
-- 
1.7.4

>From 20123694392464a73dc613017cd2edcfef391f4b Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Mon, 7 Mar 2011 15:33:33 +0100
Subject: [PATCH 4/7] netclient: Refactor code for handling a HTTP response

---
 packages/net/ChangeLog      |    4 ++
 packages/net/URIResolver.st |   89 +++++++++++--------------------------------
 2 files changed, 26 insertions(+), 67 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index be27e30..bdf845e 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-07  Holger Hans Peter Freyther  <[email protected]>
+
+	* URIResolver.st: Add #doHTTPRequest and use it.
+
 2011-03-06  Holger Hans Peter Freyther  <[email protected]>
 
 	* URIResolver.st: Align GET and POST for HTTP.
diff --git a/packages/net/URIResolver.st b/packages/net/URIResolver.st
index d126c7c..247f2d8 100644
--- a/packages/net/URIResolver.st
+++ b/packages/net/URIResolver.st
@@ -503,8 +503,8 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	^self requestHttpContents: url requestString
     ]
 
-    requestHttpContents: urlString [
-	<category: 'http accessing'>
+    doHTTPRequest: requestBlock onSuccess: successBlock [
+	<category: 'private'>
 	| requestHeaders tmpFile stream protocolError response string |
 	requestHeaders := self defaultHeaders.
 	client reporter statusString: 'Connecting'.
@@ -516,10 +516,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	
 	[
 	[
-	[response := client 
-		    get: urlString
-		    requestHeaders: requestHeaders
-		    into: stream] 
+	[response := requestBlock value: requestHeaders value: stream]
 		ensure: [client close]] 
 		on: NetClientError
 		do: [:ex | ^self errorContents: ex messageText]
@@ -556,12 +553,22 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 		    guessMimeType;
 		    yourself]
 	    ifFalse: 
-		[(WebEntity new)
-		    url: url;
-		    canCache: noCache not;
-		    localFileName: tmpFile name;
-		    guessMimeType;
-		    yourself]
+		[|ent |
+		    ent := (WebEntity new)
+			    url: url;
+			    localFileName: tmpFile name;
+			    canCache: noCache not;
+			    guessMimeType;
+			    yourself.
+		    successBlock value: ent.
+		    ent]
+    ]
+
+    requestHttpContents: urlString [
+	<category: 'http accessing'>
+	^ self doHTTPRequest: [:requestHeaders :stream |
+		    client  get: urlString requestHeaders: requestHeaders into: stream]
+	       onSuccess: [:ent | ]
     ]
 
     getHttpHead [
@@ -648,66 +655,14 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 
     postHttpContents: contents urlString: urlString [
 	<category: 'http accessing'>
-	| requestHeaders tmpFile stream protocolError response string |
-	requestHeaders := self defaultHeaders.
-	client reporter statusString: 'Connecting'.
-	protocolError := false.
-	client reporter 
-	    statusString: 'Connect: Host contacted. Waiting for reply...'.
-	stream := self tmpFile.
-	tmpFile := stream file.
-	
-	[
-	[
-	[response := client 
-		    post: urlString
+	^ self doHTTPRequest: [:requestHeaders :stream |
+		    client post: urlString
 		    type: contents type
 		    data: contents asStringOrByteArray
 		    binary: contents isBinary
 		    requestHeaders: requestHeaders
 		    into: stream] 
-		ensure: [client close]] 
-		on: NetClientError
-		do: [:ex | ^self errorContents: ex messageText]
-		on: ProtocolError
-		do: 
-		    [:ex | 
-		    protocolError := true.
-		    ex pass]
-		on: HTTP.HTTPRedirection
-		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]]] 
-		ensure: [stream isNil ifFalse: [stream close]].
-	^protocolError 
-	    ifTrue: 
-		[string := tmpFile contents.
-		tmpFile remove.
-		(WebEntity new)
-		    body: string;
-		    url: url;
-		    canCache: false;
-		    guessMimeType;
-		    yourself]
-	    ifFalse: 
-		[(WebEntity new)
-		    url: url;
-		    canCache: false;
-		    localFileName: tmpFile name;
-		    guessMimeType;
-		    yourself]
+		onSuccess: [:ent | ent canCache: false ]
     ]
 
     emptyMessage [
-- 
1.7.4

>From 6579388f0ad3c9895ded4409def4b7869a3c8789 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Mon, 7 Mar 2011 16:07:06 +0100
Subject: [PATCH 5/7] netclient: Unbreak the GnuTLS support by calling gnutls_set_default_priority

Older versions of GnuTLS lack the gnutls_priority_set_direct method and in
6c08f8dabb50d7c64a4ee193bf42eac3d9be9130 we have removed that call and that
makes the code not work on newer GnuTLS. Use the gnutls_set_default_priority
method to use the default encoding and algorithms.
---
 packages/net/ChangeLog        |    4 ++++
 packages/net/gnutls-wrapper.c |    1 +
 2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index bdf845e..a1c75a9 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,9 @@
 2011-03-07  Holger Hans Peter Freyther  <[email protected]>
 
+	* gnutls-wrapper.c: Use gnutls_set_default_priority.
+
+2011-03-07  Holger Hans Peter Freyther  <[email protected]>
+
 	* URIResolver.st: Add #doHTTPRequest and use it.
 
 2011-03-06  Holger Hans Peter Freyther  <[email protected]>
diff --git a/packages/net/gnutls-wrapper.c b/packages/net/gnutls-wrapper.c
index 9163c32..0468aa4 100644
--- a/packages/net/gnutls-wrapper.c
+++ b/packages/net/gnutls-wrapper.c
@@ -147,6 +147,7 @@ main (int argc, char **argv)
 
   sockets_init ();
   gnutls_init (&session, GNUTLS_CLIENT);
+  gnutls_set_default_priority(session);
 
   gnutls_anon_allocate_client_credentials (&anon_cred);
   gnutls_credentials_set (session, GNUTLS_CRD_ANON, anon_cred);
-- 
1.7.4

>From fde87bf86e79191193037dc0f7398426af2219c6 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Mon, 7 Mar 2011 16:55:10 +0100
Subject: [PATCH 6/7] netclient: Fix DNU when connecting to non existing server

NetClients.HTTP.HTTPClient connectToTost: 'blafoo.gnu.org' port: 80.
triggered a DNU.
---
 packages/net/Base.st   |    2 +-
 packages/net/ChangeLog |    4 ++++
 2 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/packages/net/Base.st b/packages/net/Base.st
index b37298b..4ef04b4 100644
--- a/packages/net/Base.st
+++ b/packages/net/Base.st
@@ -437,7 +437,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 			ex.
 			messageText := ex messageText.
 			ex return: nil].
-	connection isNil ifTrue: [^self connectionFailedError: messageText].
+	connection isNil ifTrue: [^self clientPI connectionFailedError: messageText].
 	self connectionStream: connection.
 	self clientPI connected.
     ]
diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index a1c75a9..06b170e 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,5 +1,9 @@
 2011-03-07  Holger Hans Peter Freyther  <[email protected]>
 
+	* Base.st: Call connectionFailedError of NetProtocolInterpreter.
+
+2011-03-07  Holger Hans Peter Freyther  <[email protected]>
+
 	* gnutls-wrapper.c: Use gnutls_set_default_priority.
 
 2011-03-07  Holger Hans Peter Freyther  <[email protected]>
-- 
1.7.4

>From 90c4880bd2055ba57cf1e8f9d44780b8ed88d6e6 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <[email protected]>
Date: Thu, 10 Mar 2011 16:10:50 +0100
Subject: [PATCH 7/7] net: Flush the stream in the POST method

If the stream is not flushed the data might not be transfered
to the HTTP Server and our waiting for a response will not be
very successfull.
---
 packages/net/ChangeLog |    4 ++++
 packages/net/HTTP.st   |    2 +-
 2 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/packages/net/ChangeLog b/packages/net/ChangeLog
index 06b170e..74eefc3 100644
--- a/packages/net/ChangeLog
+++ b/packages/net/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-10  Holger Hans Peter Freyther  <[email protected]>
+
+	* HTTP.st: Flush the binary stream.
+
 2011-03-07  Holger Hans Peter Freyther  <[email protected]>
 
 	* Base.st: Call connectionFailedError of NetProtocolInterpreter.
diff --git a/packages/net/HTTP.st b/packages/net/HTTP.st
index 2f83fac..dc0653c 100644
--- a/packages/net/HTTP.st
+++ b/packages/net/HTTP.st
@@ -293,7 +293,7 @@ Copyright (c) Kazuki Yasumatsu, 1995. All rights reserved.
 	    cr.
 	self putRequestHeaders: requestHeaders.
 	binary 
-	    ifTrue: [self connectionStream stream nextPutAll: data]
+	    ifTrue: [(self connectionStream stream) nextPutAll: data; flush]
 	    ifFalse: [self nextPutAll: data].
 	^self readResponseInto: aStream
     ]
-- 
1.7.4

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

Reply via email to