fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: skip http proxy added header - #7622

Merged
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy
Jun 29, 2023
Merged

fix: skip http proxy added header#7622
kenjis merged 4 commits into
codeigniter4:developfrom
jozefrebjak:fix-curlrequest-http-proxy

Conversation

@jozefrebjak

@jozefrebjakjozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
Contributor

Description

This pull request addresses the HTTP proxy problem by adding a new conditional statement to the code. Specifically, the code checks if the output string begins with HTTP/1.1 200 Connection established.

For example, when the output string contains the following header:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0

If it does, then the code uses substr function to remove the initial part of the string up to the specified $breakString, which helps in handling the HTTP proxy issue. The added code segment is as follows:

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {
$output = substr($output, strpos($output, $breakString) + 4);
}

This change ensures that the HTTP proxy connection is handled properly and the code runs smoothly without any errors.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis added the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

Copy link
Copy Markdown
Member

What is the HTTP proxy problem?
How do we reproduce the error?

@jozefrebjak

jozefrebjak commented Jun 26, 2023

Copy link
Copy Markdown
ContributorAuthor

What is the HTTP proxy problem?
How do we reproduce the error?

@kenjis I added also test for it but I have precommit problem with memory, basically it's a problem in one of our deployment where Linux machine is communicating with internet via HTTP Proxy. In this enviroment it's Fortinet HTTP Proxy. Our setup is as follow we have Red Hat Enterprise with Docker. CodeIgniter4 docker image is running on Alpine OS. We have configured http_proxy and https_proxy for that, then is everything working we can use Publisher to getaAssets from CDN, in this case jsdelivr. When publisher is doing his job we have an issue where Fortinet adds to the curl output two more rows with break like:

HTTP/1.1 200 Connection established
Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200
date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG
.swagger-ui{color:#3b4151;font-family:sans-serif/*! normalize.css v7.0.0

and after that body includes

date: Mon, 26 Jun 2023 07:44:50 GMT
content-type: text/css; charset=utf-8
access-control-allow-origin: *
access-control-expose-headers: *
timing-allow-origin: *
cache-control: public, max-age=31536000, s-maxage=31536000, immutable
cross-origin-resource-policy: cross-origin
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-jsd-version: 4.14.3
x-jsd-version-type: version
etag: W/"23529-0Aplim6MlPCHdtldoUGfLqonpGQ"
x-served-by: cache-fra-eddf8230023-FRA, cache-jnb7021-JNB
x-cache: HIT, MISS
vary: Accept-Encoding
alt-svc: h3=":443"; ma=86400
cf-cache-status: HIT
age: 2190
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=3zBXBy6F9ytYZdUmO4cw7tBl%2Fys3wmyumlUD0Ht%2FdIa%2FXr4NjHNOxniwgYTjn4iPV2%2FsqdcQKwIEdNCQ5lgMQU8eGVeJsa2%2F%2BTyyWnSiT4Akd7EhFXaPIRHLoiiVqZYmgAw%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7dd3d3c99b6c27c0-PRG

in assets, I believe this is the fastest way how to fix it, there is already continued header skiped.

$output = substr($output, strpos($output, $breakString) + 4);
}

if (strpos($output, 'HTTP/1.1 200 Connection established') === 0) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be "Connection Established".

Is it always "HTTP/1.1" ?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kenjis You are right, I'm studying now whole concept behind this and it seems that there should be different headers.

The original tunnelling spec required the proxy to return a 200 Connection Established to the client once it had successfully connected to the server, which is what we're seeing. This is potentially followed by more headers, and then an empty line, before the connection becomes transparent and we get the actual response from the server. So, we get two sets of headers. RFC 2817 relaxes this, and allows any 2xx response to a CONNECT request.

Some very late clarification. When you connect to an SSL/TLS server through a proxy, the proxy establishes a tunnel, using HTTP CONNECT. This is covered in RFC2817 and the expired tunneling spec, and not RFC261.

When making an https request through a proxy, a CONNECT request is of
course made to the proxy before the SSL connection can be made with the
remote server.

Currently, the proxy's response to the CONNECT is written to the libcurl
callback function like the rest of the response, such that it appears
before the remote server's response headers. So, for instance, to my
client code, the response looks like this:

HTTP/1.1 200 Connection established <-- proxy's response Proxy-Agent: Fortinet-Proxy/1.0
HTTP/2 200 <-- remote server's response date: Mon, 26 Jun 2023 07:44:50 GMT etc 

some proxies are rather minimalist and only give:

HTTP/1.0 200 <-- proxy's response 
HTTP/1.0 200 OK <-- remote server's response Date: Tue, 04 Oct 2005 20:17:22 GMT etc 

The best method I have thought of for detecting whether the response
contains a header like this (with a proxy's CONNECT response first) is
to set a header callback and see if I get an empty header line in the
middle of the headers. I haven't actually tested this solution yet.

@kenjiskenjis removed the tests needed Pull requests that need tests label Jun 26, 2023
@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

On develop.

Start Squid proxy server.

$ docker run --restart always --name proxy-squid -d -p 3128:3128 minimum2scp/squid

Controller:

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[]
);
dd($response);

Response body without Proxy:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:49 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

Start spark serve with Proxy environment variables.

