UTF-8 GET using Indy 10.5.8.0 and Delphi XE2

Posted by Bogdan Botezatu on Stack Overflow See other posts from Stack Overflow or by Bogdan Botezatu
Published on 2012-10-09T21:35:46Z Indexed on 2012/10/09 21:36 UTC
Read the original article Hit count: 289

Filed under:
|
|
|
|

I'm writing my first Unicode application with Delphi XE2 and I've stumbled upon an issue with GET requests to an Unicode URL. Shortly put, it's a routine in a MP3 tagging application that takes a track title and an artist and queries Last.FM for the corresponding album, track no and genre.

I have the following code:

function GetMP3Info(artist, track: string) : TMP3Data //<---(This is a record)
var
  TrackTitle,
  ArtistTitle : WideString;
  webquery    : WideString;

[....]

WebQuery := UTF8Encode('http://ws.audioscrobbler.com/2.0/?method=track.getcorrection&api_key=' + apikey + '&artist=' + artist + '&track=' + track);

//[processing the result in the web query, getting the correction for the artist and title]

// eg: for artist := Bucovina and track := Mestecanis, the corrected values are 
//ArtistTitle := Bucovina;
// TrackTitle := Mestecani?;

//Now here is the tricky part:

webquery := UTF8Encode('http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=' + apikey + '&artist=' + unescape(ArtistTitle) + '&track=' + unescape(TrackTitle)); 
//the unescape function replaces spaces (' ') with '+' to comply with the last.fm requests

[some more processing]

end;

The webquery looks in a TMemo just right (http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=e5565002840xxxxxxxxxxxxxx23b98ad&artist=Bucovina&track=Mestecani?)

Yet, when I try to send a GET() to the webquery using IdHTTP (with the ContentEncoding property set to 'UTF-8'), I see in Wireshark that the component is GET-ing the data to the ANSI value '/2.0/?method=track.getInfo&api_key=e5565002840xxxxxxxxxxxxxx23b98ad&artist=Bucovina&track=Mestec?ni?'

Here is the full headers for the GET requests and responses:

GET /2.0/?method=track.getInfo&api_key=e5565002840xxxxxxxxxxxxxx23b98ad&artist=Bucovina&track=Mestec?ni? HTTP/1.1

Content-Encoding: UTF-8

Host: ws.audioscrobbler.com

Accept: text/html, */*

Accept-Encoding: identity

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23 SearchToolbar/1.22011-10-16 20:20:07



HTTP/1.0 400 Bad Request

Date: Tue, 09 Oct 2012 20:46:31 GMT

Server: Apache/2.2.22 (Unix)

X-Web-Node: www204

Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Max-Age: 86400

Cache-Control: max-age=10

Expires: Tue, 09 Oct 2012 20:46:42 GMT

Content-Length: 114

Connection: close

Content-Type: text/xml; charset=utf-8;


<?xml version="1.0" encoding="utf-8"?>
<lfm status="failed">
<error code="6">
    Track not found
</error>
</lfm>

The question that puzzles me is am I overseeing anything related to setting the property of the control? How can I stop the well-formated URL i'm composing in the application from getting wrongfully sent to the server?

Thanks.

© Stack Overflow or respective owner

Related posts about unicode

Related posts about get