@@ -13,23 +13,24 @@ use flate2::read::{DeflateDecoder, GzDecoder};
1313use hsts:: { HstsEntry , HstsList , secure_url} ;
1414use hyper:: Error as HttpError ;
1515use hyper:: client:: { Pool , Request , Response } ;
16- use hyper:: header:: { Accept , AcceptEncoding , ContentLength , ContentType , Host , Referer } ;
16+ use hyper:: header:: { Accept , AcceptEncoding , ContentLength , ContentEncoding , ContentType , Host , Referer } ;
1717use hyper:: header:: { Authorization , Basic } ;
18- use hyper:: header:: { ContentEncoding , Encoding , Header , Headers , Quality , QualityItem } ;
18+ use hyper:: header:: { Encoding , Header , Headers , Quality , QualityItem } ;
1919use hyper:: header:: { Location , SetCookie , StrictTransportSecurity , UserAgent , qitem} ;
2020use hyper:: http:: RawStatus ;
2121use hyper:: method:: Method ;
2222use hyper:: mime:: { Mime , SubLevel , TopLevel } ;
2323use hyper:: net:: Fresh ;
2424use hyper:: status:: { StatusClass , StatusCode } ;
25+ use ipc_channel:: ipc;
2526use log;
2627use mime_classifier:: MIMEClassifier ;
2728use msg:: constellation_msg:: { PipelineId , ReferrerPolicy } ;
2829use net_traits:: ProgressMsg :: { Done , Payload } ;
2930use net_traits:: hosts:: replace_hosts;
3031use net_traits:: response:: HttpsState ;
3132use net_traits:: { CookieSource , IncludeSubdomains , LoadConsumer , LoadContext , LoadData } ;
32- use net_traits:: { Metadata , NetworkError } ;
33+ use net_traits:: { Metadata , NetworkError , RequestSource , CustomResponse } ;
3334use openssl:: ssl:: error:: { SslError , OpensslError } ;
3435use profile_traits:: time:: { ProfilerCategory , profile, ProfilerChan , TimerMetadata } ;
3536use profile_traits:: time:: { TimerMetadataReflowType , TimerMetadataFrameType } ;
@@ -39,7 +40,7 @@ use std::boxed::FnBox;
3940use std:: collections:: HashSet ;
4041use std:: error:: Error ;
4142use std:: fmt;
42- use std:: io:: { self , Read , Write } ;
43+ use std:: io:: { self , Cursor , Read , Write } ;
4344use std:: sync:: mpsc:: Sender ;
4445use std:: sync:: { Arc , RwLock } ;
4546use time;
@@ -149,6 +150,17 @@ fn load_for_consumer(load_data: LoadData,
149150 }
150151}
151152
153+ pub struct WrappedHttpResponse {
154+ pub response : Response
155+ }
156+
157+ impl Read for WrappedHttpResponse {
158+ #[ inline]
159+ fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
160+ self . response . read ( buf)
161+ }
162+ }
163+
152164pub trait HttpResponse : Read {
153165 fn headers ( & self ) -> & Headers ;
154166 fn status ( & self ) -> StatusCode ;
@@ -173,20 +185,6 @@ pub trait HttpResponse: Read {
173185 }
174186}
175187
176-
177- pub struct WrappedHttpResponse {
178- pub response : Response
179- }
180-
181- impl Read for WrappedHttpResponse {
182- #[ inline]
183- fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
184- self . response . read ( buf)
185- }
186- }
187-
188-
189-
190188impl HttpResponse for WrappedHttpResponse {
191189 fn headers ( & self ) -> & Headers {
192190 & self . response . headers
@@ -205,6 +203,34 @@ impl HttpResponse for WrappedHttpResponse {
205203 }
206204}
207205
206+ pub struct ReadableCustomResponse {
207+ headers : Headers ,
208+ raw_status : RawStatus ,
209+ body : Cursor < Vec < u8 > >
210+ }
211+
212+ pub fn to_readable_response ( custom_response : CustomResponse ) -> ReadableCustomResponse {
213+ ReadableCustomResponse {
214+ headers : custom_response. headers ,
215+ raw_status : custom_response. raw_status ,
216+ body : Cursor :: new ( custom_response. body )
217+ }
218+ }
219+
220+ impl HttpResponse for ReadableCustomResponse {
221+ fn headers ( & self ) -> & Headers { & self . headers }
222+ fn status ( & self ) -> StatusCode {
223+ StatusCode :: Ok
224+ }
225+ fn status_raw ( & self ) -> & RawStatus { & self . raw_status }
226+ }
227+
228+ impl Read for ReadableCustomResponse {
229+ fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
230+ self . body . read ( buf)
231+ }
232+ }
233+
208234pub trait HttpRequestFactory {
209235 type R : HttpRequest ;
210236
@@ -466,13 +492,13 @@ fn update_sts_list_from_response(url: &Url, response: &HttpResponse, hsts_list:
466492 }
467493}
468494
469- pub struct StreamedResponse < R : HttpResponse > {
470- decoder : Decoder < R > ,
495+ pub struct StreamedResponse {
496+ decoder : Decoder ,
471497 pub metadata : Metadata
472498}
473499
474500
475- impl < R : HttpResponse > Read for StreamedResponse < R > {
501+ impl Read for StreamedResponse {
476502 #[ inline]
477503 fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
478504 match self . decoder {
@@ -484,12 +510,12 @@ impl<R: HttpResponse> Read for StreamedResponse<R> {
484510 }
485511}
486512
487- impl < R : HttpResponse > StreamedResponse < R > {
488- fn new ( m : Metadata , d : Decoder < R > ) -> StreamedResponse < R > {
513+ impl StreamedResponse {
514+ fn new ( m : Metadata , d : Decoder ) -> StreamedResponse {
489515 StreamedResponse { metadata : m, decoder : d }
490516 }
491517
492- fn from_http_response ( response : R , m : Metadata ) -> Result < StreamedResponse < R > , LoadError > {
518+ fn from_http_response ( response : Box < HttpResponse > , m : Metadata ) -> Result < StreamedResponse , LoadError > {
493519 let decoder = match response. content_encoding ( ) {
494520 Some ( Encoding :: Gzip ) => {
495521 let result = GzDecoder :: new ( response) ;
@@ -515,11 +541,11 @@ impl<R: HttpResponse> StreamedResponse<R> {
515541 }
516542}
517543
518- enum Decoder < R : Read > {
519- Gzip ( GzDecoder < R > ) ,
520- Deflate ( DeflateDecoder < R > ) ,
521- Brotli ( Decompressor < R > ) ,
522- Plain ( R )
544+ enum Decoder {
545+ Gzip ( GzDecoder < Box < HttpResponse > > ) ,
546+ Deflate ( DeflateDecoder < Box < HttpResponse > > ) ,
547+ Brotli ( Decompressor < Box < HttpResponse > > ) ,
548+ Plain ( Box < HttpResponse > )
523549}
524550
525551fn send_request_to_devtools ( devtools_chan : Option < Sender < DevtoolsControlMsg > > ,
@@ -771,7 +797,7 @@ pub fn load<A, B>(load_data: &LoadData,
771797 request_factory : & HttpRequestFactory < R =A > ,
772798 user_agent : String ,
773799 cancel_listener : & CancellationListener )
774- -> Result < StreamedResponse < A :: R > , LoadError > where A : HttpRequest + ' static , B : UIProvider {
800+ -> Result < StreamedResponse , LoadError > where A : HttpRequest + ' static , B : UIProvider {
775801 let max_redirects = prefs:: get_pref ( "network.http.redirection-limit" ) . as_i64 ( ) . unwrap ( ) as u32 ;
776802 let mut iters = 0 ;
777803 // URL of the document being loaded, as seen by all the higher-level code.
@@ -785,6 +811,20 @@ pub fn load<A, B>(load_data: &LoadData,
785811 return Err ( LoadError :: new ( doc_url, LoadErrorType :: Cancelled ) ) ;
786812 }
787813
814+ let ( msg_sender, msg_receiver) = ipc:: channel ( ) . unwrap ( ) ;
815+ match load_data. source {
816+ RequestSource :: Window ( ref sender) | RequestSource :: Worker ( ref sender) => {
817+ sender. send ( msg_sender. clone ( ) ) . unwrap ( ) ;
818+ let received_msg = msg_receiver. recv ( ) . unwrap ( ) ;
819+ if let Some ( custom_response) = received_msg {
820+ let metadata = Metadata :: default ( doc_url. clone ( ) ) ;
821+ let readable_response = to_readable_response ( custom_response) ;
822+ return StreamedResponse :: from_http_response ( box readable_response, metadata) ;
823+ }
824+ }
825+ RequestSource :: None => { }
826+ }
827+
788828 // If the URL is a view-source scheme then the scheme data contains the
789829 // real URL that should be used for which the source is to be viewed.
790830 // Change our existing URL to that and keep note that we are viewing
@@ -942,7 +982,7 @@ pub fn load<A, B>(load_data: &LoadData,
942982 metadata. headers . clone ( ) , metadata. status . clone ( ) ,
943983 pipeline_id) ;
944984 }
945- return StreamedResponse :: from_http_response ( response, metadata)
985+ return StreamedResponse :: from_http_response ( box response, metadata)
946986 }
947987}
948988
0 commit comments