How to ask Retrofit2, to don't encode my dynamic URL?How to suppress Charset being automatically added to Content-Type in okhttpHow can I open a URL in Android's web browser from my application?How to load an ImageView by URL in Android?URL encoding in AndroidResponse ok in interceptor, but empty in onSuccess() methodRetrofit2 Static encoded form data?don't get response retrofit2RxJava and Retrofit using KotlinUpload file to S3 with PUT and form-dataMockito retrofit2 with MVP architectureWhat is Retrofit OR operator for search
What fields between the rationals and the reals allow a good notion of 2D distance?
Taxes on Dividends in a Roth IRA
How do I fix the group tension caused by my character stealing and possibly killing without provocation?
What is the difference between lands and mana?
What is the highest possible scrabble score for placing a single tile
Can I cause damage to electrical appliances by unplugging them when they are turned on?
Non-trope happy ending?
How can I write humor as character trait?
What's the name of the logical fallacy where a debater extends a statement far beyond the original statement to make it true?
Does Doodling or Improvising on the Piano Have Any Benefits?
Make a Bowl of Alphabet Soup
How to explain what's wrong with this application of the chain rule?
What is Cash Advance APR?
Mimic lecturing on blackboard, facing audience
Which Article Helped Get Rid of Technobabble in RPGs?
Has the laser at Magurele, Romania reached a tenth of the Sun's power?
A Trivial Diagnosis
Is this part of the description of the Archfey warlock's Misty Escape feature redundant?
How could a planet have erratic days?
Strong empirical falsification of quantum mechanics based on vacuum energy density?
Creating two special characters
Does "he squandered his car on drink" sound natural?
Did the UK lift the requirement for registering SIM cards?
Has any country ever had 2 former presidents in jail simultaneously?
How to ask Retrofit2, to don't encode my dynamic URL?
How to suppress Charset being automatically added to Content-Type in okhttpHow can I open a URL in Android's web browser from my application?How to load an ImageView by URL in Android?URL encoding in AndroidResponse ok in interceptor, but empty in onSuccess() methodRetrofit2 Static encoded form data?don't get response retrofit2RxJava and Retrofit using KotlinUpload file to S3 with PUT and form-dataMockito retrofit2 with MVP architectureWhat is Retrofit OR operator for search
I'm trying to upgrade my code base from Retrofit 1.9 to version 2.0.
I have no problem in upload of an image in version 1.9. However I'm getting following S3 response error after I changed it to version 2.0.
This is my interface to upload image in Retrofit v1.9:
public interface IFileUploadAPI
@PUT("/url")
void uploadFile(@Path(value = "url", encode = false) String url, @Body() TypedFile file,
Callback<UploadFileResponse> callback);
I've changed it to following code on Retrofit v2.0:
public interface IFileUploadAPI
@PUT
Call<UploadFileResponse> uploadFile(@Url String url, @Body RequestBody file);
And I'm implementing it in this way.
public class MyFileUploadAPI
private IFileUploadAPI mService;
public MyFileUploadAPI()
final Retrofit adapter = new Retrofit.Builder() //
.baseUrl(MyAPIConstant.API_URL_BASE) // This URL will be ignored as we are using dynamic url. So no matters what it is.
.addConverterFactory(GsonConverterFactory.create(GsonUtils.getGson())) //
.client(ASDKApplication.getInstance().getOkHttpClient()) //
.build();
this.mService = adapter.create(IFileUploadAPI.class);
public void uploadFile(final String url, final String filePath, final String mimeType)
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
Call<UploadFileResponse> call = mService.uploadFile(url, file);
call.enqueue(new Callback<HitchUploadFileResponse>()
@Override
public void onResponse(Call<UploadFileResponse> call, Response<UploadFileResponse> response)
UploadFileResponse uploadFileResponse = new UploadFileResponse();
if (response.isSuccessful() && response.body() != null)
uploadFileResponse = response.body();
// Rest of code...
@Override
public void onFailure(Call<UploadFileResponse> call, Throwable t)
Logger.error(TAG, "uploadFile.onFailure(), msg: " + t.getMessage());
So, when user click on Upload
button, I call an API and it returns me a url that I have to call. The response looks likes:
["uploadSignedURL":"https://my-account.s3.amazonaws.com/license/1000_front_1464988248.jpeg?AWSAccessKeyId=MY_IDu0026Expires=1464991848u0026Signature=NhStdEX8RH3J0uzvVa6h%2FvN6FZQ%3D","filePath":"license/1000_front_1464988248.jpeg","target":"driving_license_front_img"]
And finally the response to call of above url (http status code 403 forbidden):
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>MY_ID</AWSAccessKeyId><StringToSign>PUT
image/jpeg; charset=utf-8
1464991848
/my-account/license/1000_front_1464988248.jpeg</StringToSign><SignatureProvided>NhStdEX8RH3J0uzvVa6h/vN6FZQ=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 6a 70 65 67 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 0b 31 34 36 34 39 39 31 38 34 38 0a 2f 6d 79 74 65 6b 73 69 3a 67 72 61 62 68 69 45 63 68 2f 6c 69 63 65 6e 73 65 2f 31 30 30 30 5f 66 72 6f 6e 74 5f 31 34 36 34 39 38 38 32 34 38 2e 6a 70 65 67</StringToSignBytes><RequestId>2D6D08FE4E34FCE5</RequestId><HostId>tpvmJdeRxtAzPxOk2zFwMF2Ne6hmNMkcaM9D7m/I13iynYGJyqtC0U72B2t41SDYfPBjCRTVyOY=</HostId></Error>
android amazon-s3 retrofit2
add a comment |
I'm trying to upgrade my code base from Retrofit 1.9 to version 2.0.
I have no problem in upload of an image in version 1.9. However I'm getting following S3 response error after I changed it to version 2.0.
This is my interface to upload image in Retrofit v1.9:
public interface IFileUploadAPI
@PUT("/url")
void uploadFile(@Path(value = "url", encode = false) String url, @Body() TypedFile file,
Callback<UploadFileResponse> callback);
I've changed it to following code on Retrofit v2.0:
public interface IFileUploadAPI
@PUT
Call<UploadFileResponse> uploadFile(@Url String url, @Body RequestBody file);
And I'm implementing it in this way.
public class MyFileUploadAPI
private IFileUploadAPI mService;
public MyFileUploadAPI()
final Retrofit adapter = new Retrofit.Builder() //
.baseUrl(MyAPIConstant.API_URL_BASE) // This URL will be ignored as we are using dynamic url. So no matters what it is.
.addConverterFactory(GsonConverterFactory.create(GsonUtils.getGson())) //
.client(ASDKApplication.getInstance().getOkHttpClient()) //
.build();
this.mService = adapter.create(IFileUploadAPI.class);
public void uploadFile(final String url, final String filePath, final String mimeType)
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
Call<UploadFileResponse> call = mService.uploadFile(url, file);
call.enqueue(new Callback<HitchUploadFileResponse>()
@Override
public void onResponse(Call<UploadFileResponse> call, Response<UploadFileResponse> response)
UploadFileResponse uploadFileResponse = new UploadFileResponse();
if (response.isSuccessful() && response.body() != null)
uploadFileResponse = response.body();
// Rest of code...
@Override
public void onFailure(Call<UploadFileResponse> call, Throwable t)
Logger.error(TAG, "uploadFile.onFailure(), msg: " + t.getMessage());
So, when user click on Upload
button, I call an API and it returns me a url that I have to call. The response looks likes:
["uploadSignedURL":"https://my-account.s3.amazonaws.com/license/1000_front_1464988248.jpeg?AWSAccessKeyId=MY_IDu0026Expires=1464991848u0026Signature=NhStdEX8RH3J0uzvVa6h%2FvN6FZQ%3D","filePath":"license/1000_front_1464988248.jpeg","target":"driving_license_front_img"]
And finally the response to call of above url (http status code 403 forbidden):
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>MY_ID</AWSAccessKeyId><StringToSign>PUT
image/jpeg; charset=utf-8
1464991848
/my-account/license/1000_front_1464988248.jpeg</StringToSign><SignatureProvided>NhStdEX8RH3J0uzvVa6h/vN6FZQ=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 6a 70 65 67 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 0b 31 34 36 34 39 39 31 38 34 38 0a 2f 6d 79 74 65 6b 73 69 3a 67 72 61 62 68 69 45 63 68 2f 6c 69 63 65 6e 73 65 2f 31 30 30 30 5f 66 72 6f 6e 74 5f 31 34 36 34 39 38 38 32 34 38 2e 6a 70 65 67</StringToSignBytes><RequestId>2D6D08FE4E34FCE5</RequestId><HostId>tpvmJdeRxtAzPxOk2zFwMF2Ne6hmNMkcaM9D7m/I13iynYGJyqtC0U72B2t41SDYfPBjCRTVyOY=</HostId></Error>
android amazon-s3 retrofit2
add a comment |
I'm trying to upgrade my code base from Retrofit 1.9 to version 2.0.
I have no problem in upload of an image in version 1.9. However I'm getting following S3 response error after I changed it to version 2.0.
This is my interface to upload image in Retrofit v1.9:
public interface IFileUploadAPI
@PUT("/url")
void uploadFile(@Path(value = "url", encode = false) String url, @Body() TypedFile file,
Callback<UploadFileResponse> callback);
I've changed it to following code on Retrofit v2.0:
public interface IFileUploadAPI
@PUT
Call<UploadFileResponse> uploadFile(@Url String url, @Body RequestBody file);
And I'm implementing it in this way.
public class MyFileUploadAPI
private IFileUploadAPI mService;
public MyFileUploadAPI()
final Retrofit adapter = new Retrofit.Builder() //
.baseUrl(MyAPIConstant.API_URL_BASE) // This URL will be ignored as we are using dynamic url. So no matters what it is.
.addConverterFactory(GsonConverterFactory.create(GsonUtils.getGson())) //
.client(ASDKApplication.getInstance().getOkHttpClient()) //
.build();
this.mService = adapter.create(IFileUploadAPI.class);
public void uploadFile(final String url, final String filePath, final String mimeType)
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
Call<UploadFileResponse> call = mService.uploadFile(url, file);
call.enqueue(new Callback<HitchUploadFileResponse>()
@Override
public void onResponse(Call<UploadFileResponse> call, Response<UploadFileResponse> response)
UploadFileResponse uploadFileResponse = new UploadFileResponse();
if (response.isSuccessful() && response.body() != null)
uploadFileResponse = response.body();
// Rest of code...
@Override
public void onFailure(Call<UploadFileResponse> call, Throwable t)
Logger.error(TAG, "uploadFile.onFailure(), msg: " + t.getMessage());
So, when user click on Upload
button, I call an API and it returns me a url that I have to call. The response looks likes:
["uploadSignedURL":"https://my-account.s3.amazonaws.com/license/1000_front_1464988248.jpeg?AWSAccessKeyId=MY_IDu0026Expires=1464991848u0026Signature=NhStdEX8RH3J0uzvVa6h%2FvN6FZQ%3D","filePath":"license/1000_front_1464988248.jpeg","target":"driving_license_front_img"]
And finally the response to call of above url (http status code 403 forbidden):
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>MY_ID</AWSAccessKeyId><StringToSign>PUT
image/jpeg; charset=utf-8
1464991848
/my-account/license/1000_front_1464988248.jpeg</StringToSign><SignatureProvided>NhStdEX8RH3J0uzvVa6h/vN6FZQ=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 6a 70 65 67 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 0b 31 34 36 34 39 39 31 38 34 38 0a 2f 6d 79 74 65 6b 73 69 3a 67 72 61 62 68 69 45 63 68 2f 6c 69 63 65 6e 73 65 2f 31 30 30 30 5f 66 72 6f 6e 74 5f 31 34 36 34 39 38 38 32 34 38 2e 6a 70 65 67</StringToSignBytes><RequestId>2D6D08FE4E34FCE5</RequestId><HostId>tpvmJdeRxtAzPxOk2zFwMF2Ne6hmNMkcaM9D7m/I13iynYGJyqtC0U72B2t41SDYfPBjCRTVyOY=</HostId></Error>
android amazon-s3 retrofit2
I'm trying to upgrade my code base from Retrofit 1.9 to version 2.0.
I have no problem in upload of an image in version 1.9. However I'm getting following S3 response error after I changed it to version 2.0.
This is my interface to upload image in Retrofit v1.9:
public interface IFileUploadAPI
@PUT("/url")
void uploadFile(@Path(value = "url", encode = false) String url, @Body() TypedFile file,
Callback<UploadFileResponse> callback);
I've changed it to following code on Retrofit v2.0:
public interface IFileUploadAPI
@PUT
Call<UploadFileResponse> uploadFile(@Url String url, @Body RequestBody file);
And I'm implementing it in this way.
public class MyFileUploadAPI
private IFileUploadAPI mService;
public MyFileUploadAPI()
final Retrofit adapter = new Retrofit.Builder() //
.baseUrl(MyAPIConstant.API_URL_BASE) // This URL will be ignored as we are using dynamic url. So no matters what it is.
.addConverterFactory(GsonConverterFactory.create(GsonUtils.getGson())) //
.client(ASDKApplication.getInstance().getOkHttpClient()) //
.build();
this.mService = adapter.create(IFileUploadAPI.class);
public void uploadFile(final String url, final String filePath, final String mimeType)
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
Call<UploadFileResponse> call = mService.uploadFile(url, file);
call.enqueue(new Callback<HitchUploadFileResponse>()
@Override
public void onResponse(Call<UploadFileResponse> call, Response<UploadFileResponse> response)
UploadFileResponse uploadFileResponse = new UploadFileResponse();
if (response.isSuccessful() && response.body() != null)
uploadFileResponse = response.body();
// Rest of code...
@Override
public void onFailure(Call<UploadFileResponse> call, Throwable t)
Logger.error(TAG, "uploadFile.onFailure(), msg: " + t.getMessage());
So, when user click on Upload
button, I call an API and it returns me a url that I have to call. The response looks likes:
["uploadSignedURL":"https://my-account.s3.amazonaws.com/license/1000_front_1464988248.jpeg?AWSAccessKeyId=MY_IDu0026Expires=1464991848u0026Signature=NhStdEX8RH3J0uzvVa6h%2FvN6FZQ%3D","filePath":"license/1000_front_1464988248.jpeg","target":"driving_license_front_img"]
And finally the response to call of above url (http status code 403 forbidden):
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>MY_ID</AWSAccessKeyId><StringToSign>PUT
image/jpeg; charset=utf-8
1464991848
/my-account/license/1000_front_1464988248.jpeg</StringToSign><SignatureProvided>NhStdEX8RH3J0uzvVa6h/vN6FZQ=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 6a 70 65 67 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 0b 31 34 36 34 39 39 31 38 34 38 0a 2f 6d 79 74 65 6b 73 69 3a 67 72 61 62 68 69 45 63 68 2f 6c 69 63 65 6e 73 65 2f 31 30 30 30 5f 66 72 6f 6e 74 5f 31 34 36 34 39 38 38 32 34 38 2e 6a 70 65 67</StringToSignBytes><RequestId>2D6D08FE4E34FCE5</RequestId><HostId>tpvmJdeRxtAzPxOk2zFwMF2Ne6hmNMkcaM9D7m/I13iynYGJyqtC0U72B2t41SDYfPBjCRTVyOY=</HostId></Error>
android amazon-s3 retrofit2
android amazon-s3 retrofit2
edited Mar 8 at 0:00
halfer
14.7k759116
14.7k759116
asked Jun 3 '16 at 21:23
HesamHesam
22.2k50171295
22.2k50171295
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Ok, I found what's wrong.
okhttp
is adding charset=utf-8
into my contentType
. Therefore my contentType
becomes like this contentType: image/jpeg; charset=utf-8
. I tested on Postman and by delete of ; charset=utf-8
I'm able to upload my image.
https://stackoverflow.com/a/25560731/513413 says the reason of adding charset
. It's because I'm passing path to my image file. You can easily change
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
to
RequestBody file = RequestBody.create(MediaType.parse(mimeType), new File(filePath));
There is one more important thing. Once you upload your image to S3, Amazon returns HTTP status code 200 with empty body. So you have to change the interface too.
public interface IFileUploadAPI
@PUT
Call<Void> uploadFile(@Url String url, @Body RequestBody file);
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f37623636%2fhow-to-ask-retrofit2-to-dont-encode-my-dynamic-url%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Ok, I found what's wrong.
okhttp
is adding charset=utf-8
into my contentType
. Therefore my contentType
becomes like this contentType: image/jpeg; charset=utf-8
. I tested on Postman and by delete of ; charset=utf-8
I'm able to upload my image.
https://stackoverflow.com/a/25560731/513413 says the reason of adding charset
. It's because I'm passing path to my image file. You can easily change
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
to
RequestBody file = RequestBody.create(MediaType.parse(mimeType), new File(filePath));
There is one more important thing. Once you upload your image to S3, Amazon returns HTTP status code 200 with empty body. So you have to change the interface too.
public interface IFileUploadAPI
@PUT
Call<Void> uploadFile(@Url String url, @Body RequestBody file);
add a comment |
Ok, I found what's wrong.
okhttp
is adding charset=utf-8
into my contentType
. Therefore my contentType
becomes like this contentType: image/jpeg; charset=utf-8
. I tested on Postman and by delete of ; charset=utf-8
I'm able to upload my image.
https://stackoverflow.com/a/25560731/513413 says the reason of adding charset
. It's because I'm passing path to my image file. You can easily change
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
to
RequestBody file = RequestBody.create(MediaType.parse(mimeType), new File(filePath));
There is one more important thing. Once you upload your image to S3, Amazon returns HTTP status code 200 with empty body. So you have to change the interface too.
public interface IFileUploadAPI
@PUT
Call<Void> uploadFile(@Url String url, @Body RequestBody file);
add a comment |
Ok, I found what's wrong.
okhttp
is adding charset=utf-8
into my contentType
. Therefore my contentType
becomes like this contentType: image/jpeg; charset=utf-8
. I tested on Postman and by delete of ; charset=utf-8
I'm able to upload my image.
https://stackoverflow.com/a/25560731/513413 says the reason of adding charset
. It's because I'm passing path to my image file. You can easily change
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
to
RequestBody file = RequestBody.create(MediaType.parse(mimeType), new File(filePath));
There is one more important thing. Once you upload your image to S3, Amazon returns HTTP status code 200 with empty body. So you have to change the interface too.
public interface IFileUploadAPI
@PUT
Call<Void> uploadFile(@Url String url, @Body RequestBody file);
Ok, I found what's wrong.
okhttp
is adding charset=utf-8
into my contentType
. Therefore my contentType
becomes like this contentType: image/jpeg; charset=utf-8
. I tested on Postman and by delete of ; charset=utf-8
I'm able to upload my image.
https://stackoverflow.com/a/25560731/513413 says the reason of adding charset
. It's because I'm passing path to my image file. You can easily change
RequestBody file = RequestBody.create(MediaType.parse(mimeType), filePath);
to
RequestBody file = RequestBody.create(MediaType.parse(mimeType), new File(filePath));
There is one more important thing. Once you upload your image to S3, Amazon returns HTTP status code 200 with empty body. So you have to change the interface too.
public interface IFileUploadAPI
@PUT
Call<Void> uploadFile(@Url String url, @Body RequestBody file);
edited May 23 '17 at 12:15
Community♦
11
11
answered Jun 4 '16 at 23:25
HesamHesam
22.2k50171295
22.2k50171295
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f37623636%2fhow-to-ask-retrofit2-to-dont-encode-my-dynamic-url%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown