static void ReturnSetup(HttpContext context, AppInfo info) { var request = context.Request; var response = context.Response; response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}.exe", info.SetupName)); response.ContentType = "application/octet-stream"; var setupPath = Path.Combine(info.AssetPath, "setup.exe"); var proposedReturnUrl = new UriBuilder(request.Url) { Path = info.VirtualPath, Query = string.Empty, Fragment = string.Empty }.Uri.ToString(); var installUrl = info.ReturnUrlSelector(request, proposedReturnUrl); var xtallParameters = string.Format("-install \"{0}\"", installUrl); var parameters = info.ParameterSelector(request, xtallParameters); if (string.IsNullOrWhiteSpace(parameters)) { // no need to rewrite response.TransmitFile(setupPath); response.End(); } /* TODO if (info.CachePath != null) { var tempPath = Path.Combine(info.CachePath, Path.GetRandomFileName()); using(var destination = File.OpenWrite(tempPath)) using(var source = File.OpenRead(setupPath)) WriteParameters(source, parameters, destination); context.Response.TransmitFile(tempPath); context.Response.End(); } */ using (var source = File.OpenRead(setupPath)) WriteParameters(source, parameters, context.Response.OutputStream); response.End(); }