ZnClient get then post?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

ZnClient get then post?

Tim Mackinnon
Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).

It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?

Tim

| znc resp |

(znc := ZnClient new) logToTranscript.

resp := znc
        url: 'https://trello.com/1/authorize';
        queryAt: 'scope' put: 'read';
        queryAt: 'expiration' put: '1day';
        queryAt: 'name' put: 'Pharo App';
        "queryAt: 'response_type' put: 'token';"
        queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
        get;
        request;
        response.
       
soup := (Soup fromString:  resp entity).
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].

resp := znc
        url: 'https://trello.com/1/token/approve';
        formAt: 'approve' put: 'Allow';
        formAt: 'requestKey' put: (key attributeAt: 'value');
        formAt: 'signature' put: (sig attributeAt: 'value');
        post;
        request;
        response.
Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Paul DeBruicker
Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.


Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?


Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  

The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.


Good luck

Paul





Tim Mackinnon wrote
Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).

It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?

Tim

| znc resp |

(znc := ZnClient new) logToTranscript.

resp := znc
        url: 'https://trello.com/1/authorize';
        queryAt: 'scope' put: 'read';
        queryAt: 'expiration' put: '1day';
        queryAt: 'name' put: 'Pharo App';
        "queryAt: 'response_type' put: 'token';"
        queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
        get;
        request;
        response.
       
soup := (Soup fromString:  resp entity).
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].

resp := znc
        url: 'https://trello.com/1/token/approve';
        formAt: 'approve' put: 'Allow';
        formAt: 'requestKey' put: (key attributeAt: 'value');
        formAt: 'signature' put: (sig attributeAt: 'value');
        post;
        request;
        response.
Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Tim Mackinnon
Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?).

The get portion and decoding parameters is all working perfectly, it's the post that has me confused.

If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage).

I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that).

I guess I will have to debug through the code.

Tim

Sent from my iPhone

On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote:

Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.


Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?


Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  

The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.


Good luck

Paul





Tim Mackinnon wrote
Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).

It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?

Tim

| znc resp |

(znc := ZnClient new) logToTranscript.

resp := znc
        url: 'https://trello.com/1/authorize';
        queryAt: 'scope' put: 'read';
        queryAt: 'expiration' put: '1day';
        queryAt: 'name' put: 'Pharo App';
        "queryAt: 'response_type' put: 'token';"
        queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
        get;
        request;
        response.
       
soup := (Soup fromString:  resp entity).
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].

resp := znc
        url: 'https://trello.com/1/token/approve';
        formAt: 'approve' put: 'Allow';
        formAt: 'requestKey' put: (key attributeAt: 'value');
        formAt: 'signature' put: (sig attributeAt: 'value');
        post;
        request;
        response.



If you reply to this email, your message will be added to the discussion below:
http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
To unsubscribe from ZnClient get then post?, click here.
NAML
Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Tim Mackinnon
In reply to this post by Paul DeBruicker
Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“?

Not really sure how to debug that - guess I might have to learn how to use wireshark.

Tim

On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote:

Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?).

The get portion and decoding parameters is all working perfectly, it's the post that has me confused.

If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage).

I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that).

I guess I will have to debug through the code.

Tim

Sent from my iPhone

On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote:

Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.


Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?


Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  

The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.


Good luck

Paul





Tim Mackinnon wrote
Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).

It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?

Tim

| znc resp |

(znc := ZnClient new) logToTranscript.

resp := znc
        url: 'https://trello.com/1/authorize';
        queryAt: 'scope' put: 'read';
        queryAt: 'expiration' put: '1day';
        queryAt: 'name' put: 'Pharo App';
        "queryAt: 'response_type' put: 'token';"
        queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
        get;
        request;
        response.
       
soup := (Soup fromString:  resp entity).
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].

resp := znc
        url: 'https://trello.com/1/token/approve';
        formAt: 'approve' put: 'Allow';
        formAt: 'requestKey' put: (key attributeAt: 'value');
        formAt: 'signature' put: (sig attributeAt: 'value');
        post;
        request;
        response.



If you reply to this email, your message will be added to the discussion below:
http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
To unsubscribe from ZnClient get then post?, click here.
NAML

Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Paul DeBruicker
Are you able to get the contents of

ZnEasy get: 'https://www.google.com' 


?  



If so then is not an SSL issue.  If not you'll need to use charles proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded https requests.  Wireshark only has encrypted packets.


Are you doing the #resetEntity prior to setting the url or other parameters when doing your POST?



Tim Mackinnon wrote
Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“?

Not really sure how to debug that - guess I might have to learn how to use wireshark.

Tim

On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote:

> Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?).
>
> The get portion and decoding parameters is all working perfectly, it's the post that has me confused.
>
> If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage).
>
> I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that).
>
> I guess I will have to debug through the code.
>
> Tim
>
> Sent from my iPhone
>
> On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote:
>
>> Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.
>>
>>
>> Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?
>>
>>
>> Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  
>>
>> The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.
>>
>>
>> Good luck
>>
>> Paul
>>
>>
>>
>>
>>
>> Tim Mackinnon wrote
>> Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).
>>
>> It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?
>>
>> Tim
>>
>> | znc resp |
>>
>> (znc := ZnClient new) logToTranscript.
>>
>> resp := znc
>>         url: 'https://trello.com/1/authorize';
>>         queryAt: 'scope' put: 'read';
>>         queryAt: 'expiration' put: '1day';
>>         queryAt: 'name' put: 'Pharo App';
>>         "queryAt: 'response_type' put: 'token';"
>>         queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
>>         get;
>>         request;
>>         response.
>>        
>> soup := (Soup fromString:  resp entity).
>> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
>> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
>>
>> resp := znc
>>         url: 'https://trello.com/1/token/approve';
>>         formAt: 'approve' put: 'Allow';
>>         formAt: 'requestKey' put: (key attributeAt: 'value');
>>         formAt: 'signature' put: (sig attributeAt: 'value');
>>         post;
>>         request;
>>         response.
>>
>>
>> If you reply to this email, your message will be added to the discussion below:
>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
>> To unsubscribe from ZnClient get then post?, click here.
>> NAML
Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Tim Mackinnon
Hi Paul - yes that ZnEasy call works fine - in my case I am trying to read some data from Trello.com and so you do an initial request with an application key and then you authorise an operation with some parameters to get back a token to use for private requests.

The sequence I am using is this:

| znc resp soup key sig |

(znc := ZnClient new) logToTranscript.

resp := znc
queryAt: 'scope' put: 'read';
queryAt: 'expiration' put: '1day';
queryAt: 'name' put: 'Pharo App';
queryAt: 'response_type' put: 'token';
queryAt: ‘key' put: 'xxxxxxx1d588819825d57da6dad4dd';
get;
response.
soup := (Soup fromString:  resp entity).
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].

Transcript cr; cr; show: (key attributeAt: 'value'); cr; show: (sig attributeAt: 'value'); cr; cr.

resp := znc 
resetEntity;
url: '/1/token/approve';
formAt: 'approve' put: 'Allow';
formAt: 'requestKey' put: (key attributeAt: 'value');
formAt: 'signature' put: (sig attributeAt: 'value');
post;
response.


If I look at the logging in the transcript - the first part works fine:

2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /1/authorize?response_type=token&key=xxxxxxxxxx1d588819825d57da6dad4dd&scope=read&name=Pharo%20App&expiration=1day)
2014-06-25 14:50:37 042813 D Sent headers
Accept: */*
User-Agent: Zinc HTTP Components 1.0

2014-06-25 14:50:37 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 2199B)
 …..

Its the next bit of the log which is doing something weird - and showing a resource moved - so I wonder if the server is expecting something extra? The transcript is showing I have extracted my key and signature to populate my form and then I see the 302 status code?

xxxxxx1bf70c02d829c9541f0c3c
xxxxxx5437639/0f28401bf858e7f623c971a45b77291dc113988782


2014-06-25 14:50:37 042813 I Wrote a ZnRequest(POST /1/token/approve)
2014-06-25 14:50:37 042813 D Sent headers
User-Agent: Zinc HTTP Components 1.0
Content-Length: 146
Content-Type: application/x-www-form-urlencoded
Accept: */*

