public async Task <object> Any(CreateNotebook request) { if (string.IsNullOrEmpty(request.Lang)) { throw new ArgumentNullException(nameof(request.Lang)); } if (string.IsNullOrEmpty(request.Slug)) { throw new ArgumentNullException(nameof(request.Slug)); } var baseUrl = request.Slug; if (baseUrl.IndexOf("://", StringComparison.Ordinal) == -1) { if (baseUrl.StartsWith("http.") || baseUrl.StartsWith("https.")) { baseUrl = baseUrl.LeftPart('.') + "://" + baseUrl.RightPart('.'); } else { baseUrl = "https://" + baseUrl; } } var requestDto = request.Request; var lang = LangInfoUtils.AssertLangInfo(request.Lang); var notebook = await Sites.CreateNotebookAsync(lang, baseUrl, request.IncludeTypes, requestDto, request.Args); var suffix = requestDto ?? (request.IncludeTypes != null ? request.IncludeTypes.Replace("{", "").Replace("}", "").Replace(".", "").Replace("*", "").Replace(",", "-") : ""); var fileName = request.Name ?? baseUrl.RightPart("://").LeftPart('/').SafeVarRef() + (string.IsNullOrEmpty(suffix) ? "" : "-" + suffix); if (!fileName.EndsWith(".ipynb")) { fileName += ".ipynb"; } var json = notebook.ToJson().IndentJson(); return(new HttpResult(json, "application/x-ipynb+json") { Headers = { [HttpHeaders.ContentDisposition] = $"attachment; {HttpExt.GetDispositionFileName(fileName)}; size={json.Length}; modification-date={DateTime.UtcNow.ToString("R").Replace(",", "")}" } }); }
public void Register(IAppHost appHost) { //Register the 'text/csv' content-type and serializers (format is inferred from the last part of the content-type) appHost.ContentTypes.Register(MimeTypes.Csv, SerializeToStream, CsvSerializer.DeserializeFromStream); //Add a response filter to add a 'Content-Disposition' header so browsers treat it natively as a .csv file appHost.GlobalResponseFilters.Add((req, res, dto) => { if (req.ResponseContentType == MimeTypes.Csv) { var fileName = req.OperationName + ".csv"; res.AddHeader(HttpHeaders.ContentDisposition, $"attachment;{HttpExt.GetDispositionFileName(fileName)}"); } }); }