public Find ( SipUri uri ) : |
||
uri | SipUri | |
return |
/// <summary> /// Update all contacts (registration bindings) for a user. /// </summary> /// <param name="context"></param> /// <param name="registration"></param> /// <returns></returns> /// <remarks> /// Should be done after a successful authentication. /// </remarks> private List<RegistrationContact> UpdateContacts(RequestContext context, Registration registration) { var contactHeader = context.Request.Headers[ContactHeader.LNAME] as ContactHeader; if (contactHeader == null) { _logger.Warning("Contact header was not specified."); context.Response.ReasonPhrase = "Missing/Invalid contact header."; context.Response.StatusCode = StatusCode.BadRequest; return null; } var newContacts = new List<RegistrationContact>(); foreach (Contact contact in contactHeader.Contacts) { int expires = MinExpires; if (contact.Parameters.Contains("expires")) { if (!int.TryParse(contact.Parameters["expires"], out expires)) { _logger.Warning("Invalid expires value: " + contact.Parameters["expires"]); context.Response.ReasonPhrase = "Invalid expires value on contact header."; context.Response.StatusCode = StatusCode.BadRequest; return null; } if (expires > 0 && expires < MinExpires) { _logger.Warning("Too small expires value: " + expires); context.Response.ReasonPhrase = "Increase expires value."; context.Response.StatusCode = StatusCode.IntervalTooBrief; context.Response.Headers.Add("MinExpires", new NumericHeader("MinExpires", MinExpires)); return null; } } RegistrationContact oldContact = registration.Find(contact.Uri); if (oldContact != null && oldContact.CallId == context.Request.CallId && context.Request.CSeq.Number < oldContact.SequenceNumber) { context.Response.StatusCode = StatusCode.BadRequest; context.Response.ReasonPhrase = "CSeq value in contact is out of order."; return null; } // Add new contact newContacts.Add(new RegistrationContact(contact.Name, contact.Uri) { CallId = context.Request.CallId, Expires = expires, ExpiresAt = DateTime.Now.AddSeconds(expires), Quality = context.Request.Contact.Quality, SequenceNumber = context.Request.CSeq.Number, UpdatedAt = DateTime.Now, }); } // Now replace contacts. // We do it in two steps since no contacts should be updated // if someone fails. _repository.UpdateContacts(registration, newContacts); return newContacts; }
/// <summary> /// Update all contacts (registration bindings) for a user. /// </summary> /// <param name="context"></param> /// <param name="registration"></param> /// <returns></returns> /// <remarks> /// Should be done after a successful authentication. /// </remarks> private List <RegistrationContact> UpdateContacts(RequestContext context, Registration registration) { var contactHeader = context.Request.Headers[ContactHeader.LNAME] as ContactHeader; if (contactHeader == null) { _logger.Warning("Contact header was not specified."); context.Response.ReasonPhrase = "Missing/Invalid contact header."; context.Response.StatusCode = StatusCode.BadRequest; return(null); } var newContacts = new List <RegistrationContact>(); foreach (Contact contact in contactHeader.Contacts) { int expires = MinExpires; if (contact.Parameters.Contains("expires")) { if (!int.TryParse(contact.Parameters["expires"], out expires)) { _logger.Warning("Invalid expires value: " + contact.Parameters["expires"]); context.Response.ReasonPhrase = "Invalid expires value on contact header."; context.Response.StatusCode = StatusCode.BadRequest; return(null); } if (expires > 0 && expires < MinExpires) { _logger.Warning("Too small expires value: " + expires); context.Response.ReasonPhrase = "Increase expires value."; context.Response.StatusCode = StatusCode.IntervalTooBrief; context.Response.Headers.Add("MinExpires", new NumericHeader("MinExpires", MinExpires)); return(null); } } RegistrationContact oldContact = registration.Find(contact.Uri); if (oldContact != null && oldContact.CallId == context.Request.CallId && context.Request.CSeq.Number < oldContact.SequenceNumber) { context.Response.StatusCode = StatusCode.BadRequest; context.Response.ReasonPhrase = "CSeq value in contact is out of order."; return(null); } // Add new contact newContacts.Add(new RegistrationContact(contact.Name, contact.Uri) { CallId = context.Request.CallId, Expires = expires, ExpiresAt = DateTime.Now.AddSeconds(expires), Quality = context.Request.Contact.Quality, SequenceNumber = context.Request.CSeq.Number, UpdatedAt = DateTime.Now, }); } // Now replace contacts. // We do it in two steps since no contacts should be updated // if someone fails. _repository.UpdateContacts(registration, newContacts); return(newContacts); }