MIgrating pier link checker to Pharo 3
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 ]
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@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 ]
participants (2)
-
Stephan Eggermont -
Sven Van Caekenberghe