public virtual IList<Tour> Create(IPttRequest request, IOperator op, out TourFactoryStatus status) { if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.Create trying to get html for " + request.Url + " with postdata:"+request.PostValue); } var htmlSource = op.RequestResponseBehavior.GetHtmlMaster(request, false, op.ExtensiveLoggingNeeded, op.Name); if(op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.Create Html coming from htmlmaster"); Logger.LogProcess(htmlSource ?? ""); } if (string.IsNullOrEmpty(htmlSource)) { status = new TourFactoryStatus { Success = false }; return null; } var htmlSourceRefined = op.Refine(request, htmlSource); if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.Create Html refined"); Logger.LogProcess(htmlSourceRefined ?? ""); } var html = new HtmlDocument(); html.LoadHtml(htmlSourceRefined); var list = GetToursFromHtml(request, op, html, out status); return list; }
public IPttRequest RequestWithCaptchaValue(IPttRequest request, IPttCaptcha pttCaptcha) { var htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(request.Response); var challengeField = htmlDoc.DocumentNode.SelectSingleNode("//input[@id='recaptcha_challenge_field']"); if (challengeField == null) { return null; } var challengeFieldValue = challengeField.Attributes["value"].Value; var pttRequestFactory = new PttRequestFactory(request); var newReq = pttRequestFactory.Deserialize(string.Format("<Request><Url>{0}</Url><Method>POST</Method></Request>", request.Url)); newReq.PostValue = string.Format("recaptcha_challenge_field={0}&recaptcha_response_field={1}&submit=I%27m+a+human", challengeFieldValue, pttCaptcha.Value ?? ""); newReq.WrappedRequest.ContentType = "application/x-www-form-urlencoded"; var pttResponse = new PttResponse(); //bu gelen htmlsource dan textarea degerini oku htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(pttResponse.GetResponse(newReq)); var valueToPasteNode = htmlDoc.DocumentNode.SelectSingleNode("//textarea"); if (valueToPasteNode == null) { return null; } return null; }
public override string GetHtml(IPttRequest request, bool forHotelList) { if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha gethtml coming request: " + request); } IPttResponse response = new PttResponse(); var htmlSource = response.GetResponse(request); if(_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha gethtml: "+ htmlSource); } if (!_captchaRequestResponse.CaptchaShown(htmlSource)) { if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha captcha not shown, returning"); } return htmlSource; } if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha captcha shown"); } return CaptchaPassedResult(request, htmlSource); }
public IPttCaptcha CaptchaImage(IPttRequest request, string htmlSource) { var htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(htmlSource); var iframe = htmlDoc.DocumentNode.SelectSingleNode("//iframe"); if (iframe == null) { return null; } var iframeSrc = iframe.Attributes["src"].Value; var newRequest = new PttRequest(iframeSrc) {WrappedRequest = {ContentType = "text/html", Method = "GET"}}; IPttResponse response = new PttResponse(); var captchaFormHtml = response.GetResponse(newRequest); htmlDoc = new HtmlAgilityPack.HtmlDocument(); htmlDoc.LoadHtml(captchaFormHtml); var captchaImg = htmlDoc.DocumentNode.SelectSingleNode("//img"); if (captchaImg == null) { return null; } var captchaSrc = string.Format("http://{0}/recaptcha/api/{1}", googleHost, captchaImg.Attributes["src"].Value); return new PttCaptcha() { Url = captchaSrc, RequestUsed = newRequest, FormUrl = iframeSrc}; }
public override string GetHtml(IPttRequest request, bool forHotelList) { var proxy = WebHelper.GetProxyForOperator(_name); var natCap = new NatCap(); //phantomerror var html = natCap.GrabForOperator(request.Url, _name, proxy == null ? "" : proxy.Item1 + ":" + proxy.Item2, new CultureInfo("ru-RU").Name); if (_captchaRequestResponse.CaptchaShown(html)) { Logger.LogProcess("Natalie Captcha shown..."); } if (html.Contains("###MAXCAPTCHAEXCEEDED###")) { Logger.LogProcess("NATCAP: MAX CAPTCHA EXCEEDED"); return null; } if (html.Contains("###404###")) { Logger.LogProcess("NATCAP: 404"); return null; } if (html.Contains("###BLOCKED###")) { Logger.LogProcess("NATCAP: IP BLOCKED " + (proxy==null?"":proxy.Item1)); return null; } if (html.Contains("###CAPTCHASHOWN###")) { Logger.LogProcess("NATCAP: captcha shown"); return null; } return html; }
public IPttRequest RequestWithCaptchaValue(IPttRequest request, IPttCaptcha pttCaptcha) { var pttRequestFactory = new PttRequestFactory(request); var newReq = pttRequestFactory.Deserialize(string.Format("<Request><Url>{0}</Url><Method>POST</Method><Referer>{0}</Referer></Request>", request.Url)); newReq.WrappedRequest.ContentType = "application/x-www-form-urlencoded"; newReq.PostValue = Regex.Replace(request.PostValue, @"packageSearchCaptcha=[^&]*&", "packageSearchCaptcha=" + pttCaptcha.Value + "&"); return newReq; }
/// <summary> /// new but proxy and cookie, eventvalidation and cookiecontainer taken by request /// </summary> /// <param name="request"></param> public PttRequestFactory(IPttRequest request, bool keepAliveDefaultValue=true) { _proxy = request.Proxy; _cookieContainer = request.CookieContainer; _viewStateValue = request.ViewStateValue; _eventValidationValue = request.EventValidationValue; _keepAliveDefaultValue = keepAliveDefaultValue; }
public IPttRequest RequestWithCaptchaValue(IPttRequest request, IPttCaptcha pttCaptcha) { var pttRequestFactory = new PttRequestFactory(request); var newReq = pttRequestFactory.Deserialize(string.Format("<Request><Url>{0}</Url><Method>POST</Method></Request>", request.Url)); newReq.PostValue = "samo_action=antibot&are_you_human=" + pttCaptcha.Value; newReq.WrappedRequest.ContentType = "application/x-www-form-urlencoded"; return newReq; }
public override IList<Tour> Create(IPttRequest request, IOperator op, out TourFactoryStatus status) { if(!Biblo.TourDates.Contains(op.QueryObject.StartDate)) { status = new TourFactoryStatus { Success = true, MoveToNextHotel = true}; return null; } return base.Create(request, op, out status); }
/// <summary> /// the god-wrapper for gethml functions /// </summary> public virtual string GetHtmlMaster(IPttRequest request, bool forHotelList, bool extensiveLoggingNeeded = false, string operatorName=null) { PttWebRequest pttWebRequest = null; var unsuccesfullTries = 0; while (true) { try { string result = ""; if (extensiveLoggingNeeded) { Logger.LogProcess("GetHtmlMaster try #" + (unsuccesfullTries + 1) + " for request:" + request); } if (pttWebRequest==null) { pttWebRequest = PttWebRequest.Create(request.WrappedRequest); } var requestToUse = request; if (unsuccesfullTries > 0) { requestToUse = request.Clone(pttWebRequest); IWebProxy proxy = new WebProxy(); WebHelper.ArrangeProxy(ref proxy, operatorName); requestToUse.Proxy = proxy; } result = GetHtml(requestToUse, forHotelList); if (_retryNeededForRequest(result)) { if (extensiveLoggingNeeded) { Logger.LogProcess("Retry needed for try #" + (unsuccesfullTries + 1) + " for request:" + request); } throw new Exception("Retry needed!"); } if (extensiveLoggingNeeded) { Logger.LogProcess("GetHtmlMaster no more retry needed for request:" + request); } return result; } catch (Exception exc) { if (_tryAgainInException.Item1 == 0) { throw exc; } unsuccesfullTries++; Thread.Sleep(TimeSpan.FromSeconds(_tryAgainInException.Item2)); if (unsuccesfullTries == _tryAgainInException.Item1) { throw exc; } } } }
public IPttCaptcha CaptchaImage(IPttRequest request, string htmlSource) { return new PttCaptcha() { Base64Content = htmlSource.TrimMiddleWithLeftCalc("PackageSearch.CaptchaImageBuffer=\"", "\"").Replace( "data:image/png;base64,", ""), IsBase64 = true }; }
public IPttCaptcha CaptchaImage(IPttRequest request, string htmlSource) { var html = new HtmlDocument(); html.LoadHtml(htmlSource); var captchaImage = html.DocumentNode.SelectSingleNode("//img[@id='icaptcha']"); if (captchaImage == null) { return new PttCaptcha() { Url = _defaultCaptchUrl }; } return new PttCaptcha() {Url = captchaImage.Attributes["src"].Value}; }
protected override void FillSessionJar(IPttRequest request, int requestCounter) { if (request.RequestType != PttRequestType.Init) return; var dateToSelectStr = DatesToSelect(QueryObject.StartDate, request.Url, request.Response); TourDates = dateToSelectStr; var firstDate = DateTime.Today.ToString("d", new CultureInfo("ru-RU")); var lastDate = DateTime.Today.ToString("d", new CultureInfo("ru-RU")); if (dateToSelectStr.Any()) { firstDate = dateToSelectStr.First().ToString("d", new CultureInfo("ru-RU")); lastDate = dateToSelectStr.Last().ToString("d", new CultureInfo("ru-RU")); } request.SessionJar.AddOrUpdate("firstDate", firstDate, (k, v) => firstDate); request.SessionJar.AddOrUpdate("lastDate", lastDate, (k, v) => lastDate); }
private TourFactoryControlFlags BeforeIteratingWhileGettingTours(IPttRequest request, HtmlDocument htmlDocument) { var totalPageCountNode = htmlDocument.DocumentNode.SelectNodes("//span['_Pager2_LbHeader' = substring(@id, string-length(@id) - 15)]"); var totalPageCount = 1; if (totalPageCountNode != null && totalPageCountNode.Any()) { var match = Regex.Match(totalPageCountNode[0].InnerText, @"(\d)", RegexOptions.IgnoreCase); if (match.Success) { string pageCount = match.Groups[1].Value; Int32.TryParse(pageCount, out totalPageCount); } } return totalPageCount == PageIndex - 1 ? TourFactoryControlFlags.MoveToNextHotel : TourFactoryControlFlags.Pass; }
/// <summary> /// the god-wrapper for gethml functions /// </summary> public override string GetHtmlMaster(IPttRequest request, bool forHotelList, bool extensiveLoggingNeeded = false, string operatorName = null) { if (forHotelList && request.RequestType == PttRequestType.Init) { try { return base.GetHtmlMaster(request, forHotelList, extensiveLoggingNeeded, operatorName); } catch { return null; } } return base.GetHtmlMaster(request, forHotelList, extensiveLoggingNeeded, operatorName); }
public override string GetHtml(IPttRequest request, bool forHotelList) { var proxy = WebHelper.GetProxyForOperator(_name); var phantomJs = new PhantomJs(); //phantomerror var html = phantomJs.GrabForOperator(request.Url, _name, proxy == null ? "" : proxy.Item1 + ":" + proxy.Item2, new CultureInfo("ru-RU").Name); if (_captchaRequestResponse.CaptchaShown(html)) { Logger.LogProcess("Natalie Captcha shown..."); } if ("phantomerror" == html) { Logger.LogProcess("Phantom error..."); return null; } return html; }
protected override void FillSessionJar(IPttRequest request, int requestCounter) { if (requestCounter != 2) return; if (string.IsNullOrEmpty(request.Response)) return; double rate = 0.0; var html = new HtmlDocument(); html.LoadHtml(request.Response); var curr = html.DocumentNode.SelectSingleNode("//span[@class='eurRate']"); if (curr == null) return; var match = Regex.Match(curr.InnerText, @"(\d+),(\d+)", RegexOptions.IgnoreCase); if (!match.Success) return; var integerPart = match.Groups[1].Value; var floatingPart = match.Groups[2].Value; Double.TryParse(integerPart + "." + floatingPart, NumberStyles.AllowDecimalPoint, new CultureInfo("en-US"), out rate); request.SessionJar.AddOrUpdate("EurRate", rate, (k, v) => rate); }
public override string Refine(IPttRequest pttRequest, string htmlSource) { return htmlSource.TrimMiddle(DATA_START, DATA_END,true); }
public override string Refine(IPttRequest pttRequest, string htmlSource) { var arrayToXmlConverter = new JSONArrayToXmlConverter(); return arrayToXmlConverter.ToXml(htmlSource); }
public virtual string GetHtml(IPttRequest request, bool forHotelList) { IPttResponse response = new PttResponse(); var htmlSource = response.GetResponse(request); return htmlSource; }
protected string CaptchaPassedResult(IPttRequest request, string htmlSource) { IPttResponse response = new PttResponse(); var html = htmlSource; var captchaTries = 1; while (true) { var pttCaptcha = _captchaRequestResponse.CaptchaImage(request, html); if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha CaptchaPassedResult coming captcha:"+ pttCaptcha); } try { var captchaResolve = ResolveCaptcha(request, pttCaptcha, captchaTries); pttCaptcha.Value = captchaResolve.Item1; pttCaptcha.FileNameInTempDir = captchaResolve.Item2; if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha CaptchaPassedResult after resolving:" + pttCaptcha); } } catch (Exception exc) { Logger.LogExceptions(exc); return null; } IPttRequest captchaAddedRequest = _captchaRequestResponse.RequestWithCaptchaValue(request, pttCaptcha); if(_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha CaptchaPassedResult captchaAddedRequest:"+captchaAddedRequest); } var captchaPassedResult = response.GetResponse(captchaAddedRequest); captchaAddedRequest.WrappedRequest = null; GC.Collect(); if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha CaptchaPassedResult captchaPassedResult:" + captchaPassedResult); } if (_captchaRequestResponse.RepeatFirstRequest) { var pttRequestFactory = new PttRequestFactory(request); var firstRequest = pttRequestFactory.Deserialize(string.Format("<Request><Url>{0}</Url><Host>www.tez-tour.com</Host><Referer> <![CDATA[http://www.tez-tour.com]]></Referer></Request>", request.Url)); if (_extensiveLoggingNeeded) { Logger.LogProcess("RequestResponseWithCaptcha CaptchaPassedResult RepeatFirstRequest firstrequest:" + firstRequest); } captchaPassedResult = response.GetResponse(firstRequest); } if (_captchaRequestResponse.CaptchaShown(captchaPassedResult)) { Logger.LogProcess(string.Format("Incorrect captcha for {0}", pttCaptcha.FileNameInTempDir)); html = captchaPassedResult; captchaTries++; continue; } Logger.LogProcess(string.Format("Correct captcha for {0}", pttCaptcha.FileNameInTempDir)); return captchaPassedResult; } }
protected byte[] CaptchaImageBytes(IPttRequest request, string imageSource) { IPttRequestFactory pttRequestFactory = new PttRequestFactory(request, false); IPttResponse response = new PttResponse(); return response.GetResponseBytes(pttRequestFactory.SimpleRequest(imageSource)); }
protected Tuple<string, string> ResolveCaptcha(IPttRequest request, IPttCaptcha captcha, int captchaTries) { var captchaFileName = DownloadCaptchaImage(request, captcha); var captchaValue = _captchaBreaker.Guess(captchaFileName, captchaTries); return new Tuple<string, string>(captchaValue, captchaFileName); }
protected string DownloadCaptchaImage(IPttRequest request, IPttCaptcha captcha) { CaptchaHelper.CreateCaptchasFolder(); var captchaFileName = CaptchaHelper.NewCaptchaFileName(); //Logger.LogProcess("gelen captcha dosya adi:" + captchaFileName); var captchaImageBytes = captcha.IsBase64 ? Convert.FromBase64String(captcha.Base64Content) : CaptchaImageBytes(request, captcha.Url); var fs = new FileStream(captchaFileName, FileMode.Create); var bw = new BinaryWriter(fs); bw.Write(captchaImageBytes); fs.Close(); bw.Close(); return captchaFileName; }
protected virtual IList<Tour> GetToursFromHtml(IPttRequest request, IOperator op, HtmlDocument html, out TourFactoryStatus status) { status = new TourFactoryStatus { Success = true, MoveToNextHotel = false }; if (html.DocumentNode.SelectNodes(op.TourInfo.XPath) == null) { if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml xpath node selection returns no nodes"); } status.MoveToNextHotel = true; return null; } if (_beforeIteratingWhileGettingTours != null) { var ret = _beforeIteratingWhileGettingTours(request, html); if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml _beforeIteratingWhileGettingTours flags:"+ret.ToString()); } status.MoveToNextHotel = status.MoveToNextHotel || ret.HasFlag(TourFactoryControlFlags.MoveToNextHotel); if (ret.HasFlag(TourFactoryControlFlags.Return)) { return null; } } var list = new List<Tour>(); foreach (HtmlNode node in html.DocumentNode.SelectNodes(op.TourInfo.XPath)) { if (_iteratingWhileGettingToursBeforeTourItemSet != null) { var ret = _iteratingWhileGettingToursBeforeTourItemSet(request, node); if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml _iteratingWhileGettingToursBeforeTourItemSet flags:" + ret.ToString()); } status.MoveToNextHotel = status.MoveToNextHotel || ret.HasFlag(TourFactoryControlFlags.MoveToNextHotel); if (ret.HasFlag(TourFactoryControlFlags.Continue)) { continue; } if (ret.HasFlag(TourFactoryControlFlags.Break)) { break; } if (ret.HasFlag(TourFactoryControlFlags.Return)) { return null; } } var tourItem = new Tour(); tourItem.City = Dictionnaries.Regions[op.QueryObject.OriginId]; tourItem.TO = op.Name.Replace("_", "");//anex_ gibiler icin tourItem.IssueDate = DateTime.Now; tourItem.Date = op.TourInfo.GetFieldValue<DateTime>(node, "Date"); tourItem.Night = op.TourInfo.GetFieldValue<string>(node, "Night"); tourItem.Hotel = op.TourInfo.GetFieldValue<string>(node, "Hotel"); tourItem.RoomType = op.TourInfo.GetFieldValue<string>(node, "RoomType"); tourItem.ACC = op.TourInfo.GetFieldValue<string>(node, "Accomodation"); tourItem.Price = op.TourInfo.GetFieldValue<Double>(node, "Price"); var meal = op.TourInfo.GetFieldValue<string>(node, "Meal"); var mealTypeIndex = 7; var innerMealIndex = 0; foreach (var mealtypeAlternative in op.MealTypes) { if (mealtypeAlternative.Contains(meal)) { mealTypeIndex = innerMealIndex; break; } innerMealIndex++; } tourItem.Meal = Dictionnaries.MealTypes[mealTypeIndex]; tourItem.SPONo = op.TourInfo.GetFieldValue<string>(node, "SPONo"); if (_iteratingWhileGettingToursAfterTourItemSet != null) { var ret = _iteratingWhileGettingToursAfterTourItemSet(request, tourItem); if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml _iteratingWhileGettingToursAfterTourItemSet flags:" + ret.ToString()); } status.MoveToNextHotel = status.MoveToNextHotel || ret.HasFlag(TourFactoryControlFlags.MoveToNextHotel); if (ret.HasFlag(TourFactoryControlFlags.Continue)) { continue; } if (ret.HasFlag(TourFactoryControlFlags.Break)) { break; } if (ret.HasFlag(TourFactoryControlFlags.Return)) { return null; } } if (op.QueryObject != null && tourItem.Price < op.QueryObject.MinPrice) { if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml tour info found but less than minprice:" + tourItem.Price); } continue; } if (op.QueryObject != null && (op.QueryObject.MealType == mealTypeIndex || op.QueryObject.MealType == 0)) { if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml tour info added:" + tourItem.ToString()); } list.Add(tourItem); } else { if (op.ExtensiveLoggingNeeded) { Logger.LogProcess("TourFactory.GetToursFromHtml tour info found but excluded bcz of meal type:" + mealTypeIndex); } } } return list; }
public byte[] GetResponseBytes(IPttRequest request) { byte[] content; using (var response = (HttpWebResponse)request.WrappedRequest.GetResponse()) { using (var data = response.GetResponseStream()) { using (var reader = new StreamReader(data)) { using (var br = new BinaryReader(data)) { content = br.ReadBytes(500000); br.Close(); } //request.WrappedRequest.CookieContainer.Add(response.Cookies); reader.Close(); } data.Flush(); data.Close(); } response.Close(); request.WrappedRequest.Abort(); request.WrappedRequest = null; GC.Collect(); } return content; }
public string GetResponse(IPttRequest request) { PrepareForPost(request); try { string result = ""; using (var response = (HttpWebResponse)request.WrappedRequest.GetResponse()) { if ((int)response.StatusCode >= 300 && (int)response.StatusCode <= 399) { //redirection varsa request url sini degistirt var uriString = response.Headers["Location"]; var pttRequestFactory = new PttRequestFactory(request); var newRequest = pttRequestFactory.Deserialize(string.Format("<Request><Url>{0}</Url><Method>GET</Method><Host>{1}</Host><Referer><![CDATA[{2}]]></Referer></Request>", uriString, request.WrappedRequest.Host, request.WrappedRequest.Referer)); request.Response = "Redirect"; response.Close(); Logger.LogProcess("PttResponse GetResponse url redirect newRequest:" + newRequest); return GetResponse(newRequest); } //http://stackoverflow.com/questions/227575/encoding-problem-with-httpwebresponse var charset = response.CharacterSet; var encoding = Encoding.Default; if (!string.IsNullOrEmpty(charset)) encoding = Encoding.GetEncoding(charset); if (!request.Chunked) { //request.WrappedRequest.CookieContainer.Add(response.Cookies);//buna gerek yok gibi, request.Cookies ile debug edince GetResponse da cookiler otomatik olarak doluyor zaten using (var respStream = response.GetResponseStream()) { respStream.ReadTimeout = 1000; using (var sr = new StreamReader(respStream, encoding)) { result = sr.ReadToEnd(); sr.Close(); } response.Close(); request.Response = result; return result; } } else { var sb = new StringBuilder(); var buf = new byte[8192]; using (var resStream = response.GetResponseStream()) { int count; do { count = resStream.Read(buf, 0, buf.Length); if (count == 0) continue; var tmpString = encoding.GetString(buf, 0, count); sb.Append(tmpString); } while (count > 0); resStream.Flush(); resStream.Close(); } response.Close(); request.Response = sb.ToString(); return sb.ToString(); } } } catch (Exception e) { throw e; } finally { request.WrappedRequest.Abort(); request.WrappedRequest = null; GC.Collect(); } }
private TourFactoryControlFlags IteratingWhileGettingToursAfterTourItemSet(IPttRequest request, Tour tourItem) { return (tourItem.Price >= QueryObject.MinPrice && tourItem.Price <= QueryObject.MaxPrice) && (Int32.Parse(tourItem.Night) >= QueryObject.MinNights && Int32.Parse(tourItem.Night) <= QueryObject.MaxNights) ? TourFactoryControlFlags.Pass : TourFactoryControlFlags.Continue; }
private TourFactoryControlFlags IteratingWhileGettingToursBeforeTourItemSet(IPttRequest request, HtmlNode node) { if(node.ParentNode.SelectNodes("tr").FirstOrDefault() == node) return TourFactoryControlFlags.Continue; return node.ChildNodes.Count() < 12 ? TourFactoryControlFlags.Continue : TourFactoryControlFlags.Pass; }
public void PrepareForPost(IPttRequest request) { if (string.IsNullOrEmpty(request.PostValue)) return; var send = Encoding.Default.GetBytes(request.PostValue); request.WrappedRequest.ContentLength = send.Length; using (var sout = request.WrappedRequest.GetRequestStream()) { sout.Write(send, 0, send.Length); sout.Flush(); sout.Close(); } }