$ export HTTP_PROXY=http://localhost:3128
$ export HTTPS_PROXY=http://localhost:3128
$ php spark serve

Response body with Proxy:

HTTP/2 200 date: Tue, 27 Jun 2023 11:57:32 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867052; expires=Wed, 26-Jun-2024 11:57:32 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Zi6dfcKgQ2TaPxWYMLdJlRk456lIlsEvDnaYzEU%2BWwCcrhgE90ACEytEC0Tnmdx9m7QieovI8gZsyMdXNTZpOszJg4JB7ahJKJgdmYcibbUYY%2Fu7KB1BdsbkWXOvVrvgqdDC0hTInMU%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd835479e4af6a-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 11:57:32 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjis

kenjis commented Jun 27, 2023

Copy link
Copy Markdown
Member

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following.
So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Jun 27, 2023
@jozefrebjak

Copy link
Copy Markdown
ContributorAuthor

The original $output (return of $this->sendRequest($curlOptions)) with Squid proxy is the following. So this PR works fine with Squid.

HTTP/1.1 200 Connection established
HTTP/2 200 date: Tue, 27 Jun 2023 12:11:39 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687867899; expires=Wed, 26-Jun-2024 12:11:39 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=TlMVWg6WOtjQiOrlJlvqL3rhzz0efiOCjxNYa9BtMDAEeJp6jqkociSFw0NXxq70U%2FHgN9sSvBVCQt4J6K6y%2BoODziO3v7GQY6WUDl3ioe2hXperp9q5Y5IxaftHb1JJtMF6CNLDyfA%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7ddd9804f9d4afe1-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 12:11:39 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[How can Code Igniter 4.3 handle user-specific templates?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87957</link>
<pubDate>Tue, 27 Jun 2023 11:55:19 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=71285">LeahaTaul</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87957</guid>
<description><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></description>
<content:encoded><![CDATA[In my system, I have three users, each with their own unique template layout separate from the main website. The user information is stored in a table, including a template ID. After a user logs in, I would like to redirect them to the appropriate template based on their template ID. Each template has a completely different layout.<br />
<br />
I had successfully implemented this functionality in the previous version of the website, which did not use the MVC (Model-View-Controller) architecture. However, as I am migrating everything to Code Igniter 4.3, I am seeking assistance on how to achieve the same functionality in the new framework.<br />
<br />
Thank you for your help in advance!]]></content:encoded>
</item>
</channel>
</rss>

I believe everything else than HTTP/1.1 200 Connection established can come from legacy HTTP Proxy servers and this PR will solve issue.

@kenjis

Copy link
Copy Markdown
Member

I implemented a request option proxy in CURLRequest. See #7632

$client = \Config\Services::curlrequest();
$response = $client->request(
'GET',
'https://forum.codeigniter.com/syndication.php?limit=1',
[
'proxy' => 'http://localhost:3128',
]
);
dd($response);

And the response body is the same as before this PR.

HTTP/2 200 date: Tue, 27 Jun 2023 23:55:42 GMT
content-type: text/xml; charset="UTF-8"
set-cookie: mybb[lastvisit]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
cf-cache-status: DYNAMIC
set-cookie: mybb[lastactive]=1687910142; expires=Wed, 26-Jun-2024 23:55:42 GMT; path=/; domain=.forum.codeigniter.com
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CsGdgdz7kzjoAfACmq2423zMwzthvKkiI9KZ2cNHXyBWrp6zvaAgpdeaMiPCRto7ZELHULCxdcgg1t%2Fmvjv5eoMeclphw%2F9PpMV5z9Z3KMjEBC2GKtoMNLXhymasiuIYMuBtKDM1074%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 7de19f5548512614-NRT
alt-svc: h3=":443"; ma=86400
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[CodeIgniter Forums - All Forums]]></title>
<link>https://forum.codeigniter.com/</link>
<description><![CDATA[CodeIgniter Forums - https://forum.codeigniter.com]]></description>
<pubDate>Tue, 27 Jun 2023 23:55:42 +0000</pubDate>
<generator>MyBB</generator>
<item>
<title><![CDATA[custom cache direectory per controller?]]></title>
<link>https://forum.codeigniter.com/showthread.php?tid=87959</link>
<pubDate>Tue, 27 Jun 2023 17:16:11 +0000</pubDate>
<dc:creator><![CDATA[<a href="https://forum.codeigniter.com/member.php?action=profile&uid=22858">mymisty</a>]]></dc:creator>
<guid isPermaLink="false">https://forum.codeigniter.com/showthread.php?tid=87959</guid>
<description><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></description>
<content:encoded><![CDATA[I am trying to find a way on caching into a specific directory withing the cache directory per controller. Currently there are thousands of cache files in the cache directory for all of my controllers, is there a way of specifying a directory on a per controller basis?]]></content:encoded>
</item>
</channel>
</rss>

@kenjiskenjis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not perfect, but works for now.

@kenjis
kenjis merged commit 229427a into codeigniter4:developJun 29, 2023
@kenjis

Copy link
Copy Markdown
Member

@jozefrebjak Thank you!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bugVerified issues on the current code behavior or pull requests that will fix them

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@jozefrebjak@kenjis@michalsn