66using System . Web ;
77using System . Xml . Linq ;
88using Castle . Core ;
9- using DevDefined . OAuth . Core ;
9+ using DevDefined . OAuth . Framework ;
1010
1111namespace DevDefined . OAuth . Consumer
1212{
@@ -120,40 +120,6 @@ public override string ToString()
120120 return FromStream ( stream => new StreamReader ( stream ) . ReadToEnd ( ) ) ;
121121 }
122122
123- private HttpWebResponse GetResponse ( OAuthContext context , IToken accessToken )
124- {
125- // TODO: refactor this, seems clunky
126- if ( accessToken != null )
127- {
128- _consumerContext . SignContextWithToken ( context , accessToken ) ;
129- }
130- else
131- {
132- _consumerContext . SignContext ( context ) ;
133- }
134-
135- Uri uri = context . GenerateUri ( ) ;
136-
137- var request = ( HttpWebRequest ) WebRequest . Create ( uri ) ;
138- request . Method = context . RequestMethod ;
139-
140- if ( ( context . FormEncodedParameters != null ) && ( context . FormEncodedParameters . Count > 0 ) )
141- {
142- request . ContentType = "application/x-www-form-urlencoded" ;
143- using ( var writer = new StreamWriter ( request . GetRequestStream ( ) ) )
144- {
145- writer . Write ( UriUtility . FormatQueryString ( context . FormEncodedParameters ) ) ;
146- }
147- }
148-
149- if ( _consumerContext . UseHeaderForOAuthParameters )
150- {
151- request . Headers [ Parameters . OAuth_Authorization_Header ] = context . GenerateOAuthParametersForHeader ( ) ;
152- }
153-
154- return ( HttpWebResponse ) request . GetResponse ( ) ;
155- }
156-
157123 public XDocument ToDocument ( )
158124 {
159125 return FromStream ( stream => XDocument . Load ( new StreamReader ( stream ) ) ) ;
@@ -170,10 +136,8 @@ public byte[] ToBytes()
170136 }
171137
172138 private T FromStream < T > ( Func < Stream , T > streamParser )
173- {
174- HttpWebResponse response = GetResponse ( _context , _token ) ;
175-
176- using ( Stream stream = response . GetResponseStream ( ) )
139+ {
140+ using ( Stream stream = ToWebResponse ( ) . GetResponseStream ( ) )
177141 {
178142 return streamParser ( stream ) ;
179143 }
@@ -196,17 +160,46 @@ private void ApplyParameters(NameValueCollection destination, IDictionary additi
196160
197161 public HttpWebRequest ToWebRequest ( )
198162 {
199- var request = ( HttpWebRequest ) WebRequest . Create ( _context . GenerateUri ( ) ) ;
163+ if ( string . IsNullOrEmpty ( _context . Signature ) )
164+ {
165+ if ( _token != null )
166+ {
167+ _consumerContext . SignContextWithToken ( _context , _token ) ;
168+ }
169+ else
170+ {
171+ _consumerContext . SignContext ( _context ) ;
172+ }
173+ }
174+
175+ Uri uri = _context . GenerateUri ( ) ;
200176
177+ var request = ( HttpWebRequest ) WebRequest . Create ( uri ) ;
201178 request . Method = _context . RequestMethod ;
202179
203- if ( _context . Headers != null ) request . Headers . Add ( _context . Headers ) ;
180+ if ( ( _context . FormEncodedParameters != null ) && ( _context . FormEncodedParameters . Count > 0 ) )
181+ {
182+ request . ContentType = "application/x-www-form-urlencoded" ;
183+ using ( var writer = new StreamWriter ( request . GetRequestStream ( ) ) )
184+ {
185+ writer . Write ( UriUtility . FormatQueryString ( _context . FormEncodedParameters ) ) ;
186+ }
187+ }
204188
205- // TODO: implement support for cookies
189+ if ( _consumerContext . UseHeaderForOAuthParameters )
190+ {
191+ request . Headers [ Parameters . OAuth_Authorization_Header ] = _context . GenerateOAuthParametersForHeader ( ) ;
192+ }
206193
207194 return request ;
208195 }
209196
197+ public HttpWebResponse ToWebResponse ( )
198+ {
199+ HttpWebRequest request = ToWebRequest ( ) ;
200+ return ( HttpWebResponse ) request . GetResponse ( ) ;
201+ }
202+
210203 public NameValueCollection ToBodyParameters ( )
211204 {
212205 try
@@ -242,6 +235,7 @@ public T Select<T>(Func<NameValueCollection, T> selectFunc)
242235
243236 public ConsumerRequest SignWithoutToken ( )
244237 {
238+ EnsureRequestHasNotBeenSignedYet ( ) ;
245239 _consumerContext . SignContext ( _context ) ;
246240 return this ;
247241 }
@@ -253,10 +247,19 @@ public ConsumerRequest SignWithToken()
253247
254248 public ConsumerRequest SignWithToken ( IToken token )
255249 {
250+ EnsureRequestHasNotBeenSignedYet ( ) ;
256251 _consumerContext . SignContextWithToken ( _context , token ) ;
257252 return this ;
258253 }
259254
255+ private void EnsureRequestHasNotBeenSignedYet ( )
256+ {
257+ if ( ! string . IsNullOrEmpty ( _context . Signature ) )
258+ {
259+ throw Error . ThisConsumerRequestHasAlreadyBeenSigned ( ) ;
260+ }
261+ }
262+
260263 public static implicit operator OAuthContext ( ConsumerRequest request )
261264 {
262265 return request . _context ;
0 commit comments