// Token: 0x060001DD RID: 477 RVA: 0x000085B4 File Offset: 0x000067B4 internal override void ParseValue(ValueParser parser, bool storeValue) { MimeStringList empty = MimeStringList.Empty; parser.ParseCFWS(false, ref empty, true); MimeString mimeString = parser.ParseToken(); MimeString mimeString2 = MimeString.Empty; parser.ParseCFWS(false, ref empty, true); byte b = parser.ParseGet(); if (b == 47) { parser.ParseCFWS(false, ref empty, true); mimeString2 = parser.ParseToken(); } else if (b != 0) { parser.ParseUnget(); } if (storeValue) { if (mimeString.Length == 0) { this.type = "text"; } else { this.type = Header.NormalizeString(mimeString.Data, mimeString.Offset, mimeString.Length, false); } if (mimeString2.Length == 0) { if (this.type == "multipart") { this.subType = "mixed"; } else if (this.type == "text") { this.subType = "plain"; } else { this.type = "application"; this.subType = "octet-stream"; } } else { this.subType = Header.NormalizeString(mimeString2.Data, mimeString2.Offset, mimeString2.Length, false); } this.value = ContentTypeHeader.ComposeContentTypeValue(this.type, this.subType); } if (this.type == "multipart") { this.handleISO2022 = false; } }
private void Parse() { this.Reset(); this.parsed = true; DecodingOptions headerDecodingOptions = base.GetHeaderDecodingOptions(); ValueParser valueParser = new ValueParser(base.Lines, headerDecodingOptions.AllowUTF8); MimeStringList mimeStringList = default(MimeStringList); MimeStringList mimeStringList2 = default(MimeStringList); MimeString mimeString = default(MimeString); MimeString mimeString2 = MimeString.Empty; ReceivedHeader.ParseState parseState = ReceivedHeader.ParseState.None; for (;;) { valueParser.ParseWhitespace(true, ref mimeStringList); byte b = valueParser.ParseGet(); if (b == 0) { break; } if (59 == b) { parseState = ReceivedHeader.ParseState.Date; } else if (40 == b && parseState == ReceivedHeader.ParseState.DomainValue) { parseState = ReceivedHeader.ParseState.DomainAddress; } else { valueParser.ParseUnget(); mimeString = valueParser.ParseToken(); if (mimeString.Length == 0) { valueParser.ParseGet(); mimeStringList2.TakeOverAppend(ref mimeStringList); valueParser.ParseAppendLastByte(ref mimeStringList2); continue; } ReceivedHeader.ParseState parseState2 = this.StateFromToken(mimeString); if (ReceivedHeader.ParseState.None != parseState2) { parseState = parseState2; } } switch (parseState) { case ReceivedHeader.ParseState.Domain: case ReceivedHeader.ParseState.OptInfo: if (mimeString2.Length != 0) { this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); } else { mimeStringList2.Reset(); } mimeString2 = mimeString; valueParser.ParseWhitespace(false, ref mimeStringList); mimeStringList.Reset(); parseState++; break; case ReceivedHeader.ParseState.DomainValue: mimeStringList2.TakeOverAppend(ref mimeStringList); mimeStringList2.AppendFragment(mimeString); break; case ReceivedHeader.ParseState.DomainAddress: { bool flag = mimeString2.CompareEqI(ReceivedHeader.ParamFrom); this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); mimeStringList.Reset(); valueParser.ParseUnget(); valueParser.ParseComment(true, false, ref mimeStringList2, true); byte[] sz = mimeStringList2.GetSz(); string text = (sz == null) ? null : ByteString.BytesToString(sz, headerDecodingOptions.AllowUTF8); if (flag) { this.fromTcpInfoValue = text; } else { this.byTcpInfoValue = text; } mimeStringList2.Reset(); parseState = ReceivedHeader.ParseState.None; break; } case ReceivedHeader.ParseState.OptInfoValue: mimeStringList2.TakeOverAppend(ref mimeStringList); mimeStringList2.AppendFragment(mimeString); break; case ReceivedHeader.ParseState.Date: { this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); mimeStringList.Reset(); valueParser.ParseWhitespace(false, ref mimeStringList); valueParser.ParseToEnd(ref mimeStringList2); byte[] sz2 = mimeStringList2.GetSz(); this.dateValue = ((sz2 == null) ? null : ByteString.BytesToString(sz2, false)); break; } case ReceivedHeader.ParseState.None: mimeStringList2.Reset(); break; } } this.FinishClause(ref mimeString2, ref mimeStringList2, headerDecodingOptions.AllowUTF8); }
private static void ParseValue(MimeStringList list, out DateTime utcDateTime, out TimeSpan timeZoneOffset) { MimeStringList mimeStringList = default(MimeStringList); ValueParser valueParser = new ValueParser(list, false); DateHeader.ParseStage parseStage = DateHeader.ParseStage.DayOfWeek; int[] array = new int[8]; byte b = 32; while (parseStage != DateHeader.ParseStage.Count) { valueParser.ParseCFWS(false, ref mimeStringList, true); byte b2 = valueParser.ParseGet(); if (b2 == 0) { break; } if (!MimeScan.IsToken(b2) || b2 == 45 || b2 == 43) { b = b2; valueParser.ParseCFWS(false, ref mimeStringList, true); } else { if (MimeScan.IsDigit(b2)) { if (parseStage == DateHeader.ParseStage.DayOfWeek) { parseStage = DateHeader.ParseStage.DayOfMonth; } if (parseStage == DateHeader.ParseStage.Second && b != 58) { parseStage = DateHeader.ParseStage.Zone; } int num = 0; do { num++; array[(int)parseStage] *= 10; array[(int)parseStage] += (int)(b2 - 48); b2 = valueParser.ParseGet(); }while (b2 != 0 && MimeScan.IsDigit(b2)); if (b2 != 0) { valueParser.ParseUnget(); } if (parseStage == DateHeader.ParseStage.Year && num <= 2) { array[(int)parseStage] += ((array[(int)parseStage] < 30) ? 2000 : 1900); } if (parseStage == DateHeader.ParseStage.Zone && num <= 2) { array[(int)parseStage] *= 100; } if (parseStage == DateHeader.ParseStage.Zone && b == 45) { array[(int)parseStage] = -array[(int)parseStage]; } parseStage++; } else if (MimeScan.IsAlpha(b2)) { valueParser.ParseUnget(); MimeString mimeString = valueParser.ParseToken(MimeScan.Token.Alpha); if (parseStage == DateHeader.ParseStage.DayOfWeek) { parseStage = DateHeader.ParseStage.DayOfMonth; } else if (parseStage == DateHeader.ParseStage.Month) { array[(int)parseStage] = DateHeader.MapMonthToInt(mimeString.Data, mimeString.Offset, mimeString.Length); parseStage = DateHeader.ParseStage.Year; } else if (parseStage >= DateHeader.ParseStage.Second) { if (mimeString.Length == 2 && 65 == DateHeader.MakeUpper(mimeString[0]) && 77 == DateHeader.MakeUpper(mimeString[1])) { if (array[4] == 12) { array[4] = 0; } parseStage = DateHeader.ParseStage.Zone; } else if (mimeString.Length == 2 && 80 == DateHeader.MakeUpper(mimeString[0]) && 77 == DateHeader.MakeUpper(mimeString[1])) { if (array[4] < 12) { array[4] += 12; } parseStage = DateHeader.ParseStage.Zone; } else { array[7] = (int)DateHeader.MapZoneToInt(mimeString.Data, mimeString.Offset, mimeString.Length); parseStage = DateHeader.ParseStage.Count; } } } b = 32; } } if (parseStage > DateHeader.ParseStage.Year) { int num2 = array[3]; int num3 = array[2]; int num4 = array[1]; int num5 = array[4]; int num6 = array[5]; int num7 = array[6]; if (num5 == 23 && num6 == 59 && num7 == 60) { num7 = 59; } if (num2 >= 1900 && num2 <= 9999 && num3 >= 1 && num3 <= 12 && num4 >= 1 && num4 <= DateTime.DaysInMonth(num2, num3) && num5 >= 0 && num5 < 24 && num6 >= 0 && num6 < 60 && num7 >= 0 && num7 < 60) { try { utcDateTime = new DateTime(num2, num3, num4, num5, num6, num7, 0, DateTimeKind.Utc); goto IL_319; } catch (ArgumentException) { utcDateTime = DateHeader.minDateTime; goto IL_319; } } utcDateTime = DateHeader.minDateTime; } else { utcDateTime = DateHeader.minDateTime; } IL_319: if (parseStage != DateHeader.ParseStage.Count || !(utcDateTime > DateHeader.minDateTime)) { timeZoneOffset = TimeSpan.Zero; return; } int num8 = array[7] / 100; int num9 = array[7] % 100; if (num8 > 99 || num8 < -99) { num8 = 0; num9 = 0; } if (num9 > 59 || num9 < -59) { num9 = 0; } timeZoneOffset = new TimeSpan(num8, num9, 0); if (utcDateTime.Ticks >= timeZoneOffset.Ticks && DateTime.MaxValue.Ticks >= utcDateTime.Ticks - timeZoneOffset.Ticks) { utcDateTime -= timeZoneOffset; return; } utcDateTime = DateHeader.minDateTime; timeZoneOffset = TimeSpan.Zero; }
internal void ParseParameters(ref ValueParser parser, DecodingOptions decodingOptions, int countLimit, int bytesLimit) { MimeStringList mimeStringList = default(MimeStringList); MimeStringList mimeStringList2 = default(MimeStringList); bool flag = false; int num = 0; bool flag2 = DecodingFlags.None != (DecodingFlags.Rfc2231 & decodingOptions.DecodingFlags); for (;;) { parser.ParseCFWS(false, ref mimeStringList, this.handleISO2022); byte b = parser.ParseGet(); if (b != 59) { if (b == 0) { break; } parser.ParseUnget(); parser.ParseSkipToNextDelimiterByte(59); } else { parser.ParseCFWS(false, ref mimeStringList, this.handleISO2022); MimeString mimeString = parser.ParseToken(); if (mimeString.Length != 0 && mimeString.Length < 128) { parser.ParseCFWS(false, ref mimeStringList, this.handleISO2022); b = parser.ParseGet(); if (b != 61) { if (b == 0) { return; } parser.ParseUnget(); } else { parser.ParseCFWS(false, ref mimeStringList, this.handleISO2022); parser.ParseParameterValue(ref mimeStringList2, ref flag, this.handleISO2022); if (2147483647 != countLimit || 2147483647 != bytesLimit) { if (++num > countLimit) { goto Block_8; } if (mimeStringList2.Length > bytesLimit) { goto Block_9; } } else { bool valueEncoded = false; int num2 = -1; if (flag2) { int num3 = ByteString.IndexOf(mimeString.Data, 42, mimeString.Offset, mimeString.Length); if (num3 > 0) { int num4 = mimeString.Offset + mimeString.Length; int num5 = num3 + 1; num2 = 0; while (num5 != num4 && mimeString.Data[num5] >= 48 && mimeString.Data[num5] <= 57) { num2 = num2 * 10 + (int)(mimeString.Data[num5] - 48); if (10000 < num2) { num2 = -1; break; } num5++; } if (-1 != num2) { bool flag3 = 42 == mimeString.Data[num4 - 1]; if (num5 < num4 - 1 || (num5 < num4 && !flag3)) { num2 = -1; } else { valueEncoded = flag3; mimeString.TrimRight(num4 - num3); } } } } string text = Header.NormalizeString(mimeString.Data, mimeString.Offset, mimeString.Length, false); MimeParameter mimeParameter = new MimeParameter(text); mimeParameter.AppendValue(ref mimeStringList2); mimeParameter.SegmentNumber = num2; mimeParameter.ValueEncoded = valueEncoded; MimeNode mimeNode; MimeNode nextSibling; for (mimeNode = base.FirstChild; mimeNode != null; mimeNode = nextSibling) { nextSibling = mimeNode.NextSibling; MimeParameter mimeParameter2 = mimeNode as MimeParameter; if (mimeParameter2 != null && mimeParameter2.Name == text) { break; } } if (0 >= num2) { if (mimeNode != null) { mimeParameter.AllowAppend = true; for (MimeNode mimeNode2 = mimeNode.FirstChild; mimeNode2 != null; mimeNode2 = nextSibling) { nextSibling = mimeNode2.NextSibling; if (mimeNode2 is MimeParameter) { mimeNode.RemoveChild(mimeNode2); mimeParameter.InternalAppendChild(mimeNode2); } } mimeParameter.AllowAppend = false; base.InternalRemoveChild(mimeNode); } base.InternalAppendChild(mimeParameter); } else { if (mimeNode == null) { MimeParameter mimeParameter3 = new MimeParameter(text); mimeParameter3.SegmentNumber = 0; base.InternalAppendChild(mimeParameter3); mimeNode = mimeParameter3; } MimeNode mimeNode3; MimeNode previousSibling; for (mimeNode3 = mimeNode.LastChild; mimeNode3 != null; mimeNode3 = previousSibling) { previousSibling = mimeNode3.PreviousSibling; MimeParameter mimeParameter4 = mimeNode3 as MimeParameter; if (mimeParameter4 != null && mimeParameter4.SegmentNumber <= num2) { break; } } MimeParameter mimeParameter5 = (MimeParameter)mimeNode; mimeParameter5.AllowAppend = true; mimeParameter5.InternalInsertAfter(mimeParameter, mimeNode3); mimeParameter5.AllowAppend = false; } } } } } if (b == 0) { return; } } return; Block_8: throw new MimeException(Strings.TooManyParameters(num, countLimit)); Block_9: throw new MimeException(Strings.TooManyTextValueBytes(mimeStringList2.Length, bytesLimit)); }