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 <step...@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 ]