Пример #1
0
        /// <summary>
        /// 数据解析
        /// </summary>
        /// <param name="context">处理上下文</param>
        /// <returns></returns>
        public override async Task HandleAsync(DataFlowContext context)
        {
            context.NotNull(nameof(context));
            context.Response.NotNull(nameof(context.Response));

            if (!IsValidRequest(context.Request))
            {
                Logger.LogInformation(
                    $"{GetType().Name} ignore parse request {context.Request.RequestUri}, {context.Request.Hash}");
                return;
            }

            if (context.Selectable == null)
            {
                if (SelectableBuilder != null)
                {
                    context.Selectable = SelectableBuilder(context);
                }
                else
                {
                    var text = context.Response.ReadAsString().TrimStart();
                    if (text.StartsWith("<!DOCTYPE html>") || text.StartsWith("<html>"))
                    {
                        context.Selectable = CreateHtmlSelectable(context, text);
                    }
                    else
                    {
                        try
                        {
                            var token = (JObject)JsonConvert.DeserializeObject(text);
                            context.Selectable = new JsonSelectable(token);
                        }
                        catch
                        {
                            context.Selectable = new TextSelectable(text);
                        }
                    }
                }
            }

            await ParseAsync(context);

            var requests = new List <Request>();

            if (_followRequestQueriers != null)
            {
                foreach (var followRequestQuerier in _followRequestQueriers)
                {
                    var followRequests = followRequestQuerier(context);
                    if (followRequests != null)
                    {
                        requests.AddRange(followRequests);
                    }
                }
            }

            foreach (var request in requests)
            {
                if (IsValidRequest(request))
                {
                    // 在此强制设制 Owner, 防止用户忘记导致出错
                    request.Owner = context.Request.Owner;
                    request.Agent = context.Response.Agent;
                    context.AddFollowRequests(request);
                }
            }
        }