2014-06-25 14:50:37 042813 I Read a ZnResponse(302 Moved Temporarily text/plain;charset=UTF-8 35B)
2014-06-25 14:50:37 042813 D Received headers
X-Frame-Options: DENY
Content-Length: 35
Content-Type: text/plain; charset=UTF-8
X-Powered-By: Express
X-Content-Type-Options: nosniff
Location: /
Cache-Control: no-store, no-cache
Strict-Transport-Security: max-age=15768000
Date: Wed, 25 Jun 2014 13:50:37 GMT
X-Xss-Protection: 1; mode=block
Vary: Accept, Accept-Encoding

2014-06-25 14:50:37 042813 D Redirecting to https://trello.com:443/
2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /)
2014-06-25 14:50:37 042813 D Sent headers
User-Agent: Zinc HTTP Components 1.0
Accept: */*

2014-06-25 14:50:38 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 147886B)
2014-06-25 14:50:38 042813 D Received headers
X-Frame-Options: DENY
Content-Length: 147886
Set-Cookie: sup=1; Path=/; Expires=Thu, 25 Jun 2015 13:50:37 GMT
Content-Type: text/html; charset=utf-8
X-Powered-By: Express
Etag: "579547792"
X-Content-Type-Options: nosniff
Date: Wed, 25 Jun 2014 13:50:37 GMT
Cache-Control: no-store, no-cache
Strict-Transport-Security: max-age=15768000
X-Xss-Protection: 1; mode=block
Vary: Accept-Encoding

2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
2014-06-25 14:50:38 042813 T GET / 200 147886B 1136ms


I think I’m a bit out of my depth on this, so maybe I might have to find a different way of doing things.

I appreciate the help.

Tim

On 25 Jun 2014, at 14:41, Paul DeBruicker [via Smalltalk] <[hidden email]> wrote:

Are you able to get the contents of 

ZnEasy get: 'https://www.google.com'  


?   



If so then is not an SSL issue.  If not you'll need to use charles proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded https requests.  Wireshark only has encrypted packets. 


Are you doing the #resetEntity prior to setting the url or other parameters when doing your POST? 



Tim Mackinnon wrote
Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“? 

Not really sure how to debug that - guess I might have to learn how to use wireshark. 

Tim 

On 25 Jun 2014, at 08:55, Tim Mackinnon <<a href="x-msg://13/user/SendEmail.jtp?type=node&amp;node=4764717&amp;i=0" target="_top" rel="nofollow" link="external">[hidden email]> wrote: 

> Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?). 
> 
> The get portion and decoding parameters is all working perfectly, it's the post that has me confused. 
> 
> If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage). 
> 
> I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that). 
> 
> I guess I will have to debug through the code. 
> 
> Tim 
> 
> Sent from my iPhone 
> 
> On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <<a href="x-msg://13/user/SendEmail.jtp?type=node&amp;node=4764717&amp;i=1" target="_top" rel="nofollow" link="external">[hidden email]> wrote: 
> 
>> Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity. 
>> 
>> 
>> Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST? 
>> 
>> 
>> Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.   
>> 
>> The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things. 
>> 
>> 
>> Good luck 
>> 
>> Paul 
>> 
>> 
>> 
>> 
>> 
>> Tim Mackinnon wrote 
>> Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake). 
>> 
>> It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation? 
>> 
>> Tim 
>> 
>> | znc resp | 
>> 
>> (znc := ZnClient new) logToTranscript. 
>> 
>> resp := znc 
>>         url: 'https://trello.com/1/authorize';
>>         queryAt: 'scope' put: 'read'; 
>>         queryAt: 'expiration' put: '1day'; 
>>         queryAt: 'name' put: 'Pharo App'; 
>>         "queryAt: 'response_type' put: 'token';" 
>>         queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd'; 
>>         get; 
>>         request; 
>>         response. 
>>         
>> soup := (Soup fromString:  resp entity). 
>> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]]. 
>> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]]. 
>> 
>> resp := znc 
>>         url: 'https://trello.com/1/token/approve';
>>         formAt: 'approve' put: 'Allow'; 
>>         formAt: 'requestKey' put: (key attributeAt: 'value'); 
>>         formAt: 'signature' put: (sig attributeAt: 'value'); 
>>         post; 
>>         request; 
>>         response. 
>> 
>> 
>> If you reply to this email, your message will be added to the discussion below: 
>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
>> To unsubscribe from ZnClient get then post?, click here. 
>> NAML


If you reply to this email, your message will be added to the discussion below:
http://forum.world.st/ZnClient-get-then-post-tp4764605p4764717.html
To unsubscribe from ZnClient get then post?, click here.
NAML

Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Paul DeBruicker
Where in their docs do you see to use the /1/token/approve endpoint?


I didn't see it in this list:

https://trello.com/docs/api/index.html 

or in the discussion about user tokens





also - when you get this working you'll post a MIT licensed version for everyone to use right? ;)







Tim Mackinnon wrote
Hi Paul - yes that ZnEasy call works fine - in my case I am trying to read some data from Trello.com and so you do an initial request with an application key and then you authorise an operation with some parameters to get back a token to use for private requests.

The sequence I am using is this:

| znc resp soup key sig |

(znc := ZnClient new) logToTranscript.

resp := znc
        url: 'https://trello.com/1/authorize';
        queryAt: 'scope' put: 'read';
        queryAt: 'expiration' put: '1day';
        queryAt: 'name' put: 'Pharo App';
        queryAt: 'response_type' put: 'token';
        queryAt: ‘key' put: 'xxxxxxx1d588819825d57da6dad4dd';
        get;
        response.
       
soup := (Soup fromString:  resp entity).
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].

Transcript cr; cr; show: (key attributeAt: 'value'); cr; show: (sig attributeAt: 'value'); cr; cr.

resp := znc
        resetEntity;
        url: '/1/token/approve';
        formAt: 'approve' put: 'Allow';
        formAt: 'requestKey' put: (key attributeAt: 'value');
        formAt: 'signature' put: (sig attributeAt: 'value');
        post;
        response.


If I look at the logging in the transcript - the first part works fine:

2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /1/authorize?response_type=token&key=xxxxxxxxxx1d588819825d57da6dad4dd&scope=read&name=Pharo%20App&expiration=1day)
2014-06-25 14:50:37 042813 D Sent headers
Accept: */*
User-Agent: Zinc HTTP Components 1.0
Host: trello.com

2014-06-25 14:50:37 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 2199B)
 …..

Its the next bit of the log which is doing something weird - and showing a resource moved - so I wonder if the server is expecting something extra? The transcript is showing I have extracted my key and signature to populate my form and then I see the 302 status code?

xxxxxx1bf70c02d829c9541f0c3c
xxxxxx5437639/0f28401bf858e7f623c971a45b77291dc113988782


2014-06-25 14:50:37 042813 I Wrote a ZnRequest(POST /1/token/approve)
2014-06-25 14:50:37 042813 D Sent headers
User-Agent: Zinc HTTP Components 1.0
Content-Length: 146
Host: trello.com
Content-Type: application/x-www-form-urlencoded
Accept: */*

2014-06-25 14:50:37 042813 I Read a ZnResponse(302 Moved Temporarily text/plain;charset=UTF-8 35B)
2014-06-25 14:50:37 042813 D Received headers
X-Frame-Options: DENY
Content-Length: 35
Content-Type: text/plain; charset=UTF-8
X-Powered-By: Express
X-Content-Type-Options: nosniff
Location: /
Cache-Control: no-store, no-cache
Strict-Transport-Security: max-age=15768000
Date: Wed, 25 Jun 2014 13:50:37 GMT
X-Xss-Protection: 1; mode=block
Vary: Accept, Accept-Encoding

2014-06-25 14:50:37 042813 D Redirecting to https://trello.com:443/
2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /)
2014-06-25 14:50:37 042813 D Sent headers
User-Agent: Zinc HTTP Components 1.0
Host: trello.com
Accept: */*

2014-06-25 14:50:38 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 147886B)
2014-06-25 14:50:38 042813 D Received headers
X-Frame-Options: DENY
Content-Length: 147886
Set-Cookie: sup=1; Path=/; Expires=Thu, 25 Jun 2015 13:50:37 GMT
Content-Type: text/html; charset=utf-8
X-Powered-By: Express
Etag: "579547792"
X-Content-Type-Options: nosniff
Date: Wed, 25 Jun 2014 13:50:37 GMT
Cache-Control: no-store, no-cache
Strict-Transport-Security: max-age=15768000
X-Xss-Protection: 1; mode=block
Vary: Accept-Encoding

2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
2014-06-25 14:50:38 042813 T GET / 200 147886B 1136ms


I think I’m a bit out of my depth on this, so maybe I might have to find a different way of doing things.

I appreciate the help.

Tim

On 25 Jun 2014, at 14:41, Paul DeBruicker [via Smalltalk] <[hidden email]> wrote:

> Are you able to get the contents of
>
> ZnEasy get: 'https://www.google.com' 
>
>
> ?  
>
>
>
> If so then is not an SSL issue.  If not you'll need to use charles proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded https requests.  Wireshark only has encrypted packets.
>
>
> Are you doing the #resetEntity prior to setting the url or other parameters when doing your POST?
>
>
>
> Tim Mackinnon wrote
> Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“?
>
> Not really sure how to debug that - guess I might have to learn how to use wireshark.
>
> Tim
>
> On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote:
>
> > Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?).
> >
> > The get portion and decoding parameters is all working perfectly, it's the post that has me confused.
> >
> > If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage).
> >
> > I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that).
> >
> > I guess I will have to debug through the code.
> >
> > Tim
> >
> > Sent from my iPhone
> >
> > On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote:
> >
> >> Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.
> >>
> >>
> >> Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?
> >>
> >>
> >> Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  
> >>
> >> The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.
> >>
> >>
> >> Good luck
> >>
> >> Paul
> >>
> >>
> >>
> >>
> >>
> >> Tim Mackinnon wrote
> >> Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).
> >>
> >> It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?
> >>
> >> Tim
> >>
> >> | znc resp |
> >>
> >> (znc := ZnClient new) logToTranscript.
> >>
> >> resp := znc
> >>         url: 'https://trello.com/1/authorize';
> >>         queryAt: 'scope' put: 'read';
> >>         queryAt: 'expiration' put: '1day';
> >>         queryAt: 'name' put: 'Pharo App';
> >>         "queryAt: 'response_type' put: 'token';"
> >>         queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
> >>         get;
> >>         request;
> >>         response.
> >>        
> >> soup := (Soup fromString:  resp entity).
> >> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
> >> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
> >>
> >> resp := znc
> >>         url: 'https://trello.com/1/token/approve';
> >>         formAt: 'approve' put: 'Allow';
> >>         formAt: 'requestKey' put: (key attributeAt: 'value');
> >>         formAt: 'signature' put: (sig attributeAt: 'value');
> >>         post;
> >>         request;
> >>         response.
> >>
> >>
> >> If you reply to this email, your message will be added to the discussion below:
> >> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
> >> To unsubscribe from ZnClient get then post?, click here.
> >> NAML
>
>
> If you reply to this email, your message will be added to the discussion below:
> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764717.html
> To unsubscribe from ZnClient get then post?, click here.
> NAML
Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Tim Mackinnon
Hey Paul - I was following: https://trello.com/docs/gettingstarted/index.html#token - where it shows how to manually get a token. When you do an initial request like: https://trello.com/1/authorize?key=substitutewithyourapplicationkey&name=My+Application&expiration=30days&response_type=token

It takes you to a page in your browser which has some hidden fields, which you can then click on accept and its posts the form to the url (/1/token/approve). You then get a text result showing your token.

I thought this would be a simple way to get the credentials - as in just do what the user does manually. However, I guess its not a simple as that - and it may need OAuth, which I can see there are some Pharo classes Sven did - so maybe I can investigate that (although its getting a bit more complicated than I wanted). 

Tim

p.s. Of course if I get it working, happy to share the secret sauce (I’ve also spotted a few bugs in the new Pharo as well - so I should report those too)

On 25 Jun 2014, at 15:14, Paul DeBruicker [via Smalltalk] <[hidden email]> wrote:

Where in their docs do you see to use the /1/token/approve endpoint? 


I didn't see it in this list: 

https://trello.com/docs/api/index.html  

or in the discussion about user tokens 





also - when you get this working you'll post a MIT licensed version for everyone to use right? ;) 







Tim Mackinnon wrote
Hi Paul - yes that ZnEasy call works fine - in my case I am trying to read some data from Trello.com and so you do an initial request with an application key and then you authorise an operation with some parameters to get back a token to use for private requests. 

The sequence I am using is this: 

| znc resp soup key sig | 

(znc := ZnClient new) logToTranscript. 

resp := znc 
        url: 'https://trello.com/1/authorize';
        queryAt: 'scope' put: 'read'; 
        queryAt: 'expiration' put: '1day'; 
        queryAt: 'name' put: 'Pharo App'; 
        queryAt: 'response_type' put: 'token'; 
        queryAt: ‘key' put: 'xxxxxxx1d588819825d57da6dad4dd'; 
        get; 
        response. 
        
soup := (Soup fromString:  resp entity). 
key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]]. 
sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]]. 

Transcript cr; cr; show: (key attributeAt: 'value'); cr; show: (sig attributeAt: 'value'); cr; cr. 

resp := znc 
        resetEntity; 
        url: '/1/token/approve'; 
        formAt: 'approve' put: 'Allow'; 
        formAt: 'requestKey' put: (key attributeAt: 'value'); 
        formAt: 'signature' put: (sig attributeAt: 'value'); 
        post; 
        response. 


If I look at the logging in the transcript - the first part works fine: 

2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /1/authorize?response_type=token&key=xxxxxxxxxx1d588819825d57da6dad4dd&scope=read&name=Pharo%20App&expiration=1day) 
2014-06-25 14:50:37 042813 D Sent headers 
Accept: */* 
User-Agent: Zinc HTTP Components 1.0 
Host: trello.com 

2014-06-25 14:50:37 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 2199B) 
 ….. 

Its the next bit of the log which is doing something weird - and showing a resource moved - so I wonder if the server is expecting something extra? The transcript is showing I have extracted my key and signature to populate my form and then I see the 302 status code? 

xxxxxx1bf70c02d829c9541f0c3c 
xxxxxx5437639/0f28401bf858e7f623c971a45b77291dc113988782 


2014-06-25 14:50:37 042813 I Wrote a ZnRequest(POST /1/token/approve) 
2014-06-25 14:50:37 042813 D Sent headers 
User-Agent: Zinc HTTP Components 1.0 
Content-Length: 146 
Host: trello.com 
Content-Type: application/x-www-form-urlencoded 
Accept: */* 

2014-06-25 14:50:37 042813 I Read a ZnResponse(302 Moved Temporarily text/plain;charset=UTF-8 35B) 
2014-06-25 14:50:37 042813 D Received headers 
X-Frame-Options: DENY 
Content-Length: 35 
Content-Type: text/plain; charset=UTF-8 
X-Powered-By: Express 
X-Content-Type-Options: nosniff 
Location: / 
Cache-Control: no-store, no-cache 
Strict-Transport-Security: max-age=15768000 
Date: Wed, 25 Jun 2014 13:50:37 GMT 
X-Xss-Protection: 1; mode=block 
Vary: Accept, Accept-Encoding 

2014-06-25 14:50:37 042813 D Redirecting to https://trello.com:443/
2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /) 
2014-06-25 14:50:37 042813 D Sent headers 
User-Agent: Zinc HTTP Components 1.0 
Host: trello.com 
Accept: */* 

2014-06-25 14:50:38 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 147886B) 
2014-06-25 14:50:38 042813 D Received headers 
X-Frame-Options: DENY 
Content-Length: 147886 
Set-Cookie: sup=1; Path=/; Expires=Thu, 25 Jun 2015 13:50:37 GMT 
Content-Type: text/html; charset=utf-8 
X-Powered-By: Express 
Etag: "579547792" 
X-Content-Type-Options: nosniff 
Date: Wed, 25 Jun 2014 13:50:37 GMT 
Cache-Control: no-store, no-cache 
Strict-Transport-Security: max-age=15768000 
X-Xss-Protection: 1; mode=block 
Vary: Accept-Encoding 

2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT 
2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT 
2014-06-25 14:50:38 042813 T GET / 200 147886B 1136ms 


I think I’m a bit out of my depth on this, so maybe I might have to find a different way of doing things. 

I appreciate the help. 

Tim 

On 25 Jun 2014, at 14:41, Paul DeBruicker [via Smalltalk] <<a href="x-msg://14/user/SendEmail.jtp?type=node&amp;node=4764722&amp;i=0" target="_top" rel="nofollow" link="external">[hidden email]> wrote: 

> Are you able to get the contents of 
> 
> ZnEasy get: 'https://www.google.com'  
> 
> 
> ?   
> 
> 
> 
> If so then is not an SSL issue.  If not you'll need to use charles proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded https requests.  Wireshark only has encrypted packets. 
> 
> 
> Are you doing the #resetEntity prior to setting the url or other parameters when doing your POST? 
> 
> 
> 
> Tim Mackinnon wrote 
> Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“? 
> 
> Not really sure how to debug that - guess I might have to learn how to use wireshark. 
> 
> Tim 
> 
> On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote: 
> 
> > Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?). 
> > 
> > The get portion and decoding parameters is all working perfectly, it's the post that has me confused. 
> > 
> > If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage). 
> > 
> > I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that). 
> > 
> > I guess I will have to debug through the code. 
> > 
> > Tim 
> > 
> > Sent from my iPhone 
> > 
> > On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote: 
> > 
> >> Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity. 
> >> 
> >> 
> >> Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST? 
> >> 
> >> 
> >> Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.   
> >> 
> >> The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things. 
> >> 
> >> 
> >> Good luck 
> >> 
> >> Paul 
> >> 
> >> 
> >> 
> >> 
> >> 
> >> Tim Mackinnon wrote 
> >> Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake). 
> >> 
> >> It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation? 
> >> 
> >> Tim 
> >> 
> >> | znc resp | 
> >> 
> >> (znc := ZnClient new) logToTranscript. 
> >> 
> >> resp := znc 
> >>         url: 'https://trello.com/1/authorize';
> >>         queryAt: 'scope' put: 'read'; 
> >>         queryAt: 'expiration' put: '1day'; 
> >>         queryAt: 'name' put: 'Pharo App'; 
> >>         "queryAt: 'response_type' put: 'token';" 
> >>         queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd'; 
> >>         get; 
> >>         request; 
> >>         response. 
> >>         
> >> soup := (Soup fromString:  resp entity). 
> >> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]]. 
> >> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]]. 
> >> 
> >> resp := znc 
> >>         url: 'https://trello.com/1/token/approve';
> >>         formAt: 'approve' put: 'Allow'; 
> >>         formAt: 'requestKey' put: (key attributeAt: 'value'); 
> >>         formAt: 'signature' put: (sig attributeAt: 'value'); 
> >>         post; 
> >>         request; 
> >>         response. 
> >> 
> >> 
> >> If you reply to this email, your message will be added to the discussion below: 
> >> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
> >> To unsubscribe from ZnClient get then post?, click here. 
> >> NAML 
> 
> 
> If you reply to this email, your message will be added to the discussion below: 
> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764717.html
> To unsubscribe from ZnClient get then post?, click here. 
> NAML


If you reply to this email, your message will be added to the discussion below:
http://forum.world.st/ZnClient-get-then-post-tp4764605p4764722.html
To unsubscribe from ZnClient get then post?, click here.
NAML

Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Tim Mackinnon
This post was updated on .
In reply to this post by Paul DeBruicker
That Charles app is pretty darn good - I can see some differences between a browser and Zn.

The encoding of submitted form values is different (the browser seems to encode a / as %2F when it submits a field value?), there are also some cookies missing.

Will check these difference out.

Tim

On 25 Jun 2014, at 15:35, Tim Mackinnon <tamackinnon@gmail.com> wrote:

> Hey Paul - I was following: https://trello.com/docs/gettingstarted/index.html#token - where it shows how to manually get a token. When you do an initial request like: https://trello.com/1/authorize?key=substitutewithyourapplicationkey&name=My+Application&expiration=30days&response_type=token
>
> It takes you to a page in your browser which has some hidden fields, which you can then click on accept and its posts the form to the url (/1/token/approve). You then get a text result showing your token.
>
> I thought this would be a simple way to get the credentials - as in just do what the user does manually. However, I guess its not a simple as that - and it may need OAuth, which I can see there are some Pharo classes Sven did - so maybe I can investigate that (although its getting a bit more complicated than I wanted).
>
> Tim
>
> p.s. Of course if I get it working, happy to share the secret sauce (I’ve also spotted a few bugs in the new Pharo as well - so I should report those too)
>
> On 25 Jun 2014, at 15:14, Paul DeBruicker [via Smalltalk] <ml-node+s1294792n4764722h62@n4.nabble.com> wrote:
>
>> Where in their docs do you see to use the /1/token/approve endpoint?
>>
>>
>> I didn't see it in this list:
>>
>> https://trello.com/docs/api/index.html 
>>
>> or in the discussion about user tokens
>>
>>
>>
>>
>>
>> also - when you get this working you'll post a MIT licensed version for everyone to use right? ;)
>>
>>
>>
>>
>>
>>
>>
>> Tim Mackinnon wrote
>> Hi Paul - yes that ZnEasy call works fine - in my case I am trying to read some data from Trello.com and so you do an initial request with an application key and then you authorise an operation with some parameters to get back a token to use for private requests.
>>
>> The sequence I am using is this:
>>
>> | znc resp soup key sig |
>>
>> (znc := ZnClient new) logToTranscript.
>>
>> resp := znc
>>         url: 'https://trello.com/1/authorize';
>>         queryAt: 'scope' put: 'read';
>>         queryAt: 'expiration' put: '1day';
>>         queryAt: 'name' put: 'Pharo App';
>>         queryAt: 'response_type' put: 'token';
>>         queryAt: ‘key' put: 'xxxxxxx1d588819825d57da6dad4dd';
>>         get;
>>         response.
>>        
>> soup := (Soup fromString:  resp entity).
>> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
>> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
>>
>> Transcript cr; cr; show: (key attributeAt: 'value'); cr; show: (sig attributeAt: 'value'); cr; cr.
>>
>> resp := znc
>>         resetEntity;
>>         url: '/1/token/approve';
>>         formAt: 'approve' put: 'Allow';
>>         formAt: 'requestKey' put: (key attributeAt: 'value');
>>         formAt: 'signature' put: (sig attributeAt: 'value');
>>         post;
>>         response.
>>
>>
>> If I look at the logging in the transcript - the first part works fine:
>>
>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /1/authorize?response_type=token&key=xxxxxxxxxx1d588819825d57da6dad4dd&scope=read&name=Pharo%20App&expiration=1day)
>> 2014-06-25 14:50:37 042813 D Sent headers
>> Accept: */*
>> User-Agent: Zinc HTTP Components 1.0
>> Host: trello.com
>>
>> 2014-06-25 14:50:37 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 2199B)
>>  …..
>>
>> Its the next bit of the log which is doing something weird - and showing a resource moved - so I wonder if the server is expecting something extra? The transcript is showing I have extracted my key and signature to populate my form and then I see the 302 status code?
>>
>> xxxxxx1bf70c02d829c9541f0c3c
>> xxxxxx5437639/0f28401bf858e7f623c971a45b77291dc113988782
>>
>>
>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(POST /1/token/approve)
>> 2014-06-25 14:50:37 042813 D Sent headers
>> User-Agent: Zinc HTTP Components 1.0
>> Content-Length: 146
>> Host: trello.com
>> Content-Type: application/x-www-form-urlencoded
>> Accept: */*
>>
>> 2014-06-25 14:50:37 042813 I Read a ZnResponse(302 Moved Temporarily text/plain;charset=UTF-8 35B)
>> 2014-06-25 14:50:37 042813 D Received headers
>> X-Frame-Options: DENY
>> Content-Length: 35
>> Content-Type: text/plain; charset=UTF-8
>> X-Powered-By: Express
>> X-Content-Type-Options: nosniff
>> Location: /
>> Cache-Control: no-store, no-cache
>> Strict-Transport-Security: max-age=15768000
>> Date: Wed, 25 Jun 2014 13:50:37 GMT
>> X-Xss-Protection: 1; mode=block
>> Vary: Accept, Accept-Encoding
>>
>> 2014-06-25 14:50:37 042813 D Redirecting to https://trello.com:443/
>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /)
>> 2014-06-25 14:50:37 042813 D Sent headers
>> User-Agent: Zinc HTTP Components 1.0
>> Host: trello.com
>> Accept: */*
>>
>> 2014-06-25 14:50:38 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 147886B)
>> 2014-06-25 14:50:38 042813 D Received headers
>> X-Frame-Options: DENY
>> Content-Length: 147886
>> Set-Cookie: sup=1; Path=/; Expires=Thu, 25 Jun 2015 13:50:37 GMT
>> Content-Type: text/html; charset=utf-8
>> X-Powered-By: Express
>> Etag: "579547792"
>> X-Content-Type-Options: nosniff
>> Date: Wed, 25 Jun 2014 13:50:37 GMT
>> Cache-Control: no-store, no-cache
>> Strict-Transport-Security: max-age=15768000
>> X-Xss-Protection: 1; mode=block
>> Vary: Accept-Encoding
>>
>> 2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
>> 2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
>> 2014-06-25 14:50:38 042813 T GET / 200 147886B 1136ms
>>
>>
>> I think I’m a bit out of my depth on this, so maybe I might have to find a different way of doing things.
>>
>> I appreciate the help.
>>
>> Tim
>>
>> On 25 Jun 2014, at 14:41, Paul DeBruicker [via Smalltalk] <[hidden email]> wrote:
>>
>> > Are you able to get the contents of
>> >
>> > ZnEasy get: 'https://www.google.com' 
>> >
>> >
>> > ?  
>> >
>> >
>> >
>> > If so then is not an SSL issue.  If not you'll need to use charles proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded https requests.  Wireshark only has encrypted packets.
>> >
>> >
>> > Are you doing the #resetEntity prior to setting the url or other parameters when doing your POST?
>> >
>> >
>> >
>> > Tim Mackinnon wrote
>> > Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“?
>> >
>> > Not really sure how to debug that - guess I might have to learn how to use wireshark.
>> >
>> > Tim
>> >
>> > On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote:
>> >
>> > > Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?).
>> > >
>> > > The get portion and decoding parameters is all working perfectly, it's the post that has me confused.
>> > >
>> > > If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage).
>> > >
>> > > I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that).
>> > >
>> > > I guess I will have to debug through the code.
>> > >
>> > > Tim
>> > >
>> > > Sent from my iPhone
>> > >
>> > > On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote:
>> > >
>> > >> Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.
>> > >>
>> > >>
>> > >> Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?
>> > >>
>> > >>
>> > >> Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  
>> > >>
>> > >> The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.
>> > >>
>> > >>
>> > >> Good luck
>> > >>
>> > >> Paul
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >> Tim Mackinnon wrote
>> > >> Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).
>> > >>
>> > >> It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?
>> > >>
>> > >> Tim
>> > >>
>> > >> | znc resp |
>> > >>
>> > >> (znc := ZnClient new) logToTranscript.
>> > >>
>> > >> resp := znc
>> > >>         url: 'https://trello.com/1/authorize';
>> > >>         queryAt: 'scope' put: 'read';
>> > >>         queryAt: 'expiration' put: '1day';
>> > >>         queryAt: 'name' put: 'Pharo App';
>> > >>         "queryAt: 'response_type' put: 'token';"
>> > >>         queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
>> > >>         get;
>> > >>         request;
>> > >>         response.
>> > >>        
>> > >> soup := (Soup fromString:  resp entity).
>> > >> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
>> > >> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
>> > >>
>> > >> resp := znc
>> > >>         url: 'https://trello.com/1/token/approve';
>> > >>         formAt: 'approve' put: 'Allow';
>> > >>         formAt: 'requestKey' put: (key attributeAt: 'value');
>> > >>         formAt: 'signature' put: (sig attributeAt: 'value');
>> > >>         post;
>> > >>         request;
>> > >>         response.
>> > >>
>> > >>
>> > >> If you reply to this email, your message will be added to the discussion below:
>> > >> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
>> > >> To unsubscribe from ZnClient get then post?, click here.
>> > >> NAML
>> >
>> >
>> > If you reply to this email, your message will be added to the discussion below:
>> > http://forum.world.st/ZnClient-get-then-post-tp4764605p4764717.html
>> > To unsubscribe from ZnClient get then post?, click here.
>> > NAML
>>
>>
>> If you reply to this email, your message will be added to the discussion below:
>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764722.html
>> To unsubscribe from ZnClient get then post?, click here.
>> NAML
>

Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Paul DeBruicker
Hey Tim,


Your emails aren't getting posted to the users list, only the nabble forum.  Are you a subscriber?   If not you should sign up as described here: http://forum.world.st/mailing_list/MailingListOptions.jtp?forum=1310670



I know Sven (the Zinc package author) may have other or better ideas for how to approach what you're attempting.  There is also some oAuth stuff in this repo:

http://smalltalkhub.com/#!/~JanVanDeSandt/Cloudfork 


Good luck.

Paul.





Tim Mackinnon wrote
That Charles app is pretty darn good - I can see some differences between a browser and Zn.

The encoding of submitted form values is different (the browser seems to encode a / as %2F when it submits a field value?), there are also some cookies missing.

Will check these difference out.

Tim

On 25 Jun 2014, at 15:35, Tim Mackinnon <[hidden email]> wrote:

> Hey Paul - I was following: https://trello.com/docs/gettingstarted/index.html#token - where it shows how to manually get a token. When you do an initial request like: https://trello.com/1/authorize?key=substitutewithyourapplicationkey&name=My+Application&expiration=30days&response_type=token
>
> It takes you to a page in your browser which has some hidden fields, which you can then click on accept and its posts the form to the url (/1/token/approve). You then get a text result showing your token.
>
> I thought this would be a simple way to get the credentials - as in just do what the user does manually. However, I guess its not a simple as that - and it may need OAuth, which I can see there are some Pharo classes Sven did - so maybe I can investigate that (although its getting a bit more complicated than I wanted).
>
> Tim
>
> p.s. Of course if I get it working, happy to share the secret sauce (I’ve also spotted a few bugs in the new Pharo as well - so I should report those too)
>
> On 25 Jun 2014, at 15:14, Paul DeBruicker [via Smalltalk] <[hidden email]> wrote:
>
>> Where in their docs do you see to use the /1/token/approve endpoint?
>>
>>
>> I didn't see it in this list:
>>
>> https://trello.com/docs/api/index.html 
>>
>> or in the discussion about user tokens
>>
>>
>>
>>
>>
>> also - when you get this working you'll post a MIT licensed version for everyone to use right? ;)
>>
>>
>>
>>
>>
>>
>>
>> Tim Mackinnon wrote
>> Hi Paul - yes that ZnEasy call works fine - in my case I am trying to read some data from Trello.com and so you do an initial request with an application key and then you authorise an operation with some parameters to get back a token to use for private requests.
>>
>> The sequence I am using is this:
>>
>> | znc resp soup key sig |
>>
>> (znc := ZnClient new) logToTranscript.
>>
>> resp := znc
>>         url: 'https://trello.com/1/authorize';
>>         queryAt: 'scope' put: 'read';
>>         queryAt: 'expiration' put: '1day';
>>         queryAt: 'name' put: 'Pharo App';
>>         queryAt: 'response_type' put: 'token';
>>         queryAt: ‘key' put: 'xxxxxxx1d588819825d57da6dad4dd';
>>         get;
>>         response.
>>        
>> soup := (Soup fromString:  resp entity).
>> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
>> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
>>
>> Transcript cr; cr; show: (key attributeAt: 'value'); cr; show: (sig attributeAt: 'value'); cr; cr.
>>
>> resp := znc
>>         resetEntity;
>>         url: '/1/token/approve';
>>         formAt: 'approve' put: 'Allow';
>>         formAt: 'requestKey' put: (key attributeAt: 'value');
>>         formAt: 'signature' put: (sig attributeAt: 'value');
>>         post;
>>         response.
>>
>>
>> If I look at the logging in the transcript - the first part works fine:
>>
>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /1/authorize?response_type=token&key=xxxxxxxxxx1d588819825d57da6dad4dd&scope=read&name=Pharo%20App&expiration=1day)
>> 2014-06-25 14:50:37 042813 D Sent headers
>> Accept: */*
>> User-Agent: Zinc HTTP Components 1.0
>> Host: trello.com
>>
>> 2014-06-25 14:50:37 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 2199B)
>>  …..
>>
>> Its the next bit of the log which is doing something weird - and showing a resource moved - so I wonder if the server is expecting something extra? The transcript is showing I have extracted my key and signature to populate my form and then I see the 302 status code?
>>
>> xxxxxx1bf70c02d829c9541f0c3c
>> xxxxxx5437639/0f28401bf858e7f623c971a45b77291dc113988782
>>
>>
>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(POST /1/token/approve)
>> 2014-06-25 14:50:37 042813 D Sent headers
>> User-Agent: Zinc HTTP Components 1.0
>> Content-Length: 146
>> Host: trello.com
>> Content-Type: application/x-www-form-urlencoded
>> Accept: */*
>>
>> 2014-06-25 14:50:37 042813 I Read a ZnResponse(302 Moved Temporarily text/plain;charset=UTF-8 35B)
>> 2014-06-25 14:50:37 042813 D Received headers
>> X-Frame-Options: DENY
>> Content-Length: 35
>> Content-Type: text/plain; charset=UTF-8
>> X-Powered-By: Express
>> X-Content-Type-Options: nosniff
>> Location: /
>> Cache-Control: no-store, no-cache
>> Strict-Transport-Security: max-age=15768000
>> Date: Wed, 25 Jun 2014 13:50:37 GMT
>> X-Xss-Protection: 1; mode=block
>> Vary: Accept, Accept-Encoding
>>
>> 2014-06-25 14:50:37 042813 D Redirecting to https://trello.com:443/
>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /)
>> 2014-06-25 14:50:37 042813 D Sent headers
>> User-Agent: Zinc HTTP Components 1.0
>> Host: trello.com
>> Accept: */*
>>
>> 2014-06-25 14:50:38 042813 I Read a ZnResponse(200 OK text/html;charset=utf-8 147886B)
>> 2014-06-25 14:50:38 042813 D Received headers
>> X-Frame-Options: DENY
>> Content-Length: 147886
>> Set-Cookie: sup=1; Path=/; Expires=Thu, 25 Jun 2015 13:50:37 GMT
>> Content-Type: text/html; charset=utf-8
>> X-Powered-By: Express
>> Etag: "579547792"
>> X-Content-Type-Options: nosniff
>> Date: Wed, 25 Jun 2014 13:50:37 GMT
>> Cache-Control: no-store, no-cache
>> Strict-Transport-Security: max-age=15768000
>> X-Xss-Protection: 1; mode=block
>> Vary: Accept-Encoding
>>
>> 2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
>> 2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/; domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
>> 2014-06-25 14:50:38 042813 T GET / 200 147886B 1136ms
>>
>>
>> I think I’m a bit out of my depth on this, so maybe I might have to find a different way of doing things.
>>
>> I appreciate the help.
>>
>> Tim
>>
>> On 25 Jun 2014, at 14:41, Paul DeBruicker [via Smalltalk] <[hidden email]> wrote:
>>
>> > Are you able to get the contents of
>> >
>> > ZnEasy get: 'https://www.google.com' 
>> >
>> >
>> > ?  
>> >
>> >
>> >
>> > If so then is not an SSL issue.  If not you'll need to use charles proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded https requests.  Wireshark only has encrypted packets.
>> >
>> >
>> > Are you doing the #resetEntity prior to setting the url or other parameters when doing your POST?
>> >
>> >
>> >
>> > Tim Mackinnon wrote
>> > Actually looking at this a bit more - #resetEntity does do what you suggest (my mistake) - but I still have some problem, possibly related to https? Not sure whats going on as it looks like the post call is sending out what I think it should - but somehow the receiving server is not happy and is redirecting to “/“?
>> >
>> > Not really sure how to debug that - guess I might have to learn how to use wireshark.
>> >
>> > Tim
>> >
>> > On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote:
>> >
>> > > Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to clear the parameters or have any effect (which I think makes sense given the name?).
>> > >
>> > > The get portion and decoding parameters is all working perfectly, it's the post that has me confused.
>> > >
>> > > If I inspect the request - it seems to be issuing to "/" - so it's like the URL: is not being honoured (and the response I get back is the contents of the / webpage).
>> > >
>> > > I think I'm confused about the interaction of URL:, and setting request and form params. From the docs, it wasn't obvious to me that ordering is important - but it seems that it is (I was expecting #post or #get to assemble everything when invoked - but I'm not sure it works like that).
>> > >
>> > > I guess I will have to debug through the code.
>> > >
>> > > Tim
>> > >
>> > > Sent from my iPhone
>> > >
>> > > On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden email]> wrote:
>> > >
>> > >> Do your query parameters from the initial GET get cleared from the request before the POST? If you're not sure send the client #resetEntity.
>> > >>
>> > >>
>> > >> Is the response of the GET correct & are the keys decoded properly? if not can you get a valid signature and request key from somewhere else (e.g. web ui, or ....) to test the POST?
>> > >>
>> > >>
>> > >> Is it important to reuse the connection?  IF not add the #beOneShot method to both and see if that helps as it does some resetting.  
>> > >>
>> > >> The #post method is a convenience method that conjoins a send to #method: and #execute.  You could separate them and use #method: at the top and #execute; before the #request line but I'd be surprised to learn that fixed things.
>> > >>
>> > >>
>> > >> Good luck
>> > >>
>> > >> Paul
>> > >>
>> > >>
>> > >>
>> > >>
>> > >>
>> > >> Tim Mackinnon wrote
>> > >> Hi I'm a bit confused about how to send a get request to a resource and then post a response to it? I seem to fail on the post part, as it seems that my query is not being well formeed - or something is not being cleared when I reuse the connection I used in the get.  My code looks as follows (and I'm sure there is a simple mistake).
>> > >>
>> > >> It seems that in my post request, it doesn't formulate the post I expect - it shows a GET / msg, and as such my response doesn't give me the token I expect.  If I move the "post" line up to the start, I seem to get a request header I expect, but still not the the result I expect. Can anyone offer any tips? Do I need to clear my Client in some way before the second post operation?
>> > >>
>> > >> Tim
>> > >>
>> > >> | znc resp |
>> > >>
>> > >> (znc := ZnClient new) logToTranscript.
>> > >>
>> > >> resp := znc
>> > >>         url: 'https://trello.com/1/authorize';
>> > >>         queryAt: 'scope' put: 'read';
>> > >>         queryAt: 'expiration' put: '1day';
>> > >>         queryAt: 'name' put: 'Pharo App';
>> > >>         "queryAt: 'response_type' put: 'token';"
>> > >>         queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
>> > >>         get;
>> > >>         request;
>> > >>         response.
>> > >>        
>> > >> soup := (Soup fromString:  resp entity).
>> > >> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
>> > >> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
>> > >>
>> > >> resp := znc
>> > >>         url: 'https://trello.com/1/token/approve';
>> > >>         formAt: 'approve' put: 'Allow';
>> > >>         formAt: 'requestKey' put: (key attributeAt: 'value');
>> > >>         formAt: 'signature' put: (sig attributeAt: 'value');
>> > >>         post;
>> > >>         request;
>> > >>         response.
>> > >>
>> > >>
>> > >> If you reply to this email, your message will be added to the discussion below:
>> > >> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
>> > >> To unsubscribe from ZnClient get then post?, click here.
>> > >> NAML
>> >
>> >
>> > If you reply to this email, your message will be added to the discussion below:
>> > http://forum.world.st/ZnClient-get-then-post-tp4764605p4764717.html
>> > To unsubscribe from ZnClient get then post?, click here.
>> > NAML
>>
>>
>> If you reply to this email, your message will be added to the discussion below:
>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764722.html
>> To unsubscribe from ZnClient get then post?, click here.
>> NAML
>
Reply | Threaded
Open this post in threaded view
|

Re: ZnClient get then post?

Sven Van Caekenberghe-2
I didn't notice this thread until just now.

Doing OAuth and similar things is not easy.

There is Zinc-SSO

  https://github.com/svenvc/docs/blob/master/zinc/zinc-sso-paper.md

  http://sso.stfx.eu/sso-demo

You might also learn something from #testGetAfterPost

HTH,

Sven

On 25 Jun 2014, at 20:41, Paul DeBruicker <[hidden email]> wrote:

> Hey Tim,
>
>
> Your emails aren't getting posted to the users list, only the nabble forum.
> Are you a subscriber?   If not you should sign up as described here:
> http://forum.world.st/mailing_list/MailingListOptions.jtp?forum=1310670
>
>
>
> I know Sven (the Zinc package author) may have other or better ideas for how
> to approach what you're attempting.  There is also some oAuth stuff in this
> repo:
>
> http://smalltalkhub.com/#!/~JanVanDeSandt/Cloudfork 
>
>
> Good luck.
>
> Paul.
>
>
>
>
>
>
> Tim Mackinnon wrote
>> That Charles app is pretty darn good - I can see some differences between
>> a browser and Zn.
>>
>> The encoding of submitted form values is different (the browser seems to
>> encode a / as %2F when it submits a field value?), there are also some
>> cookies missing.
>>
>> Will check these difference out.
>>
>> Tim
>>
>> On 25 Jun 2014, at 15:35, Tim Mackinnon &lt;
>
>> tamackinnon@
>
>> &gt; wrote:
>>
>>> Hey Paul - I was following:
>>> https://trello.com/docs/gettingstarted/index.html#token - where it shows
>>> how to manually get a token. When you do an initial request like:
>>> https://trello.com/1/authorize?key=substitutewithyourapplicationkey&name=My+Application&expiration=30days&response_type=token
>>>
>>> It takes you to a page in your browser which has some hidden fields,
>>> which you can then click on accept and its posts the form to the url
>>> (/1/token/approve). You then get a text result showing your token.
>>>
>>> I thought this would be a simple way to get the credentials - as in just
>>> do what the user does manually. However, I guess its not a simple as that
>>> - and it may need OAuth, which I can see there are some Pharo classes
>>> Sven did - so maybe I can investigate that (although its getting a bit
>>> more complicated than I wanted).
>>>
>>> Tim
>>>
>>> p.s. Of course if I get it working, happy to share the secret sauce (I’ve
>>> also spotted a few bugs in the new Pharo as well - so I should report
>>> those too)
>>>
>>> On 25 Jun 2014, at 15:14, Paul DeBruicker [via Smalltalk] &lt;
>
>> ml-node+s1294792n4764722h62@.nabble
>
>> &gt; wrote:
>>>
>>>> Where in their docs do you see to use the /1/token/approve endpoint?
>>>>
>>>>
>>>> I didn't see it in this list:
>>>>
>>>> https://trello.com/docs/api/index.html 
>>>>
>>>> or in the discussion about user tokens
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> also - when you get this working you'll post a MIT licensed version for
>>>> everyone to use right? ;)
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Tim Mackinnon wrote
>>>> Hi Paul - yes that ZnEasy call works fine - in my case I am trying to
>>>> read some data from Trello.com and so you do an initial request with an
>>>> application key and then you authorise an operation with some parameters
>>>> to get back a token to use for private requests.
>>>>
>>>> The sequence I am using is this:
>>>>
>>>> | znc resp soup key sig |
>>>>
>>>> (znc := ZnClient new) logToTranscript.
>>>>
>>>> resp := znc
>>>>        url: 'https://trello.com/1/authorize';
>>>>        queryAt: 'scope' put: 'read';
>>>>        queryAt: 'expiration' put: '1day';
>>>>        queryAt: 'name' put: 'Pharo App';
>>>>        queryAt: 'response_type' put: 'token';
>>>>        queryAt: ‘key' put: 'xxxxxxx1d588819825d57da6dad4dd';
>>>>        get;
>>>>        response.
>>>>
>>>> soup := (Soup fromString:  resp entity).
>>>> key := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt:
>>>> 'name' ifAbsent: ['']) = 'requestKey' ]].
>>>> sig := soup findTag: [ :e | (e name = 'input') and: [  (e attributeAt:
>>>> 'name' ifAbsent: ['']) = 'signature' ]].
>>>>
>>>> Transcript cr; cr; show: (key attributeAt: 'value'); cr; show: (sig
>>>> attributeAt: 'value'); cr; cr.
>>>>
>>>> resp := znc
>>>>        resetEntity;
>>>>        url: '/1/token/approve';
>>>>        formAt: 'approve' put: 'Allow';
>>>>        formAt: 'requestKey' put: (key attributeAt: 'value');
>>>>        formAt: 'signature' put: (sig attributeAt: 'value');
>>>>        post;
>>>>        response.
>>>>
>>>>
>>>> If I look at the logging in the transcript - the first part works fine:
>>>>
>>>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET
>>>> /1/authorize?response_type=token&key=xxxxxxxxxx1d588819825d57da6dad4dd&scope=read&name=Pharo%20App&expiration=1day)
>>>> 2014-06-25 14:50:37 042813 D Sent headers
>>>> Accept: */*
>>>> User-Agent: Zinc HTTP Components 1.0
>>>> Host: trello.com
>>>>
>>>> 2014-06-25 14:50:37 042813 I Read a ZnResponse(200 OK
>>>> text/html;charset=utf-8 2199B)
>>>> …..
>>>>
>>>> Its the next bit of the log which is doing something weird - and showing
>>>> a resource moved - so I wonder if the server is expecting something
>>>> extra? The transcript is showing I have extracted my key and signature
>>>> to populate my form and then I see the 302 status code?
>>>>
>>>> xxxxxx1bf70c02d829c9541f0c3c
>>>> xxxxxx5437639/0f28401bf858e7f623c971a45b77291dc113988782
>>>>
>>>>
>>>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(POST /1/token/approve)
>>>> 2014-06-25 14:50:37 042813 D Sent headers
>>>> User-Agent: Zinc HTTP Components 1.0
>>>> Content-Length: 146
>>>> Host: trello.com
>>>> Content-Type: application/x-www-form-urlencoded
>>>> Accept: */*
>>>>
>>>> 2014-06-25 14:50:37 042813 I Read a ZnResponse(302 Moved Temporarily
>>>> text/plain;charset=UTF-8 35B)
>>>> 2014-06-25 14:50:37 042813 D Received headers
>>>> X-Frame-Options: DENY
>>>> Content-Length: 35
>>>> Content-Type: text/plain; charset=UTF-8
>>>> X-Powered-By: Express
>>>> X-Content-Type-Options: nosniff
>>>> Location: /
>>>> Cache-Control: no-store, no-cache
>>>> Strict-Transport-Security: max-age=15768000
>>>> Date: Wed, 25 Jun 2014 13:50:37 GMT
>>>> X-Xss-Protection: 1; mode=block
>>>> Vary: Accept, Accept-Encoding
>>>>
>>>> 2014-06-25 14:50:37 042813 D Redirecting to https://trello.com:443/
>>>> 2014-06-25 14:50:37 042813 I Wrote a ZnRequest(GET /)
>>>> 2014-06-25 14:50:37 042813 D Sent headers
>>>> User-Agent: Zinc HTTP Components 1.0
>>>> Host: trello.com
>>>> Accept: */*
>>>>
>>>> 2014-06-25 14:50:38 042813 I Read a ZnResponse(200 OK
>>>> text/html;charset=utf-8 147886B)
>>>> 2014-06-25 14:50:38 042813 D Received headers
>>>> X-Frame-Options: DENY
>>>> Content-Length: 147886
>>>> Set-Cookie: sup=1; Path=/; Expires=Thu, 25 Jun 2015 13:50:37 GMT
>>>> Content-Type: text/html; charset=utf-8
>>>> X-Powered-By: Express
>>>> Etag: "579547792"
>>>> X-Content-Type-Options: nosniff
>>>> Date: Wed, 25 Jun 2014 13:50:37 GMT
>>>> Cache-Control: no-store, no-cache
>>>> Strict-Transport-Security: max-age=15768000
>>>> X-Xss-Protection: 1; mode=block
>>>> Vary: Accept-Encoding
>>>>
>>>> 2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/;
>>>> domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
>>>> 2014-06-25 14:50:38 042813 D Received cookie: sup=1; path=/;
>>>> domain=trello.com; expires=Thu, 25 Jun 2015 13:50:37 GMT
>>>> 2014-06-25 14:50:38 042813 T GET / 200 147886B 1136ms
>>>>
>>>>
>>>> I think I’m a bit out of my depth on this, so maybe I might have to find
>>>> a different way of doing things.
>>>>
>>>> I appreciate the help.
>>>>
>>>> Tim
>>>>
>>>> On 25 Jun 2014, at 14:41, Paul DeBruicker [via Smalltalk] <[hidden
>>>> email]> wrote:
>>>>
>>>>> Are you able to get the contents of
>>>>>
>>>>> ZnEasy get: 'https://www.google.com' 
>>>>>
>>>>>
>>>>> ?  
>>>>>
>>>>>
>>>>>
>>>>> If so then is not an SSL issue.  If not you'll need to use charles
>>>> proxy (http://www.charlesproxy.com/) or an equivalent to see the decoded
>>>> https requests.  Wireshark only has encrypted packets.
>>>>>
>>>>>
>>>>> Are you doing the #resetEntity prior to setting the url or other
>>>> parameters when doing your POST?
>>>>>
>>>>>
>>>>>
>>>>> Tim Mackinnon wrote
>>>>> Actually looking at this a bit more - #resetEntity does do what you
>>>> suggest (my mistake) - but I still have some problem, possibly related
>>>> to https? Not sure whats going on as it looks like the post call is
>>>> sending out what I think it should - but somehow the receiving server is
>>>> not happy and is redirecting to “/“?
>>>>>
>>>>> Not really sure how to debug that - guess I might have to learn how to
>>>> use wireshark.
>>>>>
>>>>> Tim
>>>>>
>>>>> On 25 Jun 2014, at 08:55, Tim Mackinnon <[hidden email]> wrote:
>>>>>
>>>>>> Hi Paul - thanks for your suggestions, #resetEntity doesn't seem to
>>>> clear the parameters or have any effect (which I think makes sense given
>>>> the name?).
>>>>>>
>>>>>> The get portion and decoding parameters is all working perfectly,
>>>> it's the post that has me confused.
>>>>>>
>>>>>> If I inspect the request - it seems to be issuing to "/" - so it's
>>>> like the URL: is not being honoured (and the response I get back is the
>>>> contents of the / webpage).
>>>>>>
>>>>>> I think I'm confused about the interaction of URL:, and setting
>>>> request and form params. From the docs, it wasn't obvious to me that
>>>> ordering is important - but it seems that it is (I was expecting #post
>>>> or #get to assemble everything when invoked - but I'm not sure it works
>>>> like that).
>>>>>>
>>>>>> I guess I will have to debug through the code.
>>>>>>
>>>>>> Tim
>>>>>>
>>>>>> Sent from my iPhone
>>>>>>
>>>>>> On 25 Jun 2014, at 05:12, "Paul DeBruicker [via Smalltalk]" <[hidden
>>>> email]> wrote:
>>>>>>
>>>>>>> Do your query parameters from the initial GET get cleared from the
>>>> request before the POST? If you're not sure send the client
>>>> #resetEntity.
>>>>>>>
>>>>>>>
>>>>>>> Is the response of the GET correct & are the keys decoded properly?
>>>> if not can you get a valid signature and request key from somewhere else
>>>> (e.g. web ui, or ....) to test the POST?
>>>>>>>
>>>>>>>
>>>>>>> Is it important to reuse the connection?  IF not add the #beOneShot
>>>> method to both and see if that helps as it does some resetting.  
>>>>>>>
>>>>>>> The #post method is a convenience method that conjoins a send to
>>>> #method: and #execute.  You could separate them and use #method: at the
>>>> top and #execute; before the #request line but I'd be surprised to learn
>>>> that fixed things.
>>>>>>>
>>>>>>>
>>>>>>> Good luck
>>>>>>>
>>>>>>> Paul
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Tim Mackinnon wrote
>>>>>>> Hi I'm a bit confused about how to send a get request to a resource
>>>> and then post a response to it? I seem to fail on the post part, as it
>>>> seems that my query is not being well formeed - or something is not
>>>> being cleared when I reuse the connection I used in the get.  My code
>>>> looks as follows (and I'm sure there is a simple mistake).
>>>>>>>
>>>>>>> It seems that in my post request, it doesn't formulate the post I
>>>> expect - it shows a GET / msg, and as such my response doesn't give me
>>>> the token I expect.  If I move the "post" line up to the start, I seem
>>>> to get a request header I expect, but still not the the result I expect.
>>>> Can anyone offer any tips? Do I need to clear my Client in some way
>>>> before the second post operation?
>>>>>>>
>>>>>>> Tim
>>>>>>>
>>>>>>> | znc resp |
>>>>>>>
>>>>>>> (znc := ZnClient new) logToTranscript.
>>>>>>>
>>>>>>> resp := znc
>>>>>>>        url: 'https://trello.com/1/authorize';
>>>>>>>        queryAt: 'scope' put: 'read';
>>>>>>>        queryAt: 'expiration' put: '1day';
>>>>>>>        queryAt: 'name' put: 'Pharo App';
>>>>>>>        "queryAt: 'response_type' put: 'token';"
>>>>>>>        queryAt: 'key' put: 'xxxxxx1d588819825d57da6dad4dd';
>>>>>>>        get;
>>>>>>>        request;
>>>>>>>        response.
>>>>>>>
>>>>>>> soup := (Soup fromString:  resp entity).
>>>>>>> sig := soup findTag: [ :e | (e name = 'input') and: [  (e
>>>> attributeAt: 'name' ifAbsent: ['']) = 'signature' ]].
>>>>>>> key := soup findTag: [ :e | (e name = 'input') and: [  (e
>>>> attributeAt: 'name' ifAbsent: ['']) = 'requestKey' ]].
>>>>>>>
>>>>>>> resp := znc
>>>>>>>        url: 'https://trello.com/1/token/approve';
>>>>>>>        formAt: 'approve' put: 'Allow';
>>>>>>>        formAt: 'requestKey' put: (key attributeAt: 'value');
>>>>>>>        formAt: 'signature' put: (sig attributeAt: 'value');
>>>>>>>        post;
>>>>>>>        request;
>>>>>>>        response.
>>>>>>>
>>>>>>>
>>>>>>> If you reply to this email, your message will be added to the
>>>> discussion below:
>>>>>>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764608.html
>>>>>>> To unsubscribe from ZnClient get then post?, click here.
>>>>>>> NAML
>>>>>
>>>>>
>>>>> If you reply to this email, your message will be added to the
>>>> discussion below:
>>>>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764717.html
>>>>> To unsubscribe from ZnClient get then post?, click here.
>>>>> NAML
>>>>
>>>>
>>>> If you reply to this email, your message will be added to the discussion
>>>> below:
>>>> http://forum.world.st/ZnClient-get-then-post-tp4764605p4764722.html
>>>> To unsubscribe from ZnClient get then post?, click here.
>>>> NAML
>>>
>
>
>
>
>
> --
> View this message in context: http://forum.world.st/ZnClient-get-then-post-tp4764605p4764779.html
> Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.