public static bool CheckClientVersionAndWrapException(Version clientVersion, ref Exception innerException) { var currentServerVersion = RavenVersionAttribute.Instance; if (currentServerVersion.MajorVersion == clientVersion.Major && currentServerVersion.BuildVersion >= clientVersion.Revision && currentServerVersion.BuildVersion != ServerVersion.DevBuildNumber) { return(true); } innerException = new ClientVersionMismatchException( $"Failed to make a request from a newer client with build version {clientVersion} to an older server with build version {RavenVersionAttribute.Instance.AssemblyVersion}.{Environment.NewLine}" + $"Upgrading this node might fix this issue.", innerException); return(false); }
private static void CheckVersionAndWrapException(HttpContext context, ref Exception e) { if (RequestRouter.TryGetClientVersion(context, out var version) == false) { return; } if (version.Major == '3') { e = new ClientVersionMismatchException( $"RavenDB does not support interaction between Client API major version 3 and Server version {RavenVersionAttribute.Instance.MajorVersion} when major version does not match. Client: {version}. " + $"Server: {RavenVersionAttribute.Instance.AssemblyVersion}", e); } else if (HasInvalidCommandTypeException(e)) { RequestRouter.CheckClientVersionAndWrapException(version, ref e); }
private async Task RequestHandler(HttpContext context) { var requestHandlerContext = new RequestHandlerContext { HttpContext = context }; Exception exception = null; Stopwatch sp = null; try { context.Response.StatusCode = (int)HttpStatusCode.OK; context.Response.Headers["Content-Type"] = "application/json; charset=utf-8"; context.Response.Headers[Constants.Headers.ServerVersion] = RavenVersionAttribute.Instance.AssemblyVersion; if (_server.ServerStore.Initialized == false) { await _server.ServerStore.InitializationCompleted.WaitAsync(); } sp = Stopwatch.StartNew(); await _router.HandlePath(requestHandlerContext); sp.Stop(); } catch (Exception e) { sp?.Stop(); exception = e; if (context.Request.Headers.TryGetValue(Constants.Headers.ClientVersion, out var versions)) { var version = versions.ToString(); if (version.Length > 0 && version[0] != RavenVersionAttribute.Instance.MajorVersionAsChar) { e = new ClientVersionMismatchException( $"RavenDB does not support interaction between Client API and Server when major version does not match. Client: {version}. Server: {RavenVersionAttribute.Instance.AssemblyVersion}", e); } } MaybeSetExceptionStatusCode(context, _server.ServerStore, e); if (context.RequestAborted.IsCancellationRequested) { return; } using (_server.ServerStore.ContextPool.AllocateOperationContext(out JsonOperationContext ctx)) { var djv = new DynamicJsonValue { [nameof(ExceptionDispatcher.ExceptionSchema.Url)] = $"{context.Request.Path}{context.Request.QueryString}", [nameof(ExceptionDispatcher.ExceptionSchema.Type)] = e.GetType().FullName, [nameof(ExceptionDispatcher.ExceptionSchema.Message)] = e.Message, [nameof(ExceptionDispatcher.ExceptionSchema.Error)] = e.ToString() }; #if EXCEPTION_ERROR_HUNT var f = Guid.NewGuid() + ".error"; File.WriteAllText(f, $"{context.Request.Path}{context.Request.QueryString}" + Environment.NewLine + errorString); #endif MaybeAddAdditionalExceptionData(djv, e); using (var writer = new BlittableJsonTextWriter(ctx, context.Response.Body)) { var json = ctx.ReadObject(djv, "exception"); writer.WriteObject(json); } #if EXCEPTION_ERROR_HUNT File.Delete(f); #endif } } finally { // check if TW has clients if (TrafficWatchManager.HasRegisteredClients) { var database = requestHandlerContext.Database?.Name; LogTrafficWatch(context, sp?.ElapsedMilliseconds ?? 0, database); } if (sp != null && requestHandlerContext.HttpContext.Response.StatusCode != (int)HttpStatusCode.SwitchingProtocols) // exclude web sockets { var requestDuration = sp.ElapsedMilliseconds; requestHandlerContext.RavenServer?.Metrics.Requests.UpdateDuration(requestDuration); requestHandlerContext.Database?.Metrics.Requests.UpdateDuration(requestDuration); } if (_logger.IsInfoEnabled && SkipHttpLogging == false) { _logger.Info($"{context.Request.Method} {context.Request.Path.Value}{context.Request.QueryString.Value} - {context.Response.StatusCode} - {(sp?.ElapsedMilliseconds ?? 0):#,#;;0} ms", exception); } } }
private async Task RequestHandler(HttpContext context) { string database = null; try { context.Response.StatusCode = (int)HttpStatusCode.OK; context.Response.Headers["Content-Type"] = "application/json; charset=utf-8"; var sp = Stopwatch.StartNew(); database = await _router.HandlePath(context, context.Request.Method, context.Request.Path.Value); sp.Stop(); if (_logger.IsInfoEnabled && SkipHttpLogging == false) { _logger.Info($"{context.Request.Method} {context.Request.Path.Value}?{context.Request.QueryString.Value} - {context.Response.StatusCode} - {sp.ElapsedMilliseconds:#,#;;0} ms"); } if (TrafficWatchManager.HasRegisteredClients) { LogTrafficWatch(context, sp.ElapsedMilliseconds, database); } } catch (Exception e) { if (TrafficWatchManager.HasRegisteredClients) { LogTrafficWatch(context, 0, database ?? "N/A"); } if (context.RequestAborted.IsCancellationRequested) { return; } if (context.Request.Headers.TryGetValue(Constants.Headers.ClientVersion, out var versions)) { var version = versions.ToString(); if (version.Length > 0 && version[0] != RavenVersionAttribute.Instance.MajorVersionAsChar) { e = new ClientVersionMismatchException($"RavenDB does not support interaction between Client API and Server when major version does not match. Client: {version}. Server: {RavenVersionAttribute.Instance.AssemblyVersion}", e); } } MaybeSetExceptionStatusCode(context, e); using (_server.ServerStore.ContextPool.AllocateOperationContext(out JsonOperationContext ctx)) { var djv = new DynamicJsonValue { [nameof(ExceptionDispatcher.ExceptionSchema.Url)] = $"{context.Request.Path}{context.Request.QueryString}", [nameof(ExceptionDispatcher.ExceptionSchema.Type)] = e.GetType().FullName, [nameof(ExceptionDispatcher.ExceptionSchema.Message)] = e.Message, [nameof(ExceptionDispatcher.ExceptionSchema.Error)] = e.ToString() }; #if EXCEPTION_ERROR_HUNT var f = Guid.NewGuid() + ".error"; File.WriteAllText(f, $"{context.Request.Path}{context.Request.QueryString}" + Environment.NewLine + errorString); #endif MaybeAddAdditionalExceptionData(djv, e); using (var writer = new BlittableJsonTextWriter(ctx, context.Response.Body)) { var json = ctx.ReadObject(djv, "exception"); writer.WriteObject(json); } #if EXCEPTION_ERROR_HUNT File.Delete(f); #endif } } }