/// <summary>Raises the <see cref="ObserveHttpModify"/> event.</summary>
        /// <param name="e">The data for the event.</param>
        protected virtual void OnObserveHttpModifyRequest(GeckoObserveHttpModifyRequestEventArgs e)
        {
            var evnt = (EventHandler <GeckoObserveHttpModifyRequestEventArgs>)Events[ObserveHttpModifyRequestEvent];

            if (evnt != null)
            {
                evnt(this, e);
            }
        }
		/// <summary>Raises the <see cref="ObserveHttpModify"/> event.</summary>
		/// <param name="e">The data for the event.</param>
		protected virtual void OnObserveHttpModifyRequest(GeckoObserveHttpModifyRequestEventArgs e)
		{
			var evnt = ( EventHandler<GeckoObserveHttpModifyRequestEventArgs> ) Events[ ObserveHttpModifyRequestEvent ];
			if ( evnt != null ) evnt( this, e );
		}
예제 #3
0
		public void Observe(nsISupports aSubject, string aTopic, string aData) {
			if (aTopic.Equals(ObserverNotifications.HttpRequests.HttpOnModifyRequest)) {
				using (var httpChannel = HttpChannel.Create(aSubject)) {

					var origUri = httpChannel.OriginalUri;

					var uri = httpChannel.Uri;
					var uriRef = httpChannel.Referrer;
					var reqMethod = httpChannel.RequestMethod;
					var reqHeaders = httpChannel.GetRequestHeaders();
					byte[] reqBody = null;
					bool? reqBodyContainsHeaders = null;

					#region POST data

					var uploadChannel = Xpcom.QueryInterface<nsIUploadChannel>(aSubject);
					var uploadChannel2 = Xpcom.QueryInterface<nsIUploadChannel2>(aSubject);

					if (uploadChannel != null) {
						var uc = new UploadChannel(uploadChannel);
						var uploadStream = uc.UploadStream;

						if (uploadStream != null) {
							if (uploadStream.CanSeek) {
								var rdr = new BinaryReader(uploadStream);
								var reqBodyStream = new MemoryStream();
								try {
									reqBody = new byte[] { };
									int avl = 0;
									while ((avl = ((int)uploadStream.Available)) > 0) {
										reqBodyStream.Write(rdr.ReadBytes(avl), 0, avl);
									}
									reqBody = reqBodyStream.ToArray();

									if (uploadChannel2 != null)
										reqBodyContainsHeaders = uploadChannel2.GetUploadStreamHasHeadersAttribute();
								}
								catch (IOException ex) {
									// failed to read body, ignore
								}

								// rewind stream, so browser can read it as usual
								uploadStream.Seek(0, 0);
							}
						}
					}

					#endregion POST data

					var evt = new GeckoObserveHttpModifyRequestEventArgs(uri, uriRef, reqMethod, reqBody, reqHeaders, httpChannel, reqBodyContainsHeaders);

					OnObserveHttpModifyRequest(evt);

					if (evt.Cancel) {
						httpChannel.Cancel(nsIHelperAppLauncherConstants.NS_BINDING_ABORTED);
					}
				}
			}
		}