views:

251

answers:

2

Hi,

I need to get the free Google charts working over SSL without any security errors. I am using c# and asp.net.

As Google charts does not support SSL by default, I am looking for a robust method of using there charts but ensuring my user doesn't get any security warnings over their browser.

One thought was to use a handler to call the charts api and then generate the output my site needs.

Similar to Pants are optional blog post. I haven't been able to get this example working at this stage.

Any suggestions, or samples are welcome.

Thanks

A: 

I Have a partial solution that has one issue.

here is the link to my new post asking for help with a specific problem regarding my solution

My Attempt at a SSL handler

SetiSeeker
+2  A: 

We do this automatically in the NetQuarry Platform - it's pretty simple, although you do force the image to come through your site vs. charts.google.com, making your browser run the request through a single connection.

Since a chart is just a link to an image, what we do is to build the link to the chart (a much more complex process, obviously), then add the whole link to the query string on an internal handler (handler.ashx?req=chart& ). So the new link looks like this:

handler.ashx?act=chrt&req=chart&cht=p3&chs=450x170&chd=s:HAR9GBA&chl=New|In%20Progress|Responded|Won't%20Respond|On%20Hold|Future|Review|&chg=20,20,1,5&chg=10,25,1,5&chco=0A477D

Then, we simply download the image data and write it back as the response.

Here's the code:

Blockquote

    private void GoogleChart(HttpContext cxt)
    {            
        const string csPrefix = "?act=chrt&req=chart&";

        HttpRequest     req = cxt.Request;
        HttpResponse    rsp = cxt.Response;
        string          sUrl = cxt.Request.RawUrl;
        int             nStart = sUrl.IndexOf(csPrefix,  StringComparison.OrdinalIgnoreCase);

        rsp.Clear();

        if (nStart > 0)
        {
            sUrl = "http://chart.apis.google.com/chart?" + sUrl.Substring(nStart + csPrefix.Length);

            System.Net.WebClient    wc = new System.Net.WebClient();

            byte[] buffer = wc.DownloadData(sUrl);

            cxt.Response.ClearContent();
            cxt.Response.ClearHeaders();
            cxt.Response.ContentType = "application/octet-stream";
            cxt.Response.AppendHeader("content-length", buffer.Length.ToString());              

            cxt.Response.BinaryWrite(buffer);
        }
    }
Ryan Reid