public KayakFrameworkBehavior(Type[] types) { var methodMap = types.CreateMethodMap(); RouteFunc = c => methodMap.GetMethodForContext(c); JsonMapper = new TypedJsonMapper(); JsonMapper.AddDefaultInputConversions(); JsonMapper.AddDefaultOutputConversions(); }
public static IDisposable UseFramework(this IObservable<ISocket> sockets) { TypedJsonMapper jsonMapper = new TypedJsonMapper(); jsonMapper.AddDefaultInputConversions(); jsonMapper.AddDefaultOutputConversions(); return sockets.UseFramework(new KayakFrameworkBehavior(Assembly.GetCallingAssembly().GetTypes())); }
public static IObservable<Unit> SerializeResultToJson(this IKayakContext context, TypedJsonMapper mapper) { var info = context.GetInvocationInfo(); if (info.Result != null) return context.WriteJsonResponse(info.Result, mapper); else if (info.Exception != null) { var exception = info.Exception; if (exception is TargetInvocationException) exception = exception.InnerException; context.Response.SetStatusToInternalServerError(); return context.WriteJsonResponse(new { Error = exception.Message }, mapper); } else return null; }
static IEnumerable<object> DeserializeArgsFromJsonInternal(this IKayakContext context, TypedJsonMapper mapper) { var info = context.GetInvocationInfo(); var parameters = info.Method.GetParameters().Where(p => RequestBodyAttribute.IsDefinedOn(p)); if (parameters.Count() != 0 && context.Request.Headers.GetContentLength() != 0) { IList<ArraySegment<byte>> requestBody = null; yield return BufferRequestBody(context).AsCoroutine<IList<ArraySegment<byte>>>().Do(d => requestBody = d); var reader = new JsonReader(new StringReader(requestBody.GetString())); if (parameters.Count() > 1) reader.Read(); // read array start foreach (var param in parameters) info.Arguments[param.Position] = mapper.Read(param.ParameterType, reader); //if (parameters.Count() > 1) // reader.Read(); // read array end } }
public static IObservable<Unit> DeserializeArgsFromJson(this IKayakContext context, TypedJsonMapper mapper) { return context.DeserializeArgsFromJsonInternal(mapper).AsCoroutine<Unit>(); }
static IObservable<Unit> WriteJsonResponse(this IKayakContext context, object o, TypedJsonMapper mapper) { var buffer = new MemoryStream(); var writer = new StreamWriter(buffer); bool minified = context.GetJsonOutputMinified(); var response = context.Response; response.Headers["Content-Type"] = minified ? "application/json; charset=utf-8" : "text/plain; charset=utf-8"; mapper.Write(o, new JsonWriter(writer) { Validate = false, PrettyPrint = !minified }); writer.Flush(); var bufferBytes = buffer.ToArray(); context.Response.Headers["Content-Length"] = bufferBytes.Length.ToString(); return context.Response.Write(bufferBytes, 0, bufferBytes.Length); }