Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

*_by_lua should unescape the newline "\n" #85

Open
Triple-Z opened this issue Jun 23, 2020 · 5 comments
Open

*_by_lua should unescape the newline "\n" #85

Triple-Z opened this issue Jun 23, 2020 · 5 comments

Comments

@Triple-Z
Copy link

Triple-Z commented Jun 23, 2020

Describe the bug

When I try to use the crossplane, just using parser to read a standard NGINX config file and then using the build to convert it back. However, I found that the *_by_lua directives' newline was replaced by literal \n. So I think this is a bug for that.

To Reproduce
Steps to reproduce the behavior:

  1. Create an nginx config file with the following content:
user nobody;
worker_processes 1;

events {
  worker_connections 10240;
}

http {
    
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    server {
        listen      80;
        server_name test.triplez.space 1.2.3.4;
        rewrite_by_lua '
            print("rewrite phase")
        ';
        
        location / {
            access_by_lua 'print("access phase")';
            default_type 'text/plain';
            return 200 "this is a response\n";
        }
    }

}
  1. parse and build
  2. The content after rewrite_by_lua has changed.
    original:
    rewrite_by_lua '
        print("rewrite phase")
    ';
    after:
    rewrite_by_lua '\n    print("hello")\n    ';

Expected behavior
*_by_lua directive content can set up a new line for Lua code.

Your environment

  • Operating System: Ubuntu 16.04
  • Version of crossplane: crossplane 0.5.4
@Triple-Z
Copy link
Author

I have solved it by writing an extra plugin and enabled it in __init__.py just for *_by_lua directives.

Plugin code in here: https://gist.github.com/Triple-Z/64a0b6ad8fb673d77712e5aabfebfe82

Maybe I can create a PR for this?

@gshulegaard
Copy link
Contributor

Looks good to me! I would submit a PR, seems like a great use of the extension system to me, although it might be worth considering adding a flag to enable/disable it by the user.

@Triple-Z
Copy link
Author

@gshulegaard I have a WIP PR in here: #86

although it might be worth considering adding a flag to enable/disable it by the user.

I will check this and try to do it later~

@aluttik
Copy link
Contributor

aluttik commented Jul 13, 2020

@Triple-Z It's important to make sure that unescaping newlines won't break any embedded lua code, so when you add tests, please include a test that shows that newlines in the lua code that are supposed to be escaped stay escaped. For example if a lua block contains error("foo\nbar"), this should not get turned into two lines because lua's " quotes don't support multi-line strings so there would be an error introduced in the lua code.

To create a fixture for that test, you can use crossplane parse on a config that contains embedded lua that is supposed to have escaped newlines like error("foo\nbar").

@Triple-Z
Copy link
Author

@aluttik Thx & I will check on this :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants