11const request = require ( "got" ) ;
2- const { type} = require ( "../lib/types" ) ;
3- const { getCookies , cookieStore } = require ( "../lib/cookies" ) ;
2+ const type = require ( "../lib/types" ) ;
3+ const cookieJar = require ( "../lib/cookies" ) ;
44const { setOverrides, setHeaders, setAgent} = require ( "../lib/options" ) ;
55
6- const useProxy = async ( target , proxy ) => {
7- // Listener responsible for applying proxy
8- const $puppeteerPageProxyHandler = async req => {
9- endpoint = req . _client . _connection . _url ;
10- targetId = req . _frame . _id ;
11- const cookieJar = cookieStore (
12- await getCookies ( endpoint , targetId )
13- ) ;
14- const options = {
15- cookieJar,
16- method : req . method ( ) ,
17- body : req . postData ( ) ,
18- headers : setHeaders ( req ) ,
19- agent : setAgent ( proxy ) ,
20- responseType : "buffer" ,
21- throwHttpErrors : false
22- } ;
23- try {
24- const res = await request ( req . url ( ) , options ) ;
25- await req . respond ( {
26- status : res . statusCode ,
27- headers : res . headers ,
28- body : res . body
29- } ) ;
30- } catch ( error ) {
31- await req . abort ( ) ;
32- }
33- } ;
34- // Remove existing listener for reassigning proxy of current page
35- const removeRequestListener = ( page , listenerName ) => {
36- const listeners = page . listeners ( "request" ) ;
37- for ( let i = 0 ; i < listeners . length ; i ++ ) {
38- if ( listeners [ i ] . name === listenerName ) {
39- page . removeListener ( "request" , listeners [ i ] ) ;
40- }
41- }
6+ // Responsible for applying proxy
7+ const proxyHandler = async ( req , proxy ) => {
8+ const options = {
9+ cookieJar,
10+ method : req . method ( ) ,
11+ body : req . postData ( ) ,
12+ headers : setHeaders ( req ) ,
13+ agent : setAgent ( proxy ) ,
14+ responseType : "buffer" ,
15+ maxRedirects : 15 ,
16+ throwHttpErrors : false
4217 } ;
43- // Proxy per request
44- if ( target . constructor . name . indexOf ( "Request" ) != - 1 ) {
45- if ( type ( proxy ) == "object" ) {
46- target = setOverrides ( target , proxy ) ;
47- proxy = proxy . proxy ;
48- }
49- await $puppeteerPageProxyHandler ( target ) ;
50- // Page-wide proxy
51- } else if ( target . constructor . name === "Page" ) {
52- if ( type ( proxy ) == "object" ) {
53- proxy = proxy . proxy ;
18+ try {
19+ const res = await request ( req . url ( ) , options ) ;
20+ await req . respond ( {
21+ status : res . statusCode ,
22+ headers : res . headers ,
23+ body : res . body
24+ } ) ;
25+ } catch ( error ) { await req . abort ( ) }
26+ } ;
27+
28+ // For reassigning proxy of page
29+ const removeRequestListener = ( page , listenerName ) => {
30+ const eventName = "request" ;
31+ const listeners = page . eventsMap . get ( eventName ) ;
32+ if ( listeners ) {
33+ const i = listeners . findIndex ( ( listener ) => {
34+ return listener . name === listenerName
35+ } ) ;
36+ listeners . splice ( i , 1 ) ;
37+ if ( ! listeners . length ) {
38+ page . eventsMap . delete ( eventName ) ;
5439 }
55- await target . setRequestInterception ( true ) ;
56- removeRequestListener ( target , "$puppeteerPageProxyHandler" ) ;
57- if ( proxy ) {
58- target . on ( "request" , $puppeteerPageProxyHandler ) ;
59- } else {
60- await target . setRequestInterception ( false ) ;
40+ }
41+ } ;
42+
43+ // Calls this if request object passed
44+ const proxyPerRequest = async ( req , data ) => {
45+ let proxy , overrides ;
46+ // Separate proxy and overrides
47+ if ( type ( data ) === "object" ) {
48+ if ( Object . keys ( data ) . length !== 0 ) {
49+ proxy = data . proxy ;
50+ delete data . proxy ;
51+ overrides = data ;
6152 }
53+ } else { proxy = data }
54+ req = setOverrides ( req , overrides ) ;
55+ // Skip request if proxy omitted
56+ if ( proxy ) { await proxyHandler ( req , proxy ) }
57+ else { req . continue ( overrides ) }
58+ } ;
59+
60+ // Calls this if page object passed
61+ const proxyPerPage = async ( page , proxy ) => {
62+ await page . setRequestInterception ( true ) ;
63+ removeRequestListener ( page , "$ppp" ) ;
64+ if ( proxy ) {
65+ page . on ( "request" , $ppp = async ( req ) => {
66+ await proxyHandler ( req , proxy ) ;
67+ } ) ;
68+ } else { await page . setRequestInterception ( false ) }
69+ } ;
70+
71+ // Main function
72+ const useProxy = async ( target , data ) => {
73+ const targetType = target . constructor . name ;
74+ if ( targetType === "HTTPRequest" ) {
75+ await proxyPerRequest ( target , data ) ;
76+ } else if ( targetType === "Page" ) {
77+ await proxyPerPage ( target , data )
6278 }
6379} ;
64- module . exports = useProxy ;
80+
81+ module . exports = useProxy ;
0 commit comments