[Pharo-users] MIgrating pier link checker to Pharo 3

Sven Van Caekenberghe sven at stfx.eu
Wed Mar 5 08:17:04 EST 2014


Stephan,

I am not sure what you are trying to achieve with HEAD and Location, I have never seen that. Are you trying to resolve redirects ? There should be no need for that since Zn follows them by default.

But to answer your questions, this code does work:

ZnClient new 
  url: 'http://cognitive-edge.com';
  timeout: 5;
  method: #HEAD; 
  execute;
  response.

A timeout of 1 second was too short. Also #executeWithTimeout is internal API, you should use #execute. There was also a typo in your URL (2 colons).

For the other URL, the code also works:

ZnClient new 
  url: 'http://humane-assessment.com/';
  timeout: 1;
  method: #HEAD; 
  execute;
  response.

However this site simply refuses to service HEAD requests, which is a valid response. You can see the same with curl:

$ curl -X HEAD -D - http://humane-assessment.com/
HTTP/1.1 501 Not Implemented
Date: Wed, 05 Mar 2014 13:07:48 GMT
Server: Zinc HTTP Components 1.0
Content-Type: text/plain
Content-Length: 512
Via: 1.1 humane-assessment.com
Vary: Accept-Encoding
Connection: close

Note that you can also send #location to a ZnResponse instance. If you don't have to set the timeout, the following is even shorter:

ZnEasy head: 'http://cognitive-edge.com'.

HTH,

Sven

On 05 Mar 2014, at 13:58, Stephan Eggermont <stephan at stack.nl> wrote:

> I’m trying to migrate the Pier link checker to Pharo 3, going from
> HTTPSocket to ZnClient. Looks like a good API improvement, but some things
> are still different. http://humane-assessment.com claims not to  support
> this head request (501), as does http:://cognitive-edge.com (404).
> Anyone know what I should change? 
> 
> Stephan
> 
> httpHead: aString
> 	"Answer an array with response code and effective URL, or nil."
> 
> 	| response |
> 		response := ZnClient new 
> 		url: aString trimBoth;
> 		timeout: 1;
> 		method: #HEAD; 
> 		ifFail: [ ^Array with: 404 with: aString ];
> 		executeWithTimeout;
> 		response.
> 	^ Array with: response code with: (response headers at: 'Location' ifAbsent: [aString])	.
> 
> httpHead: aString
> 	"Answer an array with response code and effective URL, or nil."
> 
> 	| url socket |
> 	url := Url absoluteFromText: aString.
> 	(url isKindOf: HttpUrl)
> 		ifFalse: [ ^ nil ].
> 	[ socket := HTTPSocket
> 		initHTTPSocket: url
> 		wait: (HTTPSocket deadlineSecs: 1)
> 		ifError: [ ^ Array with: 404 with: aString ] ]
> 			on: NameLookupFailure
> 			do: [ :err | ^ Array with: 404 with: aString ].
> 	^ [ [ socket sendCommand: ('HEAD ' , ((HTTPSocket shouldUseProxy: url authority)
> 		ifTrue: [ url printString ] ifFalse: [ url fullPath ]) ,  ' HTTP/1.0' , String crlf) ,
> 			('Host: ' , url authority , String crlf) , 
> 			(HTTPSocket userAgentString , String crlf) ,
> 			(HTTPSocket classPool at: #HTTPProxyCredentials).
> 		socket header: (socket getResponseUpTo: String crlf , String crlf) first.
> 		Array with: socket responseCode asInteger with: (socket getHeader: 'location' default: aString) ]
> 			on: Error do: [ :err | nil ] ]
> 			ensure: [ socket destroy ]





More information about the Pharo-users mailing list