Compare commits
12 Commits
lyy_branch
...
master
Author | SHA1 | Date |
---|---|---|
pf7astvk4 | ca1a32622a | 6 months ago |
j.fu | 8fa73c40f6 | 6 months ago |
j.fu | 5d93d90cbc | 6 months ago |
pf7astvk4 | ecc5d8a95d | 6 months ago |
j.fu | 84d2b44a33 | 6 months ago |
pf7astvk4 | b54306ea3f | 6 months ago |
j.fu | 9bc66883be | 6 months ago |
j.fu | ba39ca35d6 | 6 months ago |
pf7astvk4 | 8b09561afb | 6 months ago |
j.fu | 4fe82ab446 | 6 months ago |
j.fu | 865bf23b9d | 6 months ago |
pf7astvk4 | 57320aaa5a | 7 months ago |
@ -0,0 +1,9 @@
|
|||||||
|
FROM openjdk:23-slim-bullseye
|
||||||
|
|
||||||
|
WORKDIR /opt/app
|
||||||
|
ARG JAR_FILE=target/spring-boot-web.jar
|
||||||
|
|
||||||
|
COPY ${JAR_FILE} app.jar
|
||||||
|
|
||||||
|
ENTRYPOINT [ "java","-jar","app.jar" ]
|
||||||
|
EXPOSE 8080
|
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.2.5</version>
|
||||||
|
<relativePath/>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<groupId>edu.nudt</groupId>
|
||||||
|
<artifactId>demo</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>demo</name>
|
||||||
|
<description>Demo project for Spring Boot</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>spring-boot-web</finalName>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,27 @@
|
|||||||
|
package edu.nudt.demo;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@Controller
|
||||||
|
public class DemoApplication {
|
||||||
|
@Value("${demo.server.name}")
|
||||||
|
private String serverName;
|
||||||
|
|
||||||
|
@GetMapping("/")
|
||||||
|
public String index(final Model model) {
|
||||||
|
model.addAttribute("title", "Backend Server: " + serverName);
|
||||||
|
model.addAttribute("msg", "欢迎来到分布式计算的世界!");
|
||||||
|
return "index";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(DemoApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
spring.application.name=demo
|
||||||
|
|
||||||
|
demo.server.name="001"
|
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"/>
|
||||||
|
<link data-th-href="@{/css/main.css?{id}(id=${timestamp})}" rel="stylesheet">
|
||||||
|
<title>Hello Docker + Spring Boot</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||||
|
<a class="navbar-brand" href="#">Mkyong.com</div></a>
|
||||||
|
</nav> -->
|
||||||
|
|
||||||
|
<main role="main" class="container">
|
||||||
|
<div class="starter-template">
|
||||||
|
<h1 th:text="${title}">Default title.</h1>
|
||||||
|
<p th:text="${msg}">Default text.</p>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<script data-th-src="@{/js/main.js}"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -0,0 +1,13 @@
|
|||||||
|
package edu.nudt.demo;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class DemoApplicationTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void contextLoads() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
repo: 382eae5e7c4beba9a019c9beddbd99dd198e709e
|
||||||
|
node: 5db3a839a45c1d3a8780925d016dbb87d2d467fc
|
||||||
|
branch: default
|
||||||
|
latesttag: null
|
||||||
|
latesttagdistance: 2
|
||||||
|
changessincelatesttag: 2
|
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Nginx, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
@ -0,0 +1,52 @@
|
|||||||
|
Modules
|
||||||
|
=======
|
||||||
|
|
||||||
|
hello_world
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Installs location content handler to produce specific output.
|
||||||
|
|
||||||
|
- #1 produces the predefined output "Hello, world!"
|
||||||
|
- #2 allows setting text and HTTP status code
|
||||||
|
- #3 supports variables in output text
|
||||||
|
|
||||||
|
access
|
||||||
|
------
|
||||||
|
|
||||||
|
Installs an ACCESS phase handler and checks if user is allowed to access the
|
||||||
|
resource.
|
||||||
|
|
||||||
|
- #1 makes sure the User-Agent header contains the specified string
|
||||||
|
- #2 verifies user-provided hash md5(uri, secret).
|
||||||
|
|
||||||
|
set_header
|
||||||
|
----------
|
||||||
|
|
||||||
|
Installs header filter handler and allows to add output headers.
|
||||||
|
|
||||||
|
- #1 one header is supported
|
||||||
|
- #2 multiple headers are supported
|
||||||
|
- #3 variables are supported in header values
|
||||||
|
|
||||||
|
append
|
||||||
|
------
|
||||||
|
|
||||||
|
Installs header and body filter handlers and allows appending text to the
|
||||||
|
output.
|
||||||
|
|
||||||
|
- #1 a string is appended
|
||||||
|
- #2 md5 hash of the entire body is appended
|
||||||
|
- #3 subrequest text is appended
|
||||||
|
|
||||||
|
md5
|
||||||
|
---
|
||||||
|
|
||||||
|
Creates a variable with the md5 of the provided complex value.
|
||||||
|
|
||||||
|
|
||||||
|
Development Guide
|
||||||
|
=================
|
||||||
|
|
||||||
|
For more information on module development, see the NGINX development guide:
|
||||||
|
|
||||||
|
http://nginx.org/en/docs/dev/development_guide.html
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP
|
||||||
|
ngx_addon_name=ua_access
|
||||||
|
ngx_module_name=ngx_http_ua_access_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_ua_access_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,15 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
ua_access foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_str_t name;
|
||||||
|
} ngx_http_ua_access_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_ua_access_handler(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_ua_access_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_ua_access_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static ngx_int_t ngx_http_ua_access_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_ua_access_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("ua_access"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_str_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_ua_access_loc_conf_t, name),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_ua_access_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_ua_access_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_ua_access_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_ua_access_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_ua_access_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_ua_access_module_ctx, /* module context */
|
||||||
|
ngx_http_ua_access_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_ua_access_handler(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_http_ua_access_loc_conf_t *ulcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http ua access handler");
|
||||||
|
|
||||||
|
ulcf = ngx_http_get_module_loc_conf(r, ngx_http_ua_access_module);
|
||||||
|
|
||||||
|
if (ulcf->name.len == 0) {
|
||||||
|
return NGX_DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r->headers_in.user_agent
|
||||||
|
&& ngx_strstr(r->headers_in.user_agent->value.data, ulcf->name.data))
|
||||||
|
{
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_HTTP_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_ua_access_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_ua_access_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ua_access_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->name = { 0, NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_ua_access_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_ua_access_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_ua_access_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_str_value(conf->name, prev->name, "");
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_ua_access_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_handler_pt *h;
|
||||||
|
ngx_http_core_main_conf_t *cmcf;
|
||||||
|
|
||||||
|
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
|
||||||
|
|
||||||
|
h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
|
||||||
|
if (h == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
*h = ngx_http_ua_access_handler;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP
|
||||||
|
ngx_addon_name=hash_access
|
||||||
|
ngx_module_name=ngx_http_hash_access_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_hash_access_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo -n '/index.htmlfoo'|openssl md5 -binary|openssl base64|tr +/ -_|tr -d =
|
@ -0,0 +1,16 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
hash_access $arg_hash;
|
||||||
|
hash_access_secret foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,183 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
#include <ngx_md5.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_http_complex_value_t *hash;
|
||||||
|
ngx_str_t secret;
|
||||||
|
} ngx_http_hash_access_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_hash_access_handler(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_hash_access_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_hash_access_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static ngx_int_t ngx_http_hash_access_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_hash_access_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("hash_access"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_http_set_complex_value_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_hash_access_loc_conf_t, hash),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("hash_access_secret"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_str_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_hash_access_loc_conf_t, secret),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_hash_access_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_hash_access_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_hash_access_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_hash_access_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_hash_access_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_hash_access_module_ctx, /* module context */
|
||||||
|
ngx_http_hash_access_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_hash_access_handler(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_str_t val, hash;
|
||||||
|
ngx_md5_t md5;
|
||||||
|
ngx_http_hash_access_loc_conf_t *hlcf;
|
||||||
|
u_char buf[18], md5_buf[16];
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http hash access handler");
|
||||||
|
|
||||||
|
hlcf = ngx_http_get_module_loc_conf(r, ngx_http_hash_access_module);
|
||||||
|
|
||||||
|
if (hlcf->hash == NULL) {
|
||||||
|
return NGX_DECLINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get user hash value in base64 */
|
||||||
|
|
||||||
|
if (ngx_http_complex_value(r, hlcf->hash, &val) != NGX_OK) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val.len > 24) {
|
||||||
|
return NGX_HTTP_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* decode user hash value */
|
||||||
|
|
||||||
|
hash.data = buf;
|
||||||
|
|
||||||
|
if (ngx_decode_base64url(&hash, &val) != NGX_OK) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hash.len != 16) {
|
||||||
|
return NGX_HTTP_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compute server hash value */
|
||||||
|
|
||||||
|
ngx_md5_init(&md5);
|
||||||
|
ngx_md5_update(&md5, r->uri.data, r->uri.len);
|
||||||
|
ngx_md5_update(&md5, hlcf->secret.data, hlcf->secret.len);
|
||||||
|
ngx_md5_final(md5_buf, &md5);
|
||||||
|
|
||||||
|
/* compare hashes */
|
||||||
|
|
||||||
|
if (ngx_memcmp(buf, md5_buf, 16) != 0) {
|
||||||
|
return NGX_HTTP_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_hash_access_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_hash_access_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_hash_access_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->hash = NULL;
|
||||||
|
* conf->secret = { 0, NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_hash_access_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_hash_access_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_hash_access_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_ptr_value(conf->hash, prev->hash, NULL);
|
||||||
|
ngx_conf_merge_str_value(conf->secret, prev->secret, "");
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_hash_access_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_handler_pt *h;
|
||||||
|
ngx_http_core_main_conf_t *cmcf;
|
||||||
|
|
||||||
|
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
|
||||||
|
|
||||||
|
h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
|
||||||
|
if (h == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
*h = ngx_http_hash_access_handler;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP_FILTER
|
||||||
|
ngx_addon_name=ngx_http_append_module
|
||||||
|
ngx_module_name=ngx_http_append_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_append_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,15 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
append FOO\n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,204 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_str_t text;
|
||||||
|
} ngx_http_append_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_append_header_filter(ngx_http_request_t *r);
|
||||||
|
static ngx_int_t ngx_http_append_body_filter(ngx_http_request_t *r,
|
||||||
|
ngx_chain_t *in);
|
||||||
|
static void *ngx_http_append_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_append_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static ngx_int_t ngx_http_append_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_append_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("append"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_str_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_append_loc_conf_t, text),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_append_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_append_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_append_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_append_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_append_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_append_module_ctx, /* module context */
|
||||||
|
ngx_http_append_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* next header and body filters in chain */
|
||||||
|
|
||||||
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_header_filter(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *plcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http append header handler");
|
||||||
|
|
||||||
|
plcf = ngx_http_get_module_loc_conf(r, ngx_http_append_module);
|
||||||
|
|
||||||
|
if (plcf->text.len == 0) {
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset content length */
|
||||||
|
ngx_http_clear_content_length(r);
|
||||||
|
|
||||||
|
/* disable ranges */
|
||||||
|
ngx_http_clear_accept_ranges(r);
|
||||||
|
|
||||||
|
/* clear etag */
|
||||||
|
ngx_http_clear_etag(r);
|
||||||
|
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||||
|
{
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_uint_t last;
|
||||||
|
ngx_chain_t out, *cl;
|
||||||
|
ngx_http_append_loc_conf_t *plcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http append body handler");
|
||||||
|
|
||||||
|
plcf = ngx_http_get_module_loc_conf(r, ngx_http_append_module);
|
||||||
|
|
||||||
|
if (plcf->text.len == 0) {
|
||||||
|
return ngx_http_next_body_filter(r, in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iterate over the buffers and find last_buf */
|
||||||
|
|
||||||
|
last = 0;
|
||||||
|
|
||||||
|
for (cl = in; cl; cl = cl->next) {
|
||||||
|
if (cl->buf->last_buf) {
|
||||||
|
cl->buf->last_buf = 0;
|
||||||
|
cl->buf->sync = 1;
|
||||||
|
last = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ngx_http_next_body_filter(r, in);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR || !last) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* output text */
|
||||||
|
|
||||||
|
b = ngx_calloc_buf(r->pool);
|
||||||
|
if (b == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->pos = plcf->text.data;
|
||||||
|
b->last = plcf->text.data + plcf->text.len;
|
||||||
|
b->memory = 1;
|
||||||
|
b->last_buf = 1;
|
||||||
|
|
||||||
|
out.buf = b;
|
||||||
|
out.next = NULL;
|
||||||
|
|
||||||
|
return ngx_http_next_body_filter(r, &out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_append_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_append_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->text = { 0, NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_append_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_append_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_str_value(conf->text, prev->text, "");
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
/* install handler in header filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_header_filter = ngx_http_top_header_filter;
|
||||||
|
ngx_http_top_header_filter = ngx_http_append_header_filter;
|
||||||
|
|
||||||
|
/* install handler in body filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_body_filter = ngx_http_top_body_filter;
|
||||||
|
ngx_http_top_body_filter = ngx_http_append_body_filter;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP_FILTER
|
||||||
|
ngx_addon_name=ngx_http_append_module
|
||||||
|
ngx_module_name=ngx_http_append_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_append_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,15 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
append on;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,234 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
#include <ngx_md5.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_flag_t enabled;
|
||||||
|
} ngx_http_append_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_md5_t md5;
|
||||||
|
} ngx_http_append_ctx_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_append_header_filter(ngx_http_request_t *r);
|
||||||
|
static ngx_int_t ngx_http_append_body_filter(ngx_http_request_t *r,
|
||||||
|
ngx_chain_t *in);
|
||||||
|
static void *ngx_http_append_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_append_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static ngx_int_t ngx_http_append_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_append_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("append"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||||
|
ngx_conf_set_flag_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_append_loc_conf_t, enabled),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_append_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_append_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_append_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_append_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_append_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_append_module_ctx, /* module context */
|
||||||
|
ngx_http_append_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* next header and body filters in chain */
|
||||||
|
|
||||||
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_header_filter(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *plcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http append header handler");
|
||||||
|
|
||||||
|
plcf = ngx_http_get_module_loc_conf(r, ngx_http_append_module);
|
||||||
|
|
||||||
|
if (!plcf->enabled) {
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* force reading file buffers into memory buffers */
|
||||||
|
r->filter_need_in_memory = 1;
|
||||||
|
|
||||||
|
/* reset content length */
|
||||||
|
ngx_http_clear_content_length(r);
|
||||||
|
|
||||||
|
/* disable ranges */
|
||||||
|
ngx_http_clear_accept_ranges(r);
|
||||||
|
|
||||||
|
/* set weak etag */
|
||||||
|
ngx_http_weak_etag(r);
|
||||||
|
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||||
|
{
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_uint_t last;
|
||||||
|
ngx_chain_t out, *cl;
|
||||||
|
ngx_http_append_ctx_t *ctx;
|
||||||
|
ngx_http_append_loc_conf_t *plcf;
|
||||||
|
u_char md5_buf[16];
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http append body handler");
|
||||||
|
|
||||||
|
plcf = ngx_http_get_module_loc_conf(r, ngx_http_append_module);
|
||||||
|
|
||||||
|
if (!plcf->enabled) {
|
||||||
|
return ngx_http_next_body_filter(r, in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get or create context */
|
||||||
|
|
||||||
|
ctx = ngx_http_get_module_ctx(r, ngx_http_append_module);
|
||||||
|
if (ctx == NULL) {
|
||||||
|
ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_append_ctx_t));
|
||||||
|
if (ctx == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngx_md5_init(&ctx->md5);
|
||||||
|
|
||||||
|
ngx_http_set_ctx(r, ctx, ngx_http_append_module);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iterate over the buffers and find last_buf */
|
||||||
|
|
||||||
|
last = 0;
|
||||||
|
|
||||||
|
for (cl = in; cl; cl = cl->next) {
|
||||||
|
if (cl->buf->last_buf) {
|
||||||
|
cl->buf->last_buf = 0;
|
||||||
|
cl->buf->sync = 1;
|
||||||
|
last = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngx_md5_update(&ctx->md5, cl->buf->pos, cl->buf->last - cl->buf->pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ngx_http_next_body_filter(r, in);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR || !last) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create second buffer with statistics */
|
||||||
|
|
||||||
|
b = ngx_calloc_buf(r->pool);
|
||||||
|
if (b == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->pos = ngx_pnalloc(r->pool, 32);
|
||||||
|
if (b->pos == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngx_md5_final(md5_buf, &ctx->md5);
|
||||||
|
|
||||||
|
b->last = ngx_hex_dump(b->pos, md5_buf, 16);
|
||||||
|
|
||||||
|
b->temporary = 1;
|
||||||
|
b->last_buf = 1;
|
||||||
|
|
||||||
|
out.buf = b;
|
||||||
|
out.next = NULL;
|
||||||
|
|
||||||
|
return ngx_http_next_body_filter(r, &out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_append_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_append_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
conf->enabled = NGX_CONF_UNSET;
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_append_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_append_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_value(conf->enabled, prev->enabled, 0);
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
/* install handler in header filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_header_filter = ngx_http_top_header_filter;
|
||||||
|
ngx_http_top_header_filter = ngx_http_append_header_filter;
|
||||||
|
|
||||||
|
/* install handler in body filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_body_filter = ngx_http_top_body_filter;
|
||||||
|
ngx_http_top_body_filter = ngx_http_append_body_filter;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP_FILTER
|
||||||
|
ngx_addon_name=ngx_http_append_module
|
||||||
|
ngx_module_name=ngx_http_append_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_append_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,19 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
append /bar;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /bar {
|
||||||
|
return 200 BAR\n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,207 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_str_t uri;
|
||||||
|
} ngx_http_append_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_append_header_filter(ngx_http_request_t *r);
|
||||||
|
static ngx_int_t ngx_http_append_body_filter(ngx_http_request_t *r,
|
||||||
|
ngx_chain_t *in);
|
||||||
|
static void *ngx_http_append_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_append_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static ngx_int_t ngx_http_append_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_append_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("append"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_str_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_append_loc_conf_t, uri),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_append_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_append_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_append_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_append_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_append_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_append_module_ctx, /* module context */
|
||||||
|
ngx_http_append_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* next header and body filters in chain */
|
||||||
|
|
||||||
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_header_filter(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *plcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http append header handler");
|
||||||
|
|
||||||
|
plcf = ngx_http_get_module_loc_conf(r, ngx_http_append_module);
|
||||||
|
|
||||||
|
if (plcf->uri.len == 0) {
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset content length */
|
||||||
|
ngx_http_clear_content_length(r);
|
||||||
|
|
||||||
|
/* disable ranges */
|
||||||
|
ngx_http_clear_accept_ranges(r);
|
||||||
|
|
||||||
|
/* clear etag */
|
||||||
|
ngx_http_clear_etag(r);
|
||||||
|
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
|
||||||
|
{
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_uint_t last;
|
||||||
|
ngx_chain_t out, *cl;
|
||||||
|
ngx_http_request_t *sr;
|
||||||
|
ngx_http_append_loc_conf_t *plcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http append body handler");
|
||||||
|
|
||||||
|
plcf = ngx_http_get_module_loc_conf(r, ngx_http_append_module);
|
||||||
|
|
||||||
|
if (plcf->uri.len == 0) {
|
||||||
|
return ngx_http_next_body_filter(r, in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iterate over the buffers and find last_buf */
|
||||||
|
|
||||||
|
last = 0;
|
||||||
|
|
||||||
|
for (cl = in; cl; cl = cl->next) {
|
||||||
|
if (cl->buf->last_buf) {
|
||||||
|
cl->buf->last_buf = 0;
|
||||||
|
cl->buf->last_in_chain = 1;
|
||||||
|
cl->buf->sync = 1;
|
||||||
|
last = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ngx_http_next_body_filter(r, in);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR || !last) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create a subrequest */
|
||||||
|
|
||||||
|
if (ngx_http_subrequest(r, &plcf->uri, NULL, &sr, NULL, 0) != NGX_OK) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b = ngx_calloc_buf(r->pool);
|
||||||
|
if (b == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->last_buf = 1;
|
||||||
|
|
||||||
|
out.buf = b;
|
||||||
|
out.next = NULL;
|
||||||
|
|
||||||
|
return ngx_http_next_body_filter(r, &out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_append_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_append_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->uri = { 0, NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_append_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_append_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_append_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_str_value(conf->uri, prev->uri, "");
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_append_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
/* install handler in header filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_header_filter = ngx_http_top_header_filter;
|
||||||
|
ngx_http_top_header_filter = ngx_http_append_header_filter;
|
||||||
|
|
||||||
|
/* install handler in body filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_body_filter = ngx_http_top_body_filter;
|
||||||
|
ngx_http_top_body_filter = ngx_http_append_body_filter;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP
|
||||||
|
ngx_addon_name=hello_world
|
||||||
|
ngx_module_name=ngx_http_hello_world_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,17 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
load_module modules/ngx_http_hello_world_module.so;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t *r);
|
||||||
|
static char *ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_hello_world_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("hello_world"),
|
||||||
|
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
|
||||||
|
ngx_http_hello_world,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_hello_world_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
NULL, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
NULL, /* create location configuration */
|
||||||
|
NULL /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_hello_world_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_hello_world_module_ctx, /* module context */
|
||||||
|
ngx_http_hello_world_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_str_t ngx_http_hello_world_text = ngx_string("Hello, world!\n");
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_hello_world_handler(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_chain_t out;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http hello_world handler");
|
||||||
|
|
||||||
|
/* ignore client request body if any */
|
||||||
|
|
||||||
|
if (ngx_http_discard_request_body(r) != NGX_OK) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send header */
|
||||||
|
|
||||||
|
r->headers_out.status = NGX_HTTP_OK;
|
||||||
|
r->headers_out.content_length_n = ngx_http_hello_world_text.len;
|
||||||
|
|
||||||
|
rc = ngx_http_send_header(r);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send body */
|
||||||
|
|
||||||
|
b = ngx_calloc_buf(r->pool);
|
||||||
|
if (b == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->pos = ngx_http_hello_world_text.data;
|
||||||
|
b->last = ngx_http_hello_world_text.data + ngx_http_hello_world_text.len;
|
||||||
|
b->memory = 1;
|
||||||
|
b->last_buf = (r == r->main) ? 1 : 0;
|
||||||
|
b->last_in_chain = 1;
|
||||||
|
|
||||||
|
out.buf = b;
|
||||||
|
out.next = NULL;
|
||||||
|
|
||||||
|
return ngx_http_output_filter(r, &out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_core_loc_conf_t *clcf;
|
||||||
|
|
||||||
|
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
|
||||||
|
|
||||||
|
clcf->handler = ngx_http_hello_world_handler;
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
# Tests for hello_world module.
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
use warnings;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
use Test::Nginx;
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
select STDERR; $| = 1;
|
||||||
|
select STDOUT; $| = 1;
|
||||||
|
|
||||||
|
my $t = Test::Nginx->new()->has(qw/http hello_world/)->plan(1);
|
||||||
|
|
||||||
|
$t->write_file_expand('nginx.conf', <<'EOF');
|
||||||
|
|
||||||
|
%%TEST_GLOBALS%%
|
||||||
|
|
||||||
|
daemon off;
|
||||||
|
|
||||||
|
events {
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
%%TEST_GLOBALS_HTTP%%
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:8080;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$t->run();
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
like(http_get('/'), qr/Hello, world!/, 'get hello world');
|
||||||
|
|
||||||
|
###############################################################################
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP
|
||||||
|
ngx_addon_name=hello_world
|
||||||
|
ngx_module_name=ngx_http_hello_world_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,19 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
hello_world_text 'foo bar';
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
hello_world_status 201;
|
||||||
|
hello_world_text 'foo bar';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,179 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_int_t status;
|
||||||
|
ngx_str_t text;
|
||||||
|
} ngx_http_hello_world_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_hello_world_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_hello_world_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static char *ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_hello_world_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("hello_world"),
|
||||||
|
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
|
||||||
|
ngx_http_hello_world,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("hello_world_status"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_num_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_hello_world_loc_conf_t, status),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("hello_world_text"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_str_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_hello_world_loc_conf_t, text),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_hello_world_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
NULL, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_hello_world_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_hello_world_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_hello_world_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_hello_world_module_ctx, /* module context */
|
||||||
|
ngx_http_hello_world_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_hello_world_handler(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_chain_t out;
|
||||||
|
ngx_http_hello_world_loc_conf_t *hlcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http hello_world handler");
|
||||||
|
|
||||||
|
/* ignore client request body if any */
|
||||||
|
|
||||||
|
if (ngx_http_discard_request_body(r) != NGX_OK) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
hlcf = ngx_http_get_module_loc_conf(r, ngx_http_hello_world_module);
|
||||||
|
|
||||||
|
/* send header */
|
||||||
|
|
||||||
|
r->headers_out.status = hlcf->status;
|
||||||
|
r->headers_out.content_length_n = hlcf->text.len;
|
||||||
|
|
||||||
|
rc = ngx_http_send_header(r);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send body */
|
||||||
|
|
||||||
|
b = ngx_calloc_buf(r->pool);
|
||||||
|
if (b == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->pos = hlcf->text.data;
|
||||||
|
b->last = hlcf->text.data + hlcf->text.len;
|
||||||
|
b->memory = hlcf->text.len ? 1 : 0;
|
||||||
|
b->last_buf = (r == r->main) ? 1 : 0;
|
||||||
|
b->last_in_chain = 1;
|
||||||
|
|
||||||
|
out.buf = b;
|
||||||
|
out.next = NULL;
|
||||||
|
|
||||||
|
return ngx_http_output_filter(r, &out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_hello_world_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_hello_world_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_hello_world_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->text = { 0, NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
conf->status = NGX_CONF_UNSET;
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_hello_world_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_hello_world_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_hello_world_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_str_value(conf->text, prev->text, "Hello, world!\n");
|
||||||
|
ngx_conf_merge_value(conf->status, prev->status, NGX_HTTP_OK);
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_core_loc_conf_t *clcf;
|
||||||
|
|
||||||
|
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
|
||||||
|
|
||||||
|
clcf->handler = ngx_http_hello_world_handler;
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
# Tests for hello_world module.
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
use warnings;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
use Test::Nginx;
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
select STDERR; $| = 1;
|
||||||
|
select STDOUT; $| = 1;
|
||||||
|
|
||||||
|
my $t = Test::Nginx->new()->has(qw/http hello_world/)->plan(2);
|
||||||
|
|
||||||
|
$t->write_file_expand('nginx.conf', <<'EOF');
|
||||||
|
|
||||||
|
%%TEST_GLOBALS%%
|
||||||
|
|
||||||
|
daemon off;
|
||||||
|
|
||||||
|
events {
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
%%TEST_GLOBALS_HTTP%%
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:8080;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
hello_world_text "Hello, universe!";
|
||||||
|
hello_world_status 201;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$t->run();
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
like(http_get('/'), qr/Hello, universe!/, 'get hello world text');
|
||||||
|
like(http_get('/'), qr/201 Created/i, 'get response code');
|
||||||
|
|
||||||
|
###############################################################################
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP
|
||||||
|
ngx_addon_name=hello_world
|
||||||
|
ngx_module_name=ngx_http_hello_world_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_hello_world_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,17 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
hello_world_status 201;
|
||||||
|
hello_world_text "$arg_foo bar\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,194 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_int_t status;
|
||||||
|
ngx_http_complex_value_t *text;
|
||||||
|
} ngx_http_hello_world_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_hello_world_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_hello_world_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static char *ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_hello_world_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("hello_world"),
|
||||||
|
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
|
||||||
|
ngx_http_hello_world,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("hello_world_status"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_conf_set_num_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_hello_world_loc_conf_t, status),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("hello_world_text"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_http_set_complex_value_slot,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
offsetof(ngx_http_hello_world_loc_conf_t, text),
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_hello_world_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
NULL, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_hello_world_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_hello_world_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_hello_world_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_hello_world_module_ctx, /* module context */
|
||||||
|
ngx_http_hello_world_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_hello_world_handler(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_buf_t *b;
|
||||||
|
ngx_int_t rc;
|
||||||
|
ngx_str_t text;
|
||||||
|
ngx_chain_t out;
|
||||||
|
ngx_http_hello_world_loc_conf_t *hlcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http hello_world handler");
|
||||||
|
|
||||||
|
/* ignore client request body if any */
|
||||||
|
|
||||||
|
if (ngx_http_discard_request_body(r) != NGX_OK) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
hlcf = ngx_http_get_module_loc_conf(r, ngx_http_hello_world_module);
|
||||||
|
|
||||||
|
/* make up output text */
|
||||||
|
|
||||||
|
if (hlcf->text) {
|
||||||
|
if (ngx_http_complex_value(r, hlcf->text, &text) != NGX_OK) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http hello_world text: \"%V\"", &text);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ngx_str_set(&text, "Hello, world!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send header */
|
||||||
|
|
||||||
|
r->headers_out.status = hlcf->status;
|
||||||
|
r->headers_out.content_length_n = text.len;
|
||||||
|
|
||||||
|
rc = ngx_http_send_header(r);
|
||||||
|
|
||||||
|
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send body */
|
||||||
|
|
||||||
|
b = ngx_calloc_buf(r->pool);
|
||||||
|
if (b == NULL) {
|
||||||
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->pos = text.data;
|
||||||
|
b->last = text.data + text.len;
|
||||||
|
b->memory = text.len ? 1 : 0;
|
||||||
|
b->last_buf = (r == r->main) ? 1 : 0;
|
||||||
|
b->last_in_chain = 1;
|
||||||
|
|
||||||
|
out.buf = b;
|
||||||
|
out.next = NULL;
|
||||||
|
|
||||||
|
return ngx_http_output_filter(r, &out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_hello_world_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_hello_world_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_hello_world_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->text = NULL;
|
||||||
|
*/
|
||||||
|
|
||||||
|
conf->status = NGX_CONF_UNSET;
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_hello_world_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_hello_world_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_hello_world_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
ngx_conf_merge_ptr_value(conf->text, prev->text, NULL);
|
||||||
|
ngx_conf_merge_value(conf->status, prev->status, NGX_HTTP_OK);
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_hello_world(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_core_loc_conf_t *clcf;
|
||||||
|
|
||||||
|
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
|
||||||
|
|
||||||
|
clcf->handler = ngx_http_hello_world_handler;
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
# Tests for hello_world module.
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
use warnings;
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
use Test::Nginx;
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
select STDERR; $| = 1;
|
||||||
|
select STDOUT; $| = 1;
|
||||||
|
|
||||||
|
my $t = Test::Nginx->new()->has(qw/http hello_world/)->plan(2);
|
||||||
|
|
||||||
|
$t->write_file_expand('nginx.conf', <<'EOF');
|
||||||
|
|
||||||
|
%%TEST_GLOBALS%%
|
||||||
|
|
||||||
|
daemon off;
|
||||||
|
|
||||||
|
events {
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
%%TEST_GLOBALS_HTTP%%
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 127.0.0.1:8080;
|
||||||
|
server_name localhost;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
hello_world;
|
||||||
|
hello_world_text "Hello, $arg_foo!";
|
||||||
|
hello_world_status 201;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
$t->run();
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
like(http_get('/?foo=city'), qr/Hello, city!/, 'get hello world text');
|
||||||
|
like(http_get('/'), qr/201 Created/i, 'get response code');
|
||||||
|
|
||||||
|
###############################################################################
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP
|
||||||
|
ngx_addon_name=ngx_http_md5_module
|
||||||
|
ngx_module_name=ngx_http_md5_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_md5_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,17 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
md5 $md5_foo $arg_foo;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
return 200 $md5_foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,154 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
#include <ngx_md5.h>
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_md5_variable(ngx_http_request_t *r,
|
||||||
|
ngx_http_variable_value_t *v, uintptr_t data);
|
||||||
|
static char *ngx_http_md5(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_md5_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("md5"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,
|
||||||
|
ngx_http_md5,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_md5_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
NULL, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
NULL, /* create location configuration */
|
||||||
|
NULL /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_md5_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_md5_module_ctx, /* module context */
|
||||||
|
ngx_http_md5_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_md5_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
|
||||||
|
uintptr_t data)
|
||||||
|
{
|
||||||
|
ngx_http_complex_value_t *cv = (ngx_http_complex_value_t *) data;
|
||||||
|
|
||||||
|
u_char *p;
|
||||||
|
ngx_md5_t md5;
|
||||||
|
ngx_str_t value;
|
||||||
|
u_char md5_buf[16];
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http md5 variable handler");
|
||||||
|
|
||||||
|
/* evaluate complex value */
|
||||||
|
|
||||||
|
if (ngx_http_complex_value(r, cv, &value) != NGX_OK) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* compute md5 */
|
||||||
|
|
||||||
|
ngx_md5_init(&md5);
|
||||||
|
ngx_md5_update(&md5, value.data, value.len);
|
||||||
|
ngx_md5_final(md5_buf, &md5);
|
||||||
|
|
||||||
|
p = ngx_pnalloc(r->pool, 32);
|
||||||
|
if (p == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngx_hex_dump(p, md5_buf, 16);
|
||||||
|
|
||||||
|
/* set variable value */
|
||||||
|
|
||||||
|
v->len = 32;
|
||||||
|
v->valid = 1;
|
||||||
|
v->no_cacheable = 0;
|
||||||
|
v->not_found = 0;
|
||||||
|
v->data = p;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_md5(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_str_t *value;
|
||||||
|
ngx_http_variable_t *var;
|
||||||
|
ngx_http_complex_value_t *cv;
|
||||||
|
ngx_http_compile_complex_value_t ccv;
|
||||||
|
|
||||||
|
value = cf->args->elts;
|
||||||
|
|
||||||
|
if (value[1].data[0] != '$') {
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid variable name \"%V\"", &value[1]);
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
value[1].len--;
|
||||||
|
value[1].data++;
|
||||||
|
|
||||||
|
/* compile complex value from the argument */
|
||||||
|
|
||||||
|
cv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));
|
||||||
|
if (cv == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
|
||||||
|
|
||||||
|
ccv.cf = cf;
|
||||||
|
ccv.value = &value[2];
|
||||||
|
ccv.complex_value = cv;
|
||||||
|
|
||||||
|
if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add variable */
|
||||||
|
|
||||||
|
var = ngx_http_add_variable(cf, &value[1], 0);
|
||||||
|
if (var == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
var->get_handler = ngx_http_md5_variable;
|
||||||
|
var->data = (uintptr_t) cv;
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP_FILTER
|
||||||
|
ngx_addon_name=set_header
|
||||||
|
ngx_module_name=ngx_http_set_header_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_set_header_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,15 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
set_header X-Foo foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,185 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_str_t name;
|
||||||
|
ngx_str_t value;
|
||||||
|
} ngx_http_set_header_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_set_header_filter(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_set_header_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_set_header_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static char *ngx_http_set_header(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
static ngx_int_t ngx_http_set_header_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_set_header_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("set_header"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
|
||||||
|
ngx_http_set_header,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_set_header_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_set_header_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_set_header_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_set_header_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_set_header_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_set_header_module_ctx, /* module context */
|
||||||
|
ngx_http_set_header_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* next header filter in chain */
|
||||||
|
|
||||||
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
|
||||||
|
|
||||||
|
/* header filter handler */
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_set_header_filter(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_table_elt_t *h;
|
||||||
|
ngx_http_set_header_loc_conf_t *slcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http set_header handler");
|
||||||
|
|
||||||
|
slcf = ngx_http_get_module_loc_conf(r, ngx_http_set_header_module);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if no header is defined for the location,
|
||||||
|
* proceed to the next header filter in chain
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (slcf->name.data == NULL) {
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add header to output */
|
||||||
|
|
||||||
|
h = ngx_list_push(&r->headers_out.headers);
|
||||||
|
if (h == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
h->hash = 1;
|
||||||
|
h->key = slcf->name;
|
||||||
|
h->value = slcf->value;
|
||||||
|
|
||||||
|
/* proceed to the next handler in chain */
|
||||||
|
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_set_header_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_set_header_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->name = { 0, NULL };
|
||||||
|
* conf->value = { 0, NULL };
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_set_header_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_set_header_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
if (conf->name.data == NULL) {
|
||||||
|
conf->name = prev->name;
|
||||||
|
conf->value = prev->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_set_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *slcf = conf;
|
||||||
|
|
||||||
|
ngx_str_t *value;
|
||||||
|
|
||||||
|
if (slcf->name.data) {
|
||||||
|
return "is duplicate";
|
||||||
|
}
|
||||||
|
|
||||||
|
value = cf->args->elts;
|
||||||
|
|
||||||
|
/* set name from argument #1 */
|
||||||
|
|
||||||
|
slcf->name = value[1];
|
||||||
|
|
||||||
|
/* value from argument #2 */
|
||||||
|
|
||||||
|
slcf->value = value[2];
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_set_header_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
/* install handler in header filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_header_filter = ngx_http_top_header_filter;
|
||||||
|
ngx_http_top_header_filter = ngx_http_set_header_filter;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP_FILTER
|
||||||
|
ngx_addon_name=set_header
|
||||||
|
ngx_module_name=ngx_http_set_header_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_set_header_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,16 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
set_header X-Foo foo;
|
||||||
|
set_header X-Bar bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_str_t name;
|
||||||
|
ngx_str_t value;
|
||||||
|
} ngx_http_set_header_entry_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* location configuration */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_array_t *entries;
|
||||||
|
} ngx_http_set_header_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_set_header_filter(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_set_header_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_set_header_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static char *ngx_http_set_header(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
static ngx_int_t ngx_http_set_header_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_set_header_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("set_header"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
|
||||||
|
ngx_http_set_header,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_set_header_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_set_header_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_set_header_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_set_header_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_set_header_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_set_header_module_ctx, /* module context */
|
||||||
|
ngx_http_set_header_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* next header filter in chain */
|
||||||
|
|
||||||
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
|
||||||
|
|
||||||
|
/* header filter handler */
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_set_header_filter(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_uint_t i;
|
||||||
|
ngx_table_elt_t *h;
|
||||||
|
ngx_http_set_header_entry_t *entry;
|
||||||
|
ngx_http_set_header_loc_conf_t *slcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http set_header handler");
|
||||||
|
|
||||||
|
slcf = ngx_http_get_module_loc_conf(r, ngx_http_set_header_module);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if no headers are defined for the location,
|
||||||
|
* proceed to the next header filter in chain
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (slcf->entries == NULL) {
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iterate over all headers in the location */
|
||||||
|
|
||||||
|
entry = slcf->entries->elts;
|
||||||
|
|
||||||
|
for (i = 0; i < slcf->entries->nelts; i++) {
|
||||||
|
|
||||||
|
/* add header to output */
|
||||||
|
|
||||||
|
h = ngx_list_push(&r->headers_out.headers);
|
||||||
|
if (h == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
h->hash = 1;
|
||||||
|
h->key = entry[i].name;
|
||||||
|
h->value = entry[i].value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* proceed to the next handler in chain */
|
||||||
|
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_set_header_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_set_header_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->entries = NULL;
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_set_header_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_set_header_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
if (conf->entries == NULL) {
|
||||||
|
conf->entries = prev->entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_set_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *slcf = conf;
|
||||||
|
|
||||||
|
ngx_str_t *value;
|
||||||
|
ngx_http_set_header_entry_t *entry;
|
||||||
|
|
||||||
|
/* create array if missing */
|
||||||
|
|
||||||
|
if (slcf->entries == NULL) {
|
||||||
|
slcf->entries = ngx_array_create(cf->pool, 4,
|
||||||
|
sizeof(ngx_http_set_header_entry_t));
|
||||||
|
if (slcf->entries == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add new array entry */
|
||||||
|
|
||||||
|
entry = ngx_array_push(slcf->entries);
|
||||||
|
if (entry == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = cf->args->elts;
|
||||||
|
|
||||||
|
/* set name from argument #1 */
|
||||||
|
|
||||||
|
entry->name = value[1];
|
||||||
|
|
||||||
|
/* value from argument #2 */
|
||||||
|
|
||||||
|
entry->value = value[2];
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_set_header_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
/* install handler in header filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_header_filter = ngx_http_top_header_filter;
|
||||||
|
ngx_http_top_header_filter = ngx_http_set_header_filter;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
ngx_module_type=HTTP_FILTER
|
||||||
|
ngx_addon_name=set_header
|
||||||
|
ngx_module_name=ngx_http_set_header_module
|
||||||
|
ngx_module_srcs="$ngx_addon_dir/ngx_http_set_header_module.c"
|
||||||
|
|
||||||
|
. auto/module
|
@ -0,0 +1,16 @@
|
|||||||
|
daemon off;
|
||||||
|
master_process off;
|
||||||
|
|
||||||
|
error_log logs/error.log debug;
|
||||||
|
|
||||||
|
events { }
|
||||||
|
|
||||||
|
http {
|
||||||
|
server {
|
||||||
|
listen 8000;
|
||||||
|
location / {
|
||||||
|
set_header X-Foo $arg_foo;
|
||||||
|
set_header X-Bar bar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,232 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) Nginx, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <ngx_config.h>
|
||||||
|
#include <ngx_core.h>
|
||||||
|
#include <ngx_http.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_str_t name;
|
||||||
|
ngx_http_complex_value_t value;
|
||||||
|
} ngx_http_set_header_entry_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* location configuration */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ngx_array_t *entries;
|
||||||
|
} ngx_http_set_header_loc_conf_t;
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t ngx_http_set_header_filter(ngx_http_request_t *r);
|
||||||
|
static void *ngx_http_set_header_create_loc_conf(ngx_conf_t *cf);
|
||||||
|
static char *ngx_http_set_header_merge_loc_conf(ngx_conf_t *cf, void *parent,
|
||||||
|
void *child);
|
||||||
|
static char *ngx_http_set_header(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
|
static ngx_int_t ngx_http_set_header_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_command_t ngx_http_set_header_commands[] = {
|
||||||
|
|
||||||
|
{ ngx_string("set_header"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
|
||||||
|
ngx_http_set_header,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
|
ngx_null_command
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_http_module_t ngx_http_set_header_module_ctx = {
|
||||||
|
NULL, /* preconfiguration */
|
||||||
|
ngx_http_set_header_init, /* postconfiguration */
|
||||||
|
|
||||||
|
NULL, /* create main configuration */
|
||||||
|
NULL, /* init main configuration */
|
||||||
|
|
||||||
|
NULL, /* create server configuration */
|
||||||
|
NULL, /* merge server configuration */
|
||||||
|
|
||||||
|
ngx_http_set_header_create_loc_conf, /* create location configuration */
|
||||||
|
ngx_http_set_header_merge_loc_conf /* merge location configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ngx_module_t ngx_http_set_header_module = {
|
||||||
|
NGX_MODULE_V1,
|
||||||
|
&ngx_http_set_header_module_ctx, /* module context */
|
||||||
|
ngx_http_set_header_commands, /* module directives */
|
||||||
|
NGX_HTTP_MODULE, /* module type */
|
||||||
|
NULL, /* init master */
|
||||||
|
NULL, /* init module */
|
||||||
|
NULL, /* init process */
|
||||||
|
NULL, /* init thread */
|
||||||
|
NULL, /* exit thread */
|
||||||
|
NULL, /* exit process */
|
||||||
|
NULL, /* exit master */
|
||||||
|
NGX_MODULE_V1_PADDING
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* next header filter in chain */
|
||||||
|
|
||||||
|
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
|
||||||
|
|
||||||
|
|
||||||
|
/* header filter handler */
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_set_header_filter(ngx_http_request_t *r)
|
||||||
|
{
|
||||||
|
ngx_str_t value;
|
||||||
|
ngx_uint_t i;
|
||||||
|
ngx_table_elt_t *h;
|
||||||
|
ngx_http_set_header_entry_t *entry;
|
||||||
|
ngx_http_set_header_loc_conf_t *slcf;
|
||||||
|
|
||||||
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http set_header handler");
|
||||||
|
|
||||||
|
slcf = ngx_http_get_module_loc_conf(r, ngx_http_set_header_module);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if no headers are defined for the location,
|
||||||
|
* proceed to the next header filter in chain
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (slcf->entries == NULL) {
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iterate over all headers in the location */
|
||||||
|
|
||||||
|
entry = slcf->entries->elts;
|
||||||
|
|
||||||
|
for (i = 0; i < slcf->entries->nelts; i++) {
|
||||||
|
|
||||||
|
/* evaluate the header value */
|
||||||
|
|
||||||
|
if (ngx_http_complex_value(r, &entry[i].value, &value) != NGX_OK) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add header to output */
|
||||||
|
|
||||||
|
h = ngx_list_push(&r->headers_out.headers);
|
||||||
|
if (h == NULL) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
h->hash = 1;
|
||||||
|
h->key = entry[i].name;
|
||||||
|
h->value = value;
|
||||||
|
|
||||||
|
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
"http set_header \"%V\" : \"%V\"", &h->key, &h->value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* proceed to the next handler in chain */
|
||||||
|
|
||||||
|
return ngx_http_next_header_filter(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
ngx_http_set_header_create_loc_conf(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *conf;
|
||||||
|
|
||||||
|
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_set_header_loc_conf_t));
|
||||||
|
if (conf == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set by ngx_pcalloc():
|
||||||
|
*
|
||||||
|
* conf->entries = NULL;
|
||||||
|
*/
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_set_header_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *prev = parent;
|
||||||
|
ngx_http_set_header_loc_conf_t *conf = child;
|
||||||
|
|
||||||
|
if (conf->entries == NULL) {
|
||||||
|
conf->entries = prev->entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_set_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_set_header_loc_conf_t *slcf = conf;
|
||||||
|
|
||||||
|
ngx_str_t *value;
|
||||||
|
ngx_http_set_header_entry_t *entry;
|
||||||
|
ngx_http_compile_complex_value_t ccv;
|
||||||
|
|
||||||
|
/* create array if missing */
|
||||||
|
|
||||||
|
if (slcf->entries == NULL) {
|
||||||
|
slcf->entries = ngx_array_create(cf->pool, 4,
|
||||||
|
sizeof(ngx_http_set_header_entry_t));
|
||||||
|
if (slcf->entries == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add new array entry */
|
||||||
|
|
||||||
|
entry = ngx_array_push(slcf->entries);
|
||||||
|
if (entry == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set name from argument #1 */
|
||||||
|
|
||||||
|
value = cf->args->elts;
|
||||||
|
|
||||||
|
entry->name = value[1];
|
||||||
|
|
||||||
|
/* set complex value from argument #2 */
|
||||||
|
|
||||||
|
ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
|
||||||
|
|
||||||
|
ccv.cf = cf;
|
||||||
|
ccv.value = &value[2];
|
||||||
|
ccv.complex_value = &entry->value;
|
||||||
|
|
||||||
|
if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_int_t
|
||||||
|
ngx_http_set_header_init(ngx_conf_t *cf)
|
||||||
|
{
|
||||||
|
/* install handler in header filter chain */
|
||||||
|
|
||||||
|
ngx_http_next_header_filter = ngx_http_top_header_filter;
|
||||||
|
ngx_http_top_header_filter = ngx_http_set_header_filter;
|
||||||
|
|
||||||
|
return NGX_OK;
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
objs/
|
||||||
|
Makefile
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002-2021 Igor Sysoev
|
||||||
|
* Copyright (C) 2011-2024 Nginx, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
Documentation is available at http://nginx.org
|
||||||
|
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# aCC: HP ANSI C++ B3910B A.03.55.02
|
||||||
|
|
||||||
|
# C89 mode
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -Ae"
|
||||||
|
CC_TEST_FLAGS="-Ae"
|
||||||
|
|
||||||
|
PCRE_OPT="$PCRE_OPT -Ae"
|
||||||
|
ZLIB_OPT="$ZLIB_OPT -Ae"
|
@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# Borland C++ 5.5
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
# maximize speed
|
||||||
|
CFLAGS="$CFLAGS -O2"
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium and Athlon
|
||||||
|
CPU_OPT="-5"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro)
|
||||||
|
# optimize for Pentium Pro, Pentium II and Pentium III
|
||||||
|
CPU_OPT="-6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# __stdcall
|
||||||
|
#CPU_OPT="$CPU_OPT -ps"
|
||||||
|
# __fastcall
|
||||||
|
#CPU_OPT="$CPU_OPT -pr"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
# multithreaded
|
||||||
|
CFLAGS="$CFLAGS -tWM"
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -w!"
|
||||||
|
|
||||||
|
# disable logo
|
||||||
|
CFLAGS="$CFLAGS -q"
|
||||||
|
|
||||||
|
|
||||||
|
# precompiled headers
|
||||||
|
CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.csm"
|
||||||
|
NGX_PCH="$NGX_OBJS/ngx_config.csm"
|
||||||
|
NGX_BUILD_PCH="-H=$NGX_OBJS/ngx_config.csm"
|
||||||
|
NGX_USE_PCH="-Hu -H=$NGX_OBJS/ngx_config.csm"
|
||||||
|
|
||||||
|
|
||||||
|
# Win32 GUI mode application
|
||||||
|
#LINK="\$(CC) -laa"
|
||||||
|
|
||||||
|
|
||||||
|
# the resource file
|
||||||
|
NGX_RES="$NGX_OBJS/nginx.res"
|
||||||
|
NGX_RCC="brcc32 -fo$NGX_OBJS/nginx.res \$(CORE_INCS) $NGX_WIN32_RC"
|
||||||
|
# the pragma allows to link the resource file using bcc32 and
|
||||||
|
# to avoid the direct ilink32 calling and the c0w32.obj's WinMain/main problem
|
||||||
|
NGX_PRAGMA="#pragma resource \"$NGX_OBJS/nginx.res\""
|
||||||
|
|
||||||
|
|
||||||
|
ngx_include_opt="-I"
|
||||||
|
ngx_objout="-o"
|
||||||
|
ngx_binout="-e"
|
||||||
|
ngx_objext="obj"
|
||||||
|
|
||||||
|
ngx_long_start='@&&|
|
||||||
|
'
|
||||||
|
ngx_long_end='|'
|
||||||
|
|
||||||
|
ngx_regex_dirsep='\\'
|
||||||
|
ngx_dirsep="\\"
|
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# Compaq C V6.5-207
|
||||||
|
|
||||||
|
ngx_include_opt="-I"
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -msg_enable level6 -msg_fatal level6"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -msg_disable unknownmacro"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable unusedincl"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable unnecincl"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable nestincl"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable strctpadding"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable ansialiascast"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable inlinestoclsmod"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable cxxkeyword"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable longlongsufx"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable valuepres"
|
||||||
|
|
||||||
|
# STUB
|
||||||
|
CFLAGS="$CFLAGS -msg_disable truncintcast"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable trunclongcast"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -msg_disable truncintasn"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable trunclongint"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable intconcastsgn"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable intconstsign"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable switchlong"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable subscrbounds2"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -msg_disable hexoctunsign"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -msg_disable ignorecallval"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable nonstandcast"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable embedcomment"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable unreachcode"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable questcompare2"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable unusedtop"
|
||||||
|
CFLAGS="$CFLAGS -msg_disable unrefdecl"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -msg_disable bitnotint"
|
@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# clang
|
||||||
|
|
||||||
|
|
||||||
|
NGX_CLANG_VER=`$CC -v 2>&1 | grep 'version' 2>&1 \
|
||||||
|
| sed -n -e 's/^.*clang version \(.*\)/\1/p' \
|
||||||
|
-e 's/^.*LLVM version \(.*\)/\1/p'`
|
||||||
|
|
||||||
|
echo " + clang version: $NGX_CLANG_VER"
|
||||||
|
|
||||||
|
have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define
|
||||||
|
|
||||||
|
|
||||||
|
CC_TEST_FLAGS="-pipe"
|
||||||
|
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
#NGX_CLANG_OPT="-O2"
|
||||||
|
#NGX_CLANG_OPT="-Oz"
|
||||||
|
NGX_CLANG_OPT="-O"
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium
|
||||||
|
CPU_OPT="-march=pentium"
|
||||||
|
NGX_CPU_CACHE_LINE=32
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro | pentium3)
|
||||||
|
# optimize for Pentium Pro, Pentium II and Pentium III
|
||||||
|
CPU_OPT="-march=pentiumpro"
|
||||||
|
NGX_CPU_CACHE_LINE=32
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentium4)
|
||||||
|
# optimize for Pentium 4
|
||||||
|
CPU_OPT="-march=pentium4"
|
||||||
|
NGX_CPU_CACHE_LINE=128
|
||||||
|
;;
|
||||||
|
|
||||||
|
athlon)
|
||||||
|
# optimize for Athlon
|
||||||
|
CPU_OPT="-march=athlon"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
opteron)
|
||||||
|
# optimize for Opteron
|
||||||
|
CPU_OPT="-march=opteron"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -pipe $CPU_OPT"
|
||||||
|
|
||||||
|
if [ ".$PCRE_OPT" = "." ]; then
|
||||||
|
PCRE_OPT="-O2 -pipe $CPU_OPT"
|
||||||
|
else
|
||||||
|
PCRE_OPT="$PCRE_OPT -pipe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ".$ZLIB_OPT" = "." ]; then
|
||||||
|
ZLIB_OPT="-O2 -pipe $CPU_OPT"
|
||||||
|
else
|
||||||
|
ZLIB_OPT="$ZLIB_OPT -pipe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith"
|
||||||
|
CFLAGS="$CFLAGS -Wconditional-uninitialized"
|
||||||
|
#CFLAGS="$CFLAGS -Wmissing-prototypes"
|
||||||
|
|
||||||
|
# we have a lot of unused function arguments
|
||||||
|
CFLAGS="$CFLAGS -Wno-unused-parameter"
|
||||||
|
|
||||||
|
# deprecated system OpenSSL library on OS X
|
||||||
|
if [ "$NGX_SYSTEM" = "Darwin" ]; then
|
||||||
|
CFLAGS="$CFLAGS -Wno-deprecated-declarations"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -Werror"
|
||||||
|
|
||||||
|
# debug
|
||||||
|
CFLAGS="$CFLAGS -g"
|
||||||
|
|
||||||
|
if [ ".$CPP" = "." ]; then
|
||||||
|
CPP="$CC -E"
|
||||||
|
fi
|
@ -0,0 +1,254 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
LINK="\$(CC)"
|
||||||
|
|
||||||
|
MAIN_LINK=
|
||||||
|
MODULE_LINK="-shared"
|
||||||
|
|
||||||
|
ngx_include_opt="-I "
|
||||||
|
ngx_compile_opt="-c"
|
||||||
|
ngx_pic_opt="-fPIC"
|
||||||
|
ngx_objout="-o "
|
||||||
|
ngx_binout="-o "
|
||||||
|
ngx_objext="o"
|
||||||
|
ngx_binext=
|
||||||
|
ngx_modext=".so"
|
||||||
|
|
||||||
|
ngx_long_start=
|
||||||
|
ngx_long_end=
|
||||||
|
|
||||||
|
ngx_regex_dirsep="\/"
|
||||||
|
ngx_dirsep='/'
|
||||||
|
|
||||||
|
ngx_regex_cont=' \\\
|
||||||
|
'
|
||||||
|
ngx_cont=' \
|
||||||
|
'
|
||||||
|
ngx_tab=' \
|
||||||
|
'
|
||||||
|
ngx_spacer=
|
||||||
|
|
||||||
|
ngx_long_regex_cont=$ngx_regex_cont
|
||||||
|
ngx_long_cont=$ngx_cont
|
||||||
|
|
||||||
|
. auto/cc/name
|
||||||
|
|
||||||
|
if test -n "$CFLAGS"; then
|
||||||
|
|
||||||
|
CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"
|
||||||
|
|
||||||
|
case $NGX_CC_NAME in
|
||||||
|
|
||||||
|
ccc)
|
||||||
|
# Compaq C V6.5-207
|
||||||
|
|
||||||
|
ngx_include_opt="-I"
|
||||||
|
;;
|
||||||
|
|
||||||
|
sunc)
|
||||||
|
|
||||||
|
MAIN_LINK=
|
||||||
|
MODULE_LINK="-G"
|
||||||
|
|
||||||
|
case "$NGX_MACHINE" in
|
||||||
|
|
||||||
|
i86pc)
|
||||||
|
NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"
|
||||||
|
;;
|
||||||
|
|
||||||
|
sun4u | sun4v)
|
||||||
|
NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
|
||||||
|
amd64)
|
||||||
|
NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
case $NGX_CC_NAME in
|
||||||
|
gcc)
|
||||||
|
# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2
|
||||||
|
# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2
|
||||||
|
# 4.0.0, 4.0.1, 4.1.0
|
||||||
|
|
||||||
|
. auto/cc/gcc
|
||||||
|
;;
|
||||||
|
|
||||||
|
clang)
|
||||||
|
# Clang C compiler
|
||||||
|
|
||||||
|
. auto/cc/clang
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
# Intel C++ compiler 7.1, 8.0, 8.1
|
||||||
|
|
||||||
|
. auto/cc/icc
|
||||||
|
;;
|
||||||
|
|
||||||
|
sunc)
|
||||||
|
# Sun C 5.7 Patch 117837-04 2005/05/11
|
||||||
|
|
||||||
|
. auto/cc/sunc
|
||||||
|
;;
|
||||||
|
|
||||||
|
ccc)
|
||||||
|
# Compaq C V6.5-207
|
||||||
|
|
||||||
|
. auto/cc/ccc
|
||||||
|
;;
|
||||||
|
|
||||||
|
acc)
|
||||||
|
# aCC: HP ANSI C++ B3910B A.03.55.02
|
||||||
|
|
||||||
|
. auto/cc/acc
|
||||||
|
;;
|
||||||
|
|
||||||
|
msvc)
|
||||||
|
# MSVC++ 6.0 SP2, MSVC++ Toolkit 2003
|
||||||
|
|
||||||
|
. auto/cc/msvc
|
||||||
|
;;
|
||||||
|
|
||||||
|
owc)
|
||||||
|
# Open Watcom C 1.0, 1.2
|
||||||
|
|
||||||
|
. auto/cc/owc
|
||||||
|
;;
|
||||||
|
|
||||||
|
bcc)
|
||||||
|
# Borland C++ 5.5
|
||||||
|
|
||||||
|
. auto/cc/bcc
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $NGX_CC_OPT"
|
||||||
|
NGX_TEST_LD_OPT="$NGX_LD_OPT"
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" != win32 ]; then
|
||||||
|
|
||||||
|
if test -n "$NGX_LD_OPT"; then
|
||||||
|
ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test=
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="-Wl,-E switch"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=-Wl,-E
|
||||||
|
ngx_feature_test=
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
MAIN_LINK="-Wl,-E"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$NGX_CC_NAME" = "sunc" ]; then
|
||||||
|
echo "checking for gcc builtin atomic operations ... disabled"
|
||||||
|
else
|
||||||
|
ngx_feature="gcc builtin atomic operations"
|
||||||
|
ngx_feature_name=NGX_HAVE_GCC_ATOMIC
|
||||||
|
ngx_feature_run=yes
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test="long n = 0;
|
||||||
|
if (!__sync_bool_compare_and_swap(&n, 0, 1))
|
||||||
|
return 1;
|
||||||
|
if (__sync_fetch_and_add(&n, 1) != 1)
|
||||||
|
return 1;
|
||||||
|
if (n != 2)
|
||||||
|
return 1;
|
||||||
|
__sync_synchronize();"
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$NGX_CC_NAME" = "ccc" ]; then
|
||||||
|
echo "checking for C99 variadic macros ... disabled"
|
||||||
|
else
|
||||||
|
ngx_feature="C99 variadic macros"
|
||||||
|
ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"
|
||||||
|
ngx_feature_run=yes
|
||||||
|
ngx_feature_incs="#include <stdio.h>
|
||||||
|
#define var(dummy, ...) sprintf(__VA_ARGS__)"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test="char buf[30]; buf[0] = '0';
|
||||||
|
var(0, buf, \"%d\", 1);
|
||||||
|
if (buf[0] != '1') return 1"
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="gcc variadic macros"
|
||||||
|
ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"
|
||||||
|
ngx_feature_run=yes
|
||||||
|
ngx_feature_incs="#include <stdio.h>
|
||||||
|
#define var(dummy, args...) sprintf(args)"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test="char buf[30]; buf[0] = '0';
|
||||||
|
var(0, buf, \"%d\", 1);
|
||||||
|
if (buf[0] != '1') return 1"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="gcc builtin 64 bit byteswap"
|
||||||
|
ngx_feature_name="NGX_HAVE_GCC_BSWAP64"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test="if (__builtin_bswap64(0)) return 1"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
# ngx_feature="inline"
|
||||||
|
# ngx_feature_name=
|
||||||
|
# ngx_feature_run=no
|
||||||
|
# ngx_feature_incs="int inline f(void) { return 1 }"
|
||||||
|
# ngx_feature_path=
|
||||||
|
# ngx_feature_libs=
|
||||||
|
# ngx_feature_test=
|
||||||
|
# . auto/feature
|
||||||
|
#
|
||||||
|
# if [ $ngx_found = yes ]; then
|
||||||
|
# fi
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,179 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2
|
||||||
|
# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2
|
||||||
|
# 4.0.0, 4.0.1, 4.1.0
|
||||||
|
|
||||||
|
|
||||||
|
NGX_GCC_VER=`$CC -v 2>&1 | grep 'gcc version' 2>&1 \
|
||||||
|
| sed -e 's/^.* version \(.*\)/\1/'`
|
||||||
|
|
||||||
|
echo " + gcc version: $NGX_GCC_VER"
|
||||||
|
|
||||||
|
have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define
|
||||||
|
|
||||||
|
|
||||||
|
# Solaris 7's /usr/ccs/bin/as does not support "-pipe"
|
||||||
|
|
||||||
|
CC_TEST_FLAGS="-pipe"
|
||||||
|
|
||||||
|
ngx_feature="gcc -pipe switch"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test=
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
CC_TEST_FLAGS=
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
PIPE="-pipe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
case "$NGX_MACHINE" in
|
||||||
|
|
||||||
|
sun4u | sun4v | sparc | sparc64 )
|
||||||
|
# "-mcpu=v9" enables the "casa" assembler instruction
|
||||||
|
CFLAGS="$CFLAGS -mcpu=v9"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
#NGX_GCC_OPT="-O2"
|
||||||
|
#NGX_GCC_OPT="-Os"
|
||||||
|
NGX_GCC_OPT="-O"
|
||||||
|
|
||||||
|
#CFLAGS="$CFLAGS -fomit-frame-pointer"
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium and Athlon
|
||||||
|
CPU_OPT="-march=pentium"
|
||||||
|
NGX_CPU_CACHE_LINE=32
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro | pentium3)
|
||||||
|
# optimize for Pentium Pro, Pentium II and Pentium III
|
||||||
|
CPU_OPT="-march=pentiumpro"
|
||||||
|
NGX_CPU_CACHE_LINE=32
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentium4)
|
||||||
|
# optimize for Pentium 4, gcc 3.x
|
||||||
|
CPU_OPT="-march=pentium4"
|
||||||
|
NGX_CPU_CACHE_LINE=128
|
||||||
|
;;
|
||||||
|
|
||||||
|
athlon)
|
||||||
|
# optimize for Athlon, gcc 3.x
|
||||||
|
CPU_OPT="-march=athlon"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
opteron)
|
||||||
|
# optimize for Opteron, gcc 3.x
|
||||||
|
CPU_OPT="-march=opteron"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
sparc32)
|
||||||
|
# build 32-bit UltraSparc binary
|
||||||
|
CPU_OPT="-m32"
|
||||||
|
CORE_LINK="$CORE_LINK -m32"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
sparc64)
|
||||||
|
# build 64-bit UltraSparc binary
|
||||||
|
CPU_OPT="-m64"
|
||||||
|
CORE_LINK="$CORE_LINK -m64"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
ppc64)
|
||||||
|
# build 64-bit PowerPC binary
|
||||||
|
CPU_OPT="-m64"
|
||||||
|
CPU_OPT="$CPU_OPT -falign-functions=32 -falign-labels=32"
|
||||||
|
CPU_OPT="$CPU_OPT -falign-loops=32 -falign-jumps=32"
|
||||||
|
CORE_LINK="$CORE_LINK -m64"
|
||||||
|
NGX_CPU_CACHE_LINE=128
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
case "$NGX_GCC_VER" in
|
||||||
|
2.7*)
|
||||||
|
# batch build
|
||||||
|
CPU_OPT=
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $PIPE $CPU_OPT"
|
||||||
|
|
||||||
|
if [ ".$PCRE_OPT" = "." ]; then
|
||||||
|
PCRE_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"
|
||||||
|
else
|
||||||
|
PCRE_OPT="$PCRE_OPT $PIPE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ".$ZLIB_OPT" = "." ]; then
|
||||||
|
ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT"
|
||||||
|
else
|
||||||
|
ZLIB_OPT="$ZLIB_OPT $PIPE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
|
||||||
|
# -W requires at least -O
|
||||||
|
CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -Wall -Wpointer-arith"
|
||||||
|
#CFLAGS="$CFLAGS -Wconversion"
|
||||||
|
#CFLAGS="$CFLAGS -Winline"
|
||||||
|
#CFLAGS="$CFLAGS -Wmissing-prototypes"
|
||||||
|
|
||||||
|
case "$NGX_GCC_VER" in
|
||||||
|
2.*)
|
||||||
|
# we have a lot of the unused function arguments
|
||||||
|
CFLAGS="$CFLAGS -Wno-unused"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
# we have a lot of the unused function arguments
|
||||||
|
CFLAGS="$CFLAGS -Wno-unused-parameter"
|
||||||
|
# 4.2.1 shows the warning in wrong places
|
||||||
|
#CFLAGS="$CFLAGS -Wunreachable-code"
|
||||||
|
|
||||||
|
# deprecated system OpenSSL library on OS X
|
||||||
|
if [ "$NGX_SYSTEM" = "Darwin" ]; then
|
||||||
|
CFLAGS="$CFLAGS -Wno-deprecated-declarations"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -Werror"
|
||||||
|
|
||||||
|
# debug
|
||||||
|
CFLAGS="$CFLAGS -g"
|
||||||
|
|
||||||
|
# DragonFly's gcc3 generates DWARF
|
||||||
|
#CFLAGS="$CFLAGS -g -gstabs"
|
||||||
|
|
||||||
|
if [ ".$CPP" = "." ]; then
|
||||||
|
CPP="$CC -E"
|
||||||
|
fi
|
@ -0,0 +1,117 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# Intel C++ compiler 7.1, 8.0, 8.1, 9.0, 11.1
|
||||||
|
|
||||||
|
NGX_ICC_VER=`$CC -V 2>&1 | grep 'Version' 2>&1 \
|
||||||
|
| sed -e 's/^.* Version \([^ ]*\) *Build.*$/\1/'`
|
||||||
|
|
||||||
|
echo " + icc version: $NGX_ICC_VER"
|
||||||
|
|
||||||
|
have=NGX_COMPILER value="\"Intel C Compiler $NGX_ICC_VER\"" . auto/define
|
||||||
|
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -O"
|
||||||
|
|
||||||
|
CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file"
|
||||||
|
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium and Athlon
|
||||||
|
CPU_OPT="-march=pentium"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro)
|
||||||
|
# optimize for Pentium Pro, Pentium II and Pentium III
|
||||||
|
CPU_OPT="-mcpu=pentiumpro -march=pentiumpro"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentium4)
|
||||||
|
# optimize for Pentium 4, default
|
||||||
|
CPU_OPT="-march=pentium4"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
if [ ".$PCRE_OPT" = "." ]; then
|
||||||
|
PCRE_OPT="-O $CPU_OPT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ".$ZLIB_OPT" = "." ]; then
|
||||||
|
ZLIB_OPT="-O $CPU_OPT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -w2"
|
||||||
|
|
||||||
|
# disable some warnings
|
||||||
|
|
||||||
|
# invalid type conversion: "int" to "char *"
|
||||||
|
CFLAGS="$CFLAGS -wd171"
|
||||||
|
# argument is incompatible with corresponding format string conversion
|
||||||
|
CFLAGS="$CFLAGS -wd181"
|
||||||
|
# zero used for undefined preprocessing identifier
|
||||||
|
CFLAGS="$CFLAGS -wd193"
|
||||||
|
# the format string ends before this argument
|
||||||
|
CFLAGS="$CFLAGS -wd268"
|
||||||
|
# invalid format string conversion
|
||||||
|
CFLAGS="$CFLAGS -wd269"
|
||||||
|
# conversion from "long long" to "size_t" may lose significant bits
|
||||||
|
CFLAGS="$CFLAGS -wd810"
|
||||||
|
# parameter was never referenced
|
||||||
|
CFLAGS="$CFLAGS -wd869"
|
||||||
|
# attribute "unused" is only allowed in a function definition, warning on pTHX_
|
||||||
|
CFLAGS="$CFLAGS -wd1301"
|
||||||
|
|
||||||
|
# STUB
|
||||||
|
# enumerated type mixed with another type
|
||||||
|
CFLAGS="$CFLAGS -wd188"
|
||||||
|
# controlling expression is constant
|
||||||
|
CFLAGS="$CFLAGS -wd279"
|
||||||
|
# operands are evaluated in unspecified order
|
||||||
|
CFLAGS="$CFLAGS -wd981"
|
||||||
|
# external definition with no prior declaration
|
||||||
|
CFLAGS="$CFLAGS -wd1418"
|
||||||
|
# external declaration in primary source file
|
||||||
|
CFLAGS="$CFLAGS -wd1419"
|
||||||
|
|
||||||
|
case "$NGX_ICC_VER" in
|
||||||
|
9.*)
|
||||||
|
# "cc" clobber ignored, warnings for Linux's htonl()/htons()
|
||||||
|
CFLAGS="$CFLAGS -wd1469"
|
||||||
|
# explicit conversion of a 64-bit integral type to a smaller
|
||||||
|
# integral type
|
||||||
|
CFLAGS="$CFLAGS -wd1683"
|
||||||
|
# conversion from pointer to same-sized integral type,
|
||||||
|
# warning on offsetof()
|
||||||
|
CFLAGS="$CFLAGS -wd1684"
|
||||||
|
# floating-point equality and inequality comparisons are unreliable,
|
||||||
|
# warning on SvTRUE()
|
||||||
|
CFLAGS="$CFLAGS -wd1572"
|
||||||
|
;;
|
||||||
|
|
||||||
|
8.*)
|
||||||
|
# "cc" clobber ignored, warnings for Linux's htonl()/htons()
|
||||||
|
CFLAGS="$CFLAGS -wd1469"
|
||||||
|
# floating-point equality and inequality comparisons are unreliable,
|
||||||
|
# warning on SvTRUE()
|
||||||
|
CFLAGS="$CFLAGS -wd1572"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -Werror"
|
||||||
|
|
||||||
|
# debug
|
||||||
|
CFLAGS="$CFLAGS -g"
|
@ -0,0 +1,171 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# MSVC 6.0 SP2 cl 12.00
|
||||||
|
# MSVC Toolkit 2003 (7.1) cl 13.10
|
||||||
|
# MSVC 2005 Express Edition SP1 (8.0) cl 14.00
|
||||||
|
# MSVC 2008 Express Edition (9.0) cl 15.00
|
||||||
|
# MSVC 2010 (10.0) cl 16.00
|
||||||
|
# MSVC 2015 (14.0) cl 19.00
|
||||||
|
|
||||||
|
|
||||||
|
NGX_MSVC_VER=`$NGX_WINE $CC 2>&1 | grep 'C/C++.* [0-9][0-9]*\.[0-9]' 2>&1 \
|
||||||
|
| sed -e 's/^.* \([0-9][0-9]*\.[0-9].*\)/\1/'`
|
||||||
|
|
||||||
|
echo " + cl version: $NGX_MSVC_VER"
|
||||||
|
|
||||||
|
have=NGX_COMPILER value="\"cl $NGX_MSVC_VER\"" . auto/define
|
||||||
|
|
||||||
|
|
||||||
|
ngx_msvc_ver=`echo $NGX_MSVC_VER | sed -e 's/^\([0-9]*\).*/\1/'`
|
||||||
|
|
||||||
|
|
||||||
|
# detect x64 builds
|
||||||
|
|
||||||
|
case "$NGX_MSVC_VER" in
|
||||||
|
|
||||||
|
*x64)
|
||||||
|
NGX_MACHINE=amd64
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_MACHINE=i386
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
# maximize speed, equivalent to -Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy
|
||||||
|
CFLAGS="$CFLAGS -O2"
|
||||||
|
|
||||||
|
# enable global optimization
|
||||||
|
#CFLAGS="$CFLAGS -Og"
|
||||||
|
# enable intrinsic functions
|
||||||
|
#CFLAGS="$CFLAGS -Oi"
|
||||||
|
|
||||||
|
# disable inline expansion
|
||||||
|
#CFLAGS="$CFLAGS -Ob0"
|
||||||
|
# explicit inline expansion
|
||||||
|
#CFLAGS="$CFLAGS -Ob1"
|
||||||
|
# explicit and implicit inline expansion
|
||||||
|
#CFLAGS="$CFLAGS -Ob2"
|
||||||
|
|
||||||
|
# enable frame pointer omission
|
||||||
|
#CFLAGS="$CFLAGS -Oy"
|
||||||
|
# disable stack checking calls
|
||||||
|
#CFLAGS="$CFLAGS -Gs"
|
||||||
|
|
||||||
|
# pools strings as read/write
|
||||||
|
#CFLAGS="$CFLAGS -Gf"
|
||||||
|
# pools strings as read-only
|
||||||
|
#CFLAGS="$CFLAGS -GF"
|
||||||
|
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium and Athlon
|
||||||
|
CPU_OPT="-G5"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro)
|
||||||
|
# optimize for Pentium Pro, Pentium II and Pentium III
|
||||||
|
CPU_OPT="-G6"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentium4)
|
||||||
|
# optimize for Pentium 4, MSVC 7
|
||||||
|
CPU_OPT="-G7"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# __cdecl, default, must be used with OpenSSL, md5 asm, and sha1 asm
|
||||||
|
#CPU_OPT="$CPU_OPT -Gd"
|
||||||
|
# __stdcall
|
||||||
|
#CPU_OPT="$CPU_OPT -Gz"
|
||||||
|
# __fastcall
|
||||||
|
#CPU_OPT="$CPU_OPT -Gr"
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS -W4"
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -WX"
|
||||||
|
|
||||||
|
# disable logo
|
||||||
|
CFLAGS="$CFLAGS -nologo"
|
||||||
|
|
||||||
|
# the link flags
|
||||||
|
CORE_LINK="$CORE_LINK -link -verbose:lib"
|
||||||
|
|
||||||
|
# link with libcmt.lib, multithreaded
|
||||||
|
LIBC="-MT"
|
||||||
|
# link with msvcrt.dll
|
||||||
|
# however, MSVC Toolkit 2003 has no MSVCRT.LIB
|
||||||
|
#LIBC="-MD"
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $LIBC"
|
||||||
|
|
||||||
|
CORE_LIBS="$CORE_LIBS kernel32.lib user32.lib"
|
||||||
|
|
||||||
|
# Win32 GUI mode application
|
||||||
|
#CORE_LINK="$CORE_LINK -subsystem:windows -entry:mainCRTStartup"
|
||||||
|
|
||||||
|
# debug
|
||||||
|
# msvc under Wine issues
|
||||||
|
# C1902: Program database manager mismatch; please check your installation
|
||||||
|
if [ -z "$NGX_WINE" ]; then
|
||||||
|
CFLAGS="$CFLAGS -Zi -Fd$NGX_OBJS/nginx.pdb"
|
||||||
|
CORE_LINK="$CORE_LINK -debug"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# MSVC 2005 supports C99 variadic macros
|
||||||
|
if [ "$ngx_msvc_ver" -ge 14 ]; then
|
||||||
|
have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# precompiled headers
|
||||||
|
CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch"
|
||||||
|
CORE_LINK="$CORE_LINK $NGX_OBJS/ngx_pch.obj"
|
||||||
|
NGX_PCH="$NGX_OBJS/ngx_config.pch"
|
||||||
|
NGX_BUILD_PCH="-Ycngx_config.h -Fp$NGX_OBJS/ngx_config.pch"
|
||||||
|
NGX_USE_PCH="-Yungx_config.h -Fp$NGX_OBJS/ngx_config.pch"
|
||||||
|
|
||||||
|
|
||||||
|
# the resource file
|
||||||
|
NGX_RES="$NGX_OBJS/nginx.res"
|
||||||
|
NGX_RCC="rc -fo$NGX_RES \$(CORE_INCS) $NGX_WIN32_RC"
|
||||||
|
CORE_LINK="$NGX_RES $CORE_LINK"
|
||||||
|
|
||||||
|
|
||||||
|
# dynamic modules
|
||||||
|
#MAIN_LINK="-link -def:$NGX_OBJS/nginx.def"
|
||||||
|
#MODULE_LINK="-LD $NGX_OBJS/nginx.lib"
|
||||||
|
|
||||||
|
|
||||||
|
ngx_pic_opt=
|
||||||
|
ngx_objout="-Fo"
|
||||||
|
ngx_binout="-Fe"
|
||||||
|
ngx_objext="obj"
|
||||||
|
|
||||||
|
ngx_long_start='@<<
|
||||||
|
'
|
||||||
|
ngx_long_end='<<'
|
||||||
|
ngx_long_regex_cont=' \
|
||||||
|
'
|
||||||
|
ngx_long_cont='
|
||||||
|
'
|
||||||
|
|
||||||
|
# MSVC understand / in path
|
||||||
|
#ngx_regex_dirsep='\\'
|
||||||
|
#ngx_dirsep="\\"
|
@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" != win32 ]; then
|
||||||
|
|
||||||
|
ngx_feature="C compiler"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=yes
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test=
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
echo
|
||||||
|
echo $0: error: C compiler $CC is not found
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$CC" = cl ]; then
|
||||||
|
NGX_CC_NAME=msvc
|
||||||
|
echo " + using Microsoft Visual C++ compiler"
|
||||||
|
|
||||||
|
elif [ "$CC" = wcl386 ]; then
|
||||||
|
NGX_CC_NAME=owc
|
||||||
|
echo " + using Open Watcom C compiler"
|
||||||
|
|
||||||
|
elif [ "$CC" = bcc32 ]; then
|
||||||
|
NGX_CC_NAME=bcc
|
||||||
|
echo " + using Borland C++ compiler"
|
||||||
|
|
||||||
|
elif `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=icc
|
||||||
|
echo " + using Intel C++ compiler"
|
||||||
|
|
||||||
|
elif `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=gcc
|
||||||
|
echo " + using GNU C compiler"
|
||||||
|
|
||||||
|
elif `$CC -v 2>&1 | grep 'clang version' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=clang
|
||||||
|
echo " + using Clang C compiler"
|
||||||
|
|
||||||
|
elif `$CC -v 2>&1 | grep 'LLVM version' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=clang
|
||||||
|
echo " + using Clang C compiler"
|
||||||
|
|
||||||
|
elif `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=sunc
|
||||||
|
echo " + using Sun C compiler"
|
||||||
|
|
||||||
|
elif `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=ccc
|
||||||
|
echo " + using Compaq C compiler"
|
||||||
|
|
||||||
|
elif `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then
|
||||||
|
NGX_CC_NAME=acc
|
||||||
|
echo " + using HP aC++ compiler"
|
||||||
|
|
||||||
|
else
|
||||||
|
NGX_CC_NAME=unknown
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,103 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# Open Watcom C 1.0, 1.2, 1.3
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
# maximize speed
|
||||||
|
CFLAGS="$CFLAGS -ot"
|
||||||
|
# reorder instructions for best pipeline usage
|
||||||
|
CFLAGS="$CFLAGS -op"
|
||||||
|
# inline intrinsic functions
|
||||||
|
CFLAGS="$CFLAGS -oi"
|
||||||
|
# inline expansion
|
||||||
|
CFLAGS="$CFLAGS -oe"
|
||||||
|
# disable stack checking calls
|
||||||
|
CFLAGS="$CFLAGS -s"
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium and Athlon
|
||||||
|
# register-based arguments passing conventions
|
||||||
|
CPU_OPT="-5r"
|
||||||
|
# stack-based arguments passing conventions
|
||||||
|
#CPU_OPT="-5s"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro)
|
||||||
|
# optimize for Pentium Pro, Pentium II and Pentium III
|
||||||
|
# register-based arguments passing conventions
|
||||||
|
CPU_OPT="-6r"
|
||||||
|
# stack-based arguments passing conventions
|
||||||
|
#CPU_OPT="-6s"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
|
||||||
|
# maximum level
|
||||||
|
CFLAGS="$CFLAGS -wx"
|
||||||
|
#CFLAGS="$CFLAGS -w3"
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -we"
|
||||||
|
|
||||||
|
# built target is NT
|
||||||
|
CFLAGS="$CFLAGS -bt=nt"
|
||||||
|
|
||||||
|
# multithreaded
|
||||||
|
CFLAGS="$CFLAGS -bm"
|
||||||
|
|
||||||
|
# debug
|
||||||
|
CFLAGS="$CFLAGS -d2"
|
||||||
|
|
||||||
|
# quiet
|
||||||
|
CFLAGS="$CFLAGS -zq"
|
||||||
|
|
||||||
|
# Open Watcom C 1.2
|
||||||
|
have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have
|
||||||
|
|
||||||
|
|
||||||
|
# the precompiled headers
|
||||||
|
#CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch"
|
||||||
|
#NGX_PCH="$NGX_OBJS/ngx_config.pch"
|
||||||
|
#NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch"
|
||||||
|
#NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch"
|
||||||
|
|
||||||
|
|
||||||
|
# the link flags, built target is NT GUI mode application
|
||||||
|
#CORE_LINK="$CORE_LINK -l=nt_win"
|
||||||
|
|
||||||
|
|
||||||
|
# the resource file
|
||||||
|
NGX_RCC="wrc \$(CORE_INCS) -fo=$NGX_OBJS/nginx.res "
|
||||||
|
NGX_RCC="$NGX_RCC $NGX_WIN32_RC $NGX_OBJS/nginx.exe"
|
||||||
|
|
||||||
|
|
||||||
|
ngx_include_opt="-i="
|
||||||
|
ngx_objout="-fo"
|
||||||
|
ngx_binout="-fe="
|
||||||
|
ngx_objext="obj"
|
||||||
|
|
||||||
|
ngx_regex_dirsep='\\'
|
||||||
|
ngx_dirsep="\\"
|
||||||
|
|
||||||
|
ngx_long_start=' '
|
||||||
|
ngx_long_end=' '
|
||||||
|
ngx_long_regex_cont=' \&\
|
||||||
|
'
|
||||||
|
ngx_long_cont=' &
|
||||||
|
'
|
||||||
|
|
||||||
|
ngx_regex_cont=' \&\
|
||||||
|
'
|
||||||
|
ngx_cont=' &
|
||||||
|
'
|
||||||
|
ngx_tab=' &
|
||||||
|
'
|
@ -0,0 +1,163 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
# Sun C 5.7 Patch 117837-04 2005/05/11 Sun Studio 10
|
||||||
|
# Sun C 5.8 2005/10/13 Sun Studio 11
|
||||||
|
# Sun C 5.9 SunOS_i386 2007/05/03 Sun Studio 12
|
||||||
|
# Sun C 5.9 SunOS_sparc 2007/05/03
|
||||||
|
# Sun C 5.10 SunOS_i386 2009/06/03 Sun Studio 12.1
|
||||||
|
# Sun C 5.11 SunOS_i386 2010/08/13 Oracle Solaris Studio 12.2
|
||||||
|
# Sun C 5.12 SunOS_i386 2011/11/16 Oracle Solaris Studio 12.3
|
||||||
|
# Sun C 5.13 SunOS_i386 2014/10/20 Oracle Solaris Studio 12.4
|
||||||
|
# Sun C 5.14 SunOS_i386 2016/05/31 Oracle Developer Studio 12.5
|
||||||
|
|
||||||
|
NGX_SUNC_VER=`$CC -V 2>&1 | grep 'Sun C' 2>&1 \
|
||||||
|
| sed -e 's/^.* Sun C \(.*\)/\1/'`
|
||||||
|
|
||||||
|
echo " + Sun C version: $NGX_SUNC_VER"
|
||||||
|
|
||||||
|
have=NGX_COMPILER value="\"Sun C $NGX_SUNC_VER\"" . auto/define
|
||||||
|
|
||||||
|
|
||||||
|
cat << END > $NGX_AUTOTEST.c
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
printf("%d", __SUNPRO_C);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"
|
||||||
|
|
||||||
|
if [ -x $NGX_AUTOTEST ]; then
|
||||||
|
ngx_sunc_ver=`$NGX_AUTOTEST`
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf $NGX_AUTOTEST*
|
||||||
|
|
||||||
|
# 1424 == 0x590, Sun Studio 12
|
||||||
|
|
||||||
|
if [ "$ngx_sunc_ver" -ge 1424 ]; then
|
||||||
|
ngx_sparc32="-m32"
|
||||||
|
ngx_sparc64="-m64"
|
||||||
|
ngx_amd64="-m64"
|
||||||
|
|
||||||
|
else
|
||||||
|
ngx_sparc32="-xarch=v8plus"
|
||||||
|
ngx_sparc64="-xarch=v9"
|
||||||
|
ngx_amd64="-xarch=amd64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$NGX_MACHINE" in
|
||||||
|
|
||||||
|
i86pc)
|
||||||
|
NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"
|
||||||
|
;;
|
||||||
|
|
||||||
|
sun4u | sun4v)
|
||||||
|
NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
MAIN_LINK=
|
||||||
|
MODULE_LINK="-G"
|
||||||
|
|
||||||
|
|
||||||
|
# optimizations
|
||||||
|
|
||||||
|
# 20736 == 0x5100, Sun Studio 12.1
|
||||||
|
|
||||||
|
if [ "$ngx_sunc_ver" -ge 20736 ]; then
|
||||||
|
ngx_fast="-fast"
|
||||||
|
|
||||||
|
else
|
||||||
|
# older versions had problems with bit-fields
|
||||||
|
ngx_fast="-fast -xalias_level=any"
|
||||||
|
fi
|
||||||
|
|
||||||
|
IPO=-xipo
|
||||||
|
CFLAGS="$CFLAGS $ngx_fast $IPO"
|
||||||
|
CORE_LINK="$CORE_LINK $ngx_fast $IPO"
|
||||||
|
|
||||||
|
|
||||||
|
case $CPU in
|
||||||
|
pentium)
|
||||||
|
# optimize for Pentium and Athlon
|
||||||
|
CPU_OPT="-xchip=pentium"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro)
|
||||||
|
# optimize for Pentium Pro, Pentium II
|
||||||
|
CPU_OPT="-xchip=pentium_pro"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentium3)
|
||||||
|
# optimize for Pentium III
|
||||||
|
CPU_OPT="-xchip=pentium3"
|
||||||
|
#CPU_OPT="$CPU_OPT -xarch=sse"
|
||||||
|
CPU_OPT="$CPU_OPT -xcache=16/32/4:256/32/4"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentium4)
|
||||||
|
# optimize for Pentium 4
|
||||||
|
CPU_OPT="-xchip=pentium4"
|
||||||
|
#CPU_OPT="$CPU_OPT -xarch=sse2"
|
||||||
|
CPU_OPT="$CPU_OPT -xcache=8/64/4:256/128/8"
|
||||||
|
;;
|
||||||
|
|
||||||
|
opteron)
|
||||||
|
# optimize for Opteron
|
||||||
|
CPU_OPT="-xchip=opteron"
|
||||||
|
#CPU_OPT="$CPU_OPT -xarch=sse2"
|
||||||
|
CPU_OPT="$CPU_OPT -xcache=64/64/2:1024/64/16"
|
||||||
|
;;
|
||||||
|
|
||||||
|
sparc32)
|
||||||
|
# build 32-bit UltraSparc binary
|
||||||
|
CPU_OPT="$ngx_sparc32"
|
||||||
|
CORE_LINK="$CORE_LINK $ngx_sparc32"
|
||||||
|
CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc32"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
sparc64)
|
||||||
|
# build 64-bit UltraSparc binary
|
||||||
|
CPU_OPT="$ngx_sparc64"
|
||||||
|
CORE_LINK="$CORE_LINK $ngx_sparc64"
|
||||||
|
CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc64"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
amd64)
|
||||||
|
# build 64-bit amd64 binary
|
||||||
|
CPU_OPT="$ngx_amd64"
|
||||||
|
CORE_LINK="$CORE_LINK $ngx_amd64"
|
||||||
|
CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_amd64"
|
||||||
|
NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"
|
||||||
|
NGX_CPU_CACHE_LINE=64
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS $CPU_OPT"
|
||||||
|
|
||||||
|
|
||||||
|
if [ ".$PCRE_OPT" = "." ]; then
|
||||||
|
PCRE_OPT="$ngx_fast $IPO $CPU_OPT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ".$ZLIB_OPT" = "." ]; then
|
||||||
|
ZLIB_OPT="$ngx_fast $IPO $CPU_OPT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# stop on warning
|
||||||
|
CFLAGS="$CFLAGS -errwarn=%all"
|
||||||
|
|
||||||
|
# debug
|
||||||
|
CFLAGS="$CFLAGS -g"
|
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTO_CONFIG_H
|
||||||
|
|
||||||
|
#ifndef $have
|
||||||
|
#define $have $value
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END
|
@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
echo $ngx_n "checking for system byte ordering ...$ngx_c"
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTOCONF_ERR
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
checking for system byte ordering
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
cat << END > $NGX_AUTOTEST.c
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int i = 0x11223344;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
p = (char *) &i;
|
||||||
|
if (*p == 0x44) return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
|
||||||
|
-o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
|
||||||
|
|
||||||
|
eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
|
||||||
|
|
||||||
|
if [ -x $NGX_AUTOTEST ]; then
|
||||||
|
if $NGX_AUTOTEST >/dev/null 2>&1; then
|
||||||
|
echo " little endian"
|
||||||
|
have=NGX_HAVE_LITTLE_ENDIAN . auto/have
|
||||||
|
else
|
||||||
|
echo " big endian"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf $NGX_AUTOTEST*
|
||||||
|
|
||||||
|
else
|
||||||
|
rm -rf $NGX_AUTOTEST*
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "$0: error: cannot detect system byte ordering"
|
||||||
|
exit 1
|
||||||
|
fi
|
@ -0,0 +1,123 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
echo $ngx_n "checking for $ngx_feature ...$ngx_c"
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTOCONF_ERR
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
checking for $ngx_feature
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
ngx_found=no
|
||||||
|
|
||||||
|
if test -n "$ngx_feature_name"; then
|
||||||
|
ngx_have_feature=`echo $ngx_feature_name \
|
||||||
|
| tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$ngx_feature_path"; then
|
||||||
|
for ngx_temp in $ngx_feature_path; do
|
||||||
|
ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << END > $NGX_AUTOTEST.c
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
$NGX_INCLUDE_UNISTD_H
|
||||||
|
$ngx_feature_incs
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
$ngx_feature_test;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \
|
||||||
|
-o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"
|
||||||
|
|
||||||
|
ngx_feature_inc_path=
|
||||||
|
|
||||||
|
eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"
|
||||||
|
|
||||||
|
|
||||||
|
if [ -x $NGX_AUTOTEST ]; then
|
||||||
|
|
||||||
|
case "$ngx_feature_run" in
|
||||||
|
|
||||||
|
yes)
|
||||||
|
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
|
||||||
|
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
|
||||||
|
echo " found"
|
||||||
|
ngx_found=yes
|
||||||
|
|
||||||
|
if test -n "$ngx_feature_name"; then
|
||||||
|
have=$ngx_have_feature . auto/have
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo " found but is not working"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
value)
|
||||||
|
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
|
||||||
|
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
|
||||||
|
echo " found"
|
||||||
|
ngx_found=yes
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTO_CONFIG_H
|
||||||
|
|
||||||
|
#ifndef $ngx_feature_name
|
||||||
|
#define $ngx_feature_name `$NGX_AUTOTEST`
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END
|
||||||
|
else
|
||||||
|
echo " found but is not working"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
bug)
|
||||||
|
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
|
||||||
|
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
|
||||||
|
echo " not found"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo " found"
|
||||||
|
ngx_found=yes
|
||||||
|
|
||||||
|
if test -n "$ngx_feature_name"; then
|
||||||
|
have=$ngx_have_feature . auto/have
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo " found"
|
||||||
|
ngx_found=yes
|
||||||
|
|
||||||
|
if test -n "$ngx_feature_name"; then
|
||||||
|
have=$ngx_have_feature . auto/have
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
else
|
||||||
|
echo " not found"
|
||||||
|
|
||||||
|
echo "----------" >> $NGX_AUTOCONF_ERR
|
||||||
|
cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
|
||||||
|
echo "----------" >> $NGX_AUTOCONF_ERR
|
||||||
|
echo $ngx_test >> $NGX_AUTOCONF_ERR
|
||||||
|
echo "----------" >> $NGX_AUTOCONF_ERR
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf $NGX_AUTOTEST*
|
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTO_CONFIG_H
|
||||||
|
|
||||||
|
#ifndef $have
|
||||||
|
#define $have 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END
|
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTO_HEADERS_H
|
||||||
|
|
||||||
|
#ifndef $have
|
||||||
|
#define $have 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END
|
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
ngx_include="unistd.h"; . auto/include
|
||||||
|
ngx_include="inttypes.h"; . auto/include
|
||||||
|
ngx_include="limits.h"; . auto/include
|
||||||
|
ngx_include="sys/filio.h"; . auto/include
|
||||||
|
ngx_include="sys/param.h"; . auto/include
|
||||||
|
ngx_include="sys/mount.h"; . auto/include
|
||||||
|
ngx_include="sys/statvfs.h"; . auto/include
|
||||||
|
ngx_include="crypt.h"; . auto/include
|
@ -0,0 +1,58 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
echo $ngx_n "checking for $ngx_include ...$ngx_c"
|
||||||
|
|
||||||
|
cat << END >> $NGX_AUTOCONF_ERR
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
checking for $ngx_include
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
ngx_found=no
|
||||||
|
|
||||||
|
cat << END > $NGX_AUTOTEST.c
|
||||||
|
|
||||||
|
$NGX_INCLUDE_SYS_PARAM_H
|
||||||
|
#include <$ngx_include>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"
|
||||||
|
|
||||||
|
eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
|
||||||
|
|
||||||
|
if [ -x $NGX_AUTOTEST ]; then
|
||||||
|
|
||||||
|
ngx_found=yes
|
||||||
|
|
||||||
|
echo " found"
|
||||||
|
|
||||||
|
ngx_name=`echo $ngx_include \
|
||||||
|
| tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`
|
||||||
|
|
||||||
|
|
||||||
|
have=NGX_HAVE_$ngx_name . auto/have_headers
|
||||||
|
|
||||||
|
eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo " not found"
|
||||||
|
|
||||||
|
echo "----------" >> $NGX_AUTOCONF_ERR
|
||||||
|
cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
|
||||||
|
echo "----------" >> $NGX_AUTOCONF_ERR
|
||||||
|
echo $ngx_test >> $NGX_AUTOCONF_ERR
|
||||||
|
echo "----------" >> $NGX_AUTOCONF_ERR
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf $NGX_AUTOTEST*
|
@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
NGX_MAKEFILE=$NGX_OBJS/Makefile
|
||||||
|
NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
|
||||||
|
|
||||||
|
NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
|
||||||
|
NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h
|
||||||
|
|
||||||
|
NGX_AUTOTEST=$NGX_OBJS/autotest
|
||||||
|
NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
|
||||||
|
|
||||||
|
# STUBs
|
||||||
|
NGX_ERR=$NGX_OBJS/autoconf.err
|
||||||
|
MAKEFILE=$NGX_OBJS/Makefile
|
||||||
|
|
||||||
|
|
||||||
|
NGX_PCH=
|
||||||
|
NGX_USE_PCH=
|
||||||
|
|
||||||
|
|
||||||
|
# check the echo's "-n" option and "\c" capability
|
||||||
|
|
||||||
|
if echo "test\c" | grep c >/dev/null; then
|
||||||
|
|
||||||
|
if echo -n test | grep n >/dev/null; then
|
||||||
|
ngx_n=
|
||||||
|
ngx_c=
|
||||||
|
|
||||||
|
else
|
||||||
|
ngx_n=-n
|
||||||
|
ngx_c=
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
ngx_n=
|
||||||
|
ngx_c='\c'
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# create Makefile
|
||||||
|
|
||||||
|
cat << END > Makefile
|
||||||
|
|
||||||
|
default: build
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf Makefile $NGX_OBJS
|
||||||
|
|
||||||
|
.PHONY: default clean
|
||||||
|
END
|
@ -0,0 +1,220 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $USE_PERL != NO ]; then
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
install_perl_modules:
|
||||||
|
cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install
|
||||||
|
END
|
||||||
|
|
||||||
|
NGX_INSTALL_PERL_MODULES=install_perl_modules
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
case ".$NGX_SBIN_PATH" in
|
||||||
|
./*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
case ".$NGX_MODULES_PATH" in
|
||||||
|
./*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.`
|
||||||
|
|
||||||
|
|
||||||
|
case ".$NGX_CONF_PATH" in
|
||||||
|
./*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`
|
||||||
|
|
||||||
|
|
||||||
|
case ".$NGX_PID_PATH" in
|
||||||
|
./*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_PID_PATH=$NGX_PREFIX/$NGX_PID_PATH
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
case ".$NGX_ERROR_LOG_PATH" in
|
||||||
|
./* | .)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_ERROR_LOG_PATH=$NGX_PREFIX/$NGX_ERROR_LOG_PATH
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
case ".$NGX_HTTP_LOG_PATH" in
|
||||||
|
./*)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
NGX_HTTP_LOG_PATH=$NGX_PREFIX/$NGX_HTTP_LOG_PATH
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
if test -f man/nginx.8 ; then
|
||||||
|
NGX_MAN=man/nginx.8
|
||||||
|
else
|
||||||
|
NGX_MAN=docs/man/nginx.8
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -d html ; then
|
||||||
|
NGX_HTML=html
|
||||||
|
else
|
||||||
|
NGX_HTML=docs/html
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
manpage: $NGX_OBJS/nginx.8
|
||||||
|
|
||||||
|
$NGX_OBJS/nginx.8: $NGX_MAN $NGX_AUTO_CONFIG_H
|
||||||
|
sed -e "s|%%PREFIX%%|$NGX_PREFIX|" \\
|
||||||
|
-e "s|%%PID_PATH%%|$NGX_PID_PATH|" \\
|
||||||
|
-e "s|%%CONF_PATH%%|$NGX_CONF_PATH|" \\
|
||||||
|
-e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\
|
||||||
|
< $NGX_MAN > \$@
|
||||||
|
|
||||||
|
install: build $NGX_INSTALL_PERL_MODULES
|
||||||
|
test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX'
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\
|
||||||
|
|| mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`'
|
||||||
|
test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\
|
||||||
|
|| mv '\$(DESTDIR)$NGX_SBIN_PATH' \\
|
||||||
|
'\$(DESTDIR)$NGX_SBIN_PATH.old'
|
||||||
|
cp $NGX_OBJS/nginx$ngx_binext '\$(DESTDIR)$NGX_SBIN_PATH'
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\
|
||||||
|
|| mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
|
||||||
|
cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
|
||||||
|
test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\
|
||||||
|
|| cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default'
|
||||||
|
|
||||||
|
test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\
|
||||||
|
|| cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/fastcgi_params \\
|
||||||
|
'\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default'
|
||||||
|
|
||||||
|
test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\
|
||||||
|
|| cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default'
|
||||||
|
|
||||||
|
test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\
|
||||||
|
|| cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/uwsgi_params \\
|
||||||
|
'\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default'
|
||||||
|
|
||||||
|
test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\
|
||||||
|
|| cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX'
|
||||||
|
cp conf/scgi_params \\
|
||||||
|
'\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default'
|
||||||
|
|
||||||
|
test -f '\$(DESTDIR)$NGX_CONF_PATH' \\
|
||||||
|
|| cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH'
|
||||||
|
cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default'
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\
|
||||||
|
|| mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`'
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\
|
||||||
|
|| mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`'
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)$NGX_PREFIX/html' \\
|
||||||
|
|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
if test -n "$NGX_ERROR_LOG_PATH"; then
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\
|
||||||
|
|| mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`'
|
||||||
|
END
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test -n "$DYNAMIC_MODULES"; then
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\
|
||||||
|
|| mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH'
|
||||||
|
END
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
for ngx_module in $DYNAMIC_MODULES
|
||||||
|
do
|
||||||
|
ngx_module=$ngx_module$ngx_modext
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\
|
||||||
|
|| mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\
|
||||||
|
'\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old'
|
||||||
|
cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module'
|
||||||
|
END
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# create Makefile
|
||||||
|
|
||||||
|
cat << END >> Makefile
|
||||||
|
|
||||||
|
build:
|
||||||
|
\$(MAKE) -f $NGX_MAKEFILE
|
||||||
|
|
||||||
|
install:
|
||||||
|
\$(MAKE) -f $NGX_MAKEFILE install
|
||||||
|
|
||||||
|
modules:
|
||||||
|
\$(MAKE) -f $NGX_MAKEFILE modules
|
||||||
|
|
||||||
|
upgrade:
|
||||||
|
$NGX_SBIN_PATH -t
|
||||||
|
|
||||||
|
kill -USR2 \`cat $NGX_PID_PATH\`
|
||||||
|
sleep 1
|
||||||
|
test -f $NGX_PID_PATH.oldbin
|
||||||
|
|
||||||
|
kill -QUIT \`cat $NGX_PID_PATH.oldbin\`
|
||||||
|
|
||||||
|
.PHONY: build install modules upgrade
|
||||||
|
END
|
@ -0,0 +1,54 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $USE_PCRE = YES -o $PCRE != NONE ]; then
|
||||||
|
. auto/lib/pcre/conf
|
||||||
|
|
||||||
|
else
|
||||||
|
if [ $USE_PCRE = DISABLED -a $HTTP = YES -a $HTTP_REWRITE = YES ]; then
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the HTTP rewrite module requires the PCRE library.
|
||||||
|
You can either disable the module by using --without-http_rewrite_module
|
||||||
|
option or you have to enable the PCRE support.
|
||||||
|
|
||||||
|
END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $USE_OPENSSL = YES ]; then
|
||||||
|
. auto/lib/openssl/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_ZLIB = YES ]; then
|
||||||
|
. auto/lib/zlib/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_LIBXSLT != NO ]; then
|
||||||
|
. auto/lib/libxslt/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_LIBGD != NO ]; then
|
||||||
|
. auto/lib/libgd/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_PERL != NO ]; then
|
||||||
|
. auto/lib/perl/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_GEOIP != NO ]; then
|
||||||
|
. auto/lib/geoip/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then
|
||||||
|
. auto/lib/google-perftools/conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $NGX_LIBATOMIC != NO ]; then
|
||||||
|
. auto/lib/libatomic/conf
|
||||||
|
fi
|
@ -0,0 +1,114 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="GeoIP library"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <GeoIP.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lGeoIP"
|
||||||
|
ngx_feature_test="GeoIP_open(NULL, 0)"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="GeoIP library in /usr/local/"
|
||||||
|
ngx_feature_path="/usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lGeoIP"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lGeoIP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# NetBSD port
|
||||||
|
|
||||||
|
ngx_feature="GeoIP library in /usr/pkg/"
|
||||||
|
ngx_feature_path="/usr/pkg/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lGeoIP"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/pkg/lib -lGeoIP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="GeoIP library in /opt/local/"
|
||||||
|
ngx_feature_path="/opt/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lGeoIP"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lGeoIP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# Homebrew on Apple Silicon
|
||||||
|
|
||||||
|
ngx_feature="GeoIP library in /opt/homebrew/"
|
||||||
|
ngx_feature_path="/opt/homebrew/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lGeoIP"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/homebrew/lib -lGeoIP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
|
||||||
|
CORE_INCS="$CORE_INCS $ngx_feature_path"
|
||||||
|
|
||||||
|
if [ $USE_GEOIP = YES ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NGX_LIB_GEOIP=$ngx_feature_libs
|
||||||
|
|
||||||
|
ngx_feature="GeoIP IPv6 support"
|
||||||
|
ngx_feature_name="NGX_HAVE_GEOIP_V6"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <stdio.h>
|
||||||
|
#include <GeoIP.h>"
|
||||||
|
#ngx_feature_path=
|
||||||
|
#ngx_feature_libs=
|
||||||
|
ngx_feature_test="printf(\"%d\", GEOIP_CITY_EDITION_REV0_V6);"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the GeoIP module requires the GeoIP library.
|
||||||
|
You can either do not enable the module or install the library.
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="Google perftools"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs=
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lprofiler"
|
||||||
|
ngx_feature_test="void ProfilerStop(void);
|
||||||
|
ProfilerStop()"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="Google perftools in /usr/local/"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lprofiler"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lprofiler"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="Google perftools in /opt/local/"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lprofiler"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lprofiler"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# Homebrew on Apple Silicon
|
||||||
|
|
||||||
|
ngx_feature="Google perftools in /opt/homebrew/"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lprofiler"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/homebrew/lib -lprofiler"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the Google perftools module requires the Google perftools
|
||||||
|
library. You can either do not enable the module or install the library.
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $NGX_LIBATOMIC != YES ]; then
|
||||||
|
|
||||||
|
have=NGX_HAVE_LIBATOMIC . auto/have
|
||||||
|
CORE_INCS="$CORE_INCS $NGX_LIBATOMIC/src"
|
||||||
|
LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/src/libatomic_ops.a"
|
||||||
|
CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/src/libatomic_ops.a"
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
ngx_feature="atomic_ops library"
|
||||||
|
ngx_feature_name=NGX_HAVE_LIBATOMIC
|
||||||
|
ngx_feature_run=yes
|
||||||
|
ngx_feature_incs="#define AO_REQUIRE_CAS
|
||||||
|
#include <atomic_ops.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-latomic_ops"
|
||||||
|
ngx_feature_test="long n = 0;
|
||||||
|
if (!AO_compare_and_swap(&n, 0, 1))
|
||||||
|
return 1;
|
||||||
|
if (AO_fetch_and_add(&n, 1) != 1)
|
||||||
|
return 1;
|
||||||
|
if (n != 2)
|
||||||
|
return 1;
|
||||||
|
AO_nop();"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: libatomic_ops library was not found.
|
||||||
|
|
||||||
|
END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$NGX_LIBATOMIC/src/libatomic_ops.a: $NGX_LIBATOMIC/Makefile
|
||||||
|
cd $NGX_LIBATOMIC && \$(MAKE)
|
||||||
|
|
||||||
|
$NGX_LIBATOMIC/Makefile: $NGX_MAKEFILE
|
||||||
|
cd $NGX_LIBATOMIC \\
|
||||||
|
&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
|
||||||
|
&& ./configure
|
||||||
|
|
||||||
|
END
|
@ -0,0 +1,112 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="GD library"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <gd.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lgd"
|
||||||
|
ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL);
|
||||||
|
(void) img"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="GD library in /usr/local/"
|
||||||
|
ngx_feature_path="/usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lgd"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lgd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# NetBSD port
|
||||||
|
|
||||||
|
ngx_feature="GD library in /usr/pkg/"
|
||||||
|
ngx_feature_path="/usr/pkg/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lgd"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/pkg/lib -lgd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="GD library in /opt/local/"
|
||||||
|
ngx_feature_path="/opt/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lgd"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lgd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# Homebrew on Apple Silicon
|
||||||
|
|
||||||
|
ngx_feature="GD library in /opt/homebrew/"
|
||||||
|
ngx_feature_path="/opt/homebrew/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lgd"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/homebrew/lib -lgd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
|
||||||
|
CORE_INCS="$CORE_INCS $ngx_feature_path"
|
||||||
|
|
||||||
|
if [ $USE_LIBGD = YES ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NGX_LIB_LIBGD=$ngx_feature_libs
|
||||||
|
|
||||||
|
ngx_feature="GD WebP support"
|
||||||
|
ngx_feature_name="NGX_HAVE_GD_WEBP"
|
||||||
|
ngx_feature_test="gdImagePtr img = gdImageCreateFromWebpPtr(1, NULL);
|
||||||
|
(void) img"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the HTTP image filter module requires the GD library.
|
||||||
|
You can either do not enable the module or install the libraries.
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,165 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="libxslt"
|
||||||
|
ngx_feature_name=
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <libxml/parser.h>
|
||||||
|
#include <libxml/tree.h>
|
||||||
|
#include <libxslt/xslt.h>
|
||||||
|
#include <libxslt/xsltInternals.h>
|
||||||
|
#include <libxslt/transform.h>
|
||||||
|
#include <libxslt/xsltutils.h>"
|
||||||
|
ngx_feature_path="/usr/include/libxml2"
|
||||||
|
ngx_feature_libs="-lxml2 -lxslt"
|
||||||
|
ngx_feature_test="xmlParserCtxtPtr ctxt = NULL;
|
||||||
|
xsltStylesheetPtr sheet = NULL;
|
||||||
|
xmlDocPtr doc = NULL;
|
||||||
|
xmlParseChunk(ctxt, NULL, 0, 0);
|
||||||
|
xsltApplyStylesheet(sheet, doc, NULL);"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="libxslt in /usr/local/"
|
||||||
|
ngx_feature_path="/usr/local/include/libxml2 /usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lxml2 -lxslt"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lxml2 -lxslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# NetBSD port
|
||||||
|
|
||||||
|
ngx_feature="libxslt in /usr/pkg/"
|
||||||
|
ngx_feature_path="/usr/pkg/include/libxml2 /usr/pkg/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lxml2 -lxslt"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/pkg/lib -lxml2 -lxslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="libxslt in /opt/local/"
|
||||||
|
ngx_feature_path="/opt/local/include/libxml2 /opt/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lxml2 -lxslt"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lxml2 -lxslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
|
||||||
|
CORE_INCS="$CORE_INCS $ngx_feature_path"
|
||||||
|
|
||||||
|
if [ $USE_LIBXSLT = YES ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NGX_LIB_LIBXSLT=$ngx_feature_libs
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the HTTP XSLT module requires the libxml2/libxslt
|
||||||
|
libraries. You can either do not enable the module or install the libraries.
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="libexslt"
|
||||||
|
ngx_feature_name=NGX_HAVE_EXSLT
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <libexslt/exslt.h>"
|
||||||
|
ngx_feature_path="/usr/include/libxml2"
|
||||||
|
ngx_feature_libs="-lexslt"
|
||||||
|
ngx_feature_test="exsltRegisterAll();"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="libexslt in /usr/local/"
|
||||||
|
ngx_feature_path="/usr/local/include/libxml2 /usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lexslt"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lexslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# NetBSD port
|
||||||
|
|
||||||
|
ngx_feature="libexslt in /usr/pkg/"
|
||||||
|
ngx_feature_path="/usr/pkg/include/libxml2 /usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lexslt"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/pkg/lib -lexslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="libexslt in /opt/local/"
|
||||||
|
ngx_feature_path="/opt/local/include/libxml2 /opt/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lexslt"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lexslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
if [ $USE_LIBXSLT = YES ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS -lexslt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NGX_LIB_LIBXSLT="$NGX_LIB_LIBXSLT -lexslt"
|
||||||
|
fi
|
@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then
|
||||||
|
. auto/lib/pcre/make
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then
|
||||||
|
. auto/lib/openssl/make
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then
|
||||||
|
. auto/lib/zlib/make
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then
|
||||||
|
. auto/lib/libatomic/make
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_PERL != NO ]; then
|
||||||
|
. auto/lib/perl/make
|
||||||
|
fi
|
@ -0,0 +1,193 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $OPENSSL != NONE ]; then
|
||||||
|
|
||||||
|
have=NGX_OPENSSL . auto/have
|
||||||
|
have=NGX_SSL . auto/have
|
||||||
|
|
||||||
|
have=NGX_OPENSSL_NO_CONFIG . auto/have
|
||||||
|
|
||||||
|
if [ $USE_OPENSSL_QUIC = YES ]; then
|
||||||
|
have=NGX_QUIC . auto/have
|
||||||
|
have=NGX_QUIC_OPENSSL_COMPAT . auto/have
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$CC" in
|
||||||
|
|
||||||
|
cl | bcc32)
|
||||||
|
CFLAGS="$CFLAGS -DNO_SYS_TYPES_H"
|
||||||
|
|
||||||
|
CORE_INCS="$CORE_INCS $OPENSSL/openssl/include"
|
||||||
|
CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h"
|
||||||
|
|
||||||
|
if [ -f $OPENSSL/ms/do_ms.bat ]; then
|
||||||
|
# before OpenSSL 1.1.0
|
||||||
|
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib"
|
||||||
|
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib"
|
||||||
|
else
|
||||||
|
# OpenSSL 1.1.0+
|
||||||
|
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libssl.lib"
|
||||||
|
CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libcrypto.lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# libeay32.lib requires gdi32.lib
|
||||||
|
CORE_LIBS="$CORE_LIBS gdi32.lib"
|
||||||
|
# OpenSSL 1.0.0 requires crypt32.lib
|
||||||
|
CORE_LIBS="$CORE_LIBS crypt32.lib"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
|
||||||
|
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
|
||||||
|
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
|
||||||
|
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
|
||||||
|
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
|
||||||
|
CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD"
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" = win32 ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" != win32 ]; then
|
||||||
|
|
||||||
|
OPENSSL=NO
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL library"
|
||||||
|
ngx_feature_name="NGX_OPENSSL"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <openssl/ssl.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL $NGX_LIBPTHREAD"
|
||||||
|
ngx_feature_test="SSL_CTX_set_options(NULL, 0)"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL library in /usr/local/"
|
||||||
|
ngx_feature_path="/usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# NetBSD port
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL library in /usr/pkg/"
|
||||||
|
ngx_feature_path="/usr/pkg/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL library in /opt/local/"
|
||||||
|
ngx_feature_path="/opt/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# Homebrew on Apple Silicon
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL library in /opt/homebrew/"
|
||||||
|
ngx_feature_path="/opt/homebrew/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lssl -lcrypto"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/homebrew/lib -lssl -lcrypto"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
have=NGX_SSL . auto/have
|
||||||
|
CORE_INCS="$CORE_INCS $ngx_feature_path"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
OPENSSL=YES
|
||||||
|
|
||||||
|
if [ $USE_OPENSSL_QUIC = YES ]; then
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL QUIC support"
|
||||||
|
ngx_feature_name="NGX_QUIC"
|
||||||
|
ngx_feature_test="SSL_set_quic_method(NULL, NULL)"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
have=NGX_QUIC_OPENSSL_COMPAT . auto/have
|
||||||
|
|
||||||
|
ngx_feature="OpenSSL QUIC compatibility"
|
||||||
|
ngx_feature_test="SSL_CTX_add_custom_ext(NULL, 0, 0,
|
||||||
|
NULL, NULL, NULL, NULL, NULL)"
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: certain modules require OpenSSL QUIC support.
|
||||||
|
You can either do not enable the modules, or install the OpenSSL library with
|
||||||
|
QUIC support into the system, or build the OpenSSL library with QUIC support
|
||||||
|
statically from the source with nginx by using --with-openssl=<path> option.
|
||||||
|
|
||||||
|
END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $OPENSSL != YES ]; then
|
||||||
|
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: SSL modules require the OpenSSL library.
|
||||||
|
You can either do not enable the modules, or install the OpenSSL library
|
||||||
|
into the system, or build the OpenSSL library statically from the source
|
||||||
|
with nginx by using --with-openssl=<path> option.
|
||||||
|
|
||||||
|
END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,75 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
case "$CC" in
|
||||||
|
|
||||||
|
cl)
|
||||||
|
|
||||||
|
case "$NGX_MACHINE" in
|
||||||
|
|
||||||
|
amd64)
|
||||||
|
OPENSSL_TARGET=VC-WIN64A
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
OPENSSL_TARGET=VC-WIN32
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$OPENSSL/openssl/include/openssl/ssl.h: $NGX_MAKEFILE
|
||||||
|
\$(MAKE) -f auto/lib/openssl/makefile.msvc \
|
||||||
|
OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT" \
|
||||||
|
OPENSSL_TARGET="$OPENSSL_TARGET"
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
bcc32)
|
||||||
|
|
||||||
|
ngx_opt=`echo "-DOPENSSL=\"$OPENSSL\" -DOPENSSL_OPT=\"$OPENSSL_OPT\"" \
|
||||||
|
| sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
`echo "$OPENSSL\\openssl\\lib\\libeay32.lib: \
|
||||||
|
$OPENSSL\\openssl\\include\\openssl\\ssl.h" \
|
||||||
|
| sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
|
||||||
|
`echo "$OPENSSL\\openssl\\lib\\ssleay32.lib: \
|
||||||
|
$OPENSSL\\openssl\\include\\openssl\\ssl.h" \
|
||||||
|
| sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
|
||||||
|
`echo "$OPENSSL\\openssl\\include\\openssl\\ssl.h: $NGX_MAKEFILE" \
|
||||||
|
| sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
\$(MAKE) -f auto/lib/openssl/makefile.bcc $ngx_opt
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
case $OPENSSL in
|
||||||
|
/*) ngx_prefix="$OPENSSL/.openssl" ;;
|
||||||
|
*) ngx_prefix="$PWD/$OPENSSL/.openssl" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$OPENSSL/.openssl/include/openssl/ssl.h: $NGX_MAKEFILE
|
||||||
|
cd $OPENSSL \\
|
||||||
|
&& if [ -f Makefile ]; then \$(MAKE) clean; fi \\
|
||||||
|
&& ./config --prefix=$ngx_prefix no-shared no-threads $OPENSSL_OPT \\
|
||||||
|
&& \$(MAKE) \\
|
||||||
|
&& \$(MAKE) install_sw LIBDIR=lib
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
all:
|
||||||
|
cd $(OPENSSL)
|
||||||
|
|
||||||
|
perl Configure BC-32 no-shared --prefix=openssl $(OPENSSL_OPT)
|
||||||
|
|
||||||
|
ms\do_nasm
|
||||||
|
|
||||||
|
$(MAKE) -f ms\bcb.mak
|
||||||
|
$(MAKE) -f ms\bcb.mak install
|
||||||
|
|
||||||
|
# Borland's make does not expand "[ch]" in
|
||||||
|
# copy "inc32\openssl\*.[ch]" "openssl\include\openssl"
|
||||||
|
copy inc32\openssl\*.h openssl\include\openssl
|
@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
all:
|
||||||
|
cd $(OPENSSL)
|
||||||
|
|
||||||
|
perl Configure $(OPENSSL_TARGET) no-shared no-threads \
|
||||||
|
--prefix="%cd%/openssl" \
|
||||||
|
--openssldir="%cd%/openssl/ssl" \
|
||||||
|
$(OPENSSL_OPT)
|
||||||
|
|
||||||
|
if exist ms\do_ms.bat ( \
|
||||||
|
ms\do_ms \
|
||||||
|
&& $(MAKE) -f ms\nt.mak \
|
||||||
|
&& $(MAKE) -f ms\nt.mak install \
|
||||||
|
) else ( \
|
||||||
|
$(MAKE) \
|
||||||
|
&& $(MAKE) install_sw \
|
||||||
|
)
|
@ -0,0 +1,235 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $PCRE != NONE ]; then
|
||||||
|
|
||||||
|
if [ -f $PCRE/src/pcre2.h.generic ]; then
|
||||||
|
|
||||||
|
PCRE_LIBRARY=PCRE2
|
||||||
|
|
||||||
|
have=NGX_PCRE . auto/have
|
||||||
|
have=NGX_PCRE2 . auto/have
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" = win32 ]; then
|
||||||
|
have=PCRE2_STATIC . auto/have
|
||||||
|
fi
|
||||||
|
|
||||||
|
CORE_INCS="$CORE_INCS $PCRE/src/"
|
||||||
|
CORE_DEPS="$CORE_DEPS $PCRE/src/pcre2.h"
|
||||||
|
|
||||||
|
case "$NGX_CC_NAME" in
|
||||||
|
|
||||||
|
msvc)
|
||||||
|
LINK_DEPS="$LINK_DEPS $PCRE/src/pcre2-8.lib"
|
||||||
|
CORE_LIBS="$CORE_LIBS $PCRE/src/pcre2-8.lib"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre2-8.a"
|
||||||
|
CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre2-8.a"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
PCRE_LIBRARY=PCRE
|
||||||
|
|
||||||
|
have=NGX_PCRE . auto/have
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" = win32 ]; then
|
||||||
|
have=PCRE_STATIC . auto/have
|
||||||
|
fi
|
||||||
|
|
||||||
|
CORE_INCS="$CORE_INCS $PCRE"
|
||||||
|
CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
|
||||||
|
|
||||||
|
case "$NGX_CC_NAME" in
|
||||||
|
|
||||||
|
msvc | owc | bcc)
|
||||||
|
LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"
|
||||||
|
CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"
|
||||||
|
CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PCRE_JIT = YES ]; then
|
||||||
|
have=NGX_HAVE_PCRE_JIT . auto/have
|
||||||
|
PCRE_CONF_OPT="$PCRE_CONF_OPT --enable-jit"
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" != win32 ]; then
|
||||||
|
PCRE=NO
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PCRE = NO -a $PCRE2 != DISABLED ]; then
|
||||||
|
|
||||||
|
ngx_feature="PCRE2 library"
|
||||||
|
ngx_feature_name="NGX_PCRE2"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#define PCRE2_CODE_UNIT_WIDTH 8
|
||||||
|
#include <pcre2.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lpcre2-8"
|
||||||
|
ngx_feature_test="pcre2_code *re;
|
||||||
|
re = pcre2_compile(NULL, 0, 0, NULL, NULL, NULL);
|
||||||
|
if (re == NULL) return 1"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# pcre2-config
|
||||||
|
|
||||||
|
ngx_pcre2_prefix=`pcre2-config --prefix 2>/dev/null`
|
||||||
|
|
||||||
|
if [ -n "$ngx_pcre2_prefix" ]; then
|
||||||
|
ngx_feature="PCRE2 library in $ngx_pcre2_prefix"
|
||||||
|
ngx_feature_path=`pcre2-config --cflags \
|
||||||
|
| sed -n -e 's/.*-I *\([^ ][^ ]*\).*/\1/p'`
|
||||||
|
ngx_feature_libs=`pcre2-config --libs8`
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
have=NGX_PCRE . auto/have
|
||||||
|
CORE_INCS="$CORE_INCS $ngx_feature_path"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
PCRE=YES
|
||||||
|
PCRE_LIBRARY=PCRE2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PCRE = NO ]; then
|
||||||
|
|
||||||
|
ngx_feature="PCRE library"
|
||||||
|
ngx_feature_name="NGX_PCRE"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <pcre.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lpcre"
|
||||||
|
ngx_feature_test="pcre *re;
|
||||||
|
re = pcre_compile(NULL, 0, NULL, 0, NULL);
|
||||||
|
if (re == NULL) return 1"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# FreeBSD port
|
||||||
|
|
||||||
|
ngx_feature="PCRE library in /usr/local/"
|
||||||
|
ngx_feature_path="/usr/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpcre"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/local/lib -lpcre"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# RedHat RPM, Solaris package
|
||||||
|
|
||||||
|
ngx_feature="PCRE library in /usr/include/pcre/"
|
||||||
|
ngx_feature_path="/usr/include/pcre"
|
||||||
|
ngx_feature_libs="-lpcre"
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# NetBSD port
|
||||||
|
|
||||||
|
ngx_feature="PCRE library in /usr/pkg/"
|
||||||
|
ngx_feature_path="/usr/pkg/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpcre"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/usr/pkg/lib -lpcre"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# MacPorts
|
||||||
|
|
||||||
|
ngx_feature="PCRE library in /opt/local/"
|
||||||
|
ngx_feature_path="/opt/local/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpcre"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/local/lib -lpcre"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = no ]; then
|
||||||
|
|
||||||
|
# Homebrew on Apple Silicon
|
||||||
|
|
||||||
|
ngx_feature="PCRE library in /opt/homebrew/"
|
||||||
|
ngx_feature_path="/opt/homebrew/include"
|
||||||
|
|
||||||
|
if [ $NGX_RPATH = YES ]; then
|
||||||
|
ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lpcre"
|
||||||
|
else
|
||||||
|
ngx_feature_libs="-L/opt/homebrew/lib -lpcre"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. auto/feature
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
CORE_INCS="$CORE_INCS $ngx_feature_path"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
PCRE=YES
|
||||||
|
PCRE_LIBRARY=PCRE
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PCRE = YES ]; then
|
||||||
|
ngx_feature="PCRE JIT support"
|
||||||
|
ngx_feature_name="NGX_HAVE_PCRE_JIT"
|
||||||
|
ngx_feature_test="int jit = 0;
|
||||||
|
pcre_free_study(NULL);
|
||||||
|
pcre_config(PCRE_CONFIG_JIT, &jit);
|
||||||
|
if (jit != 1) return 1;"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
PCRE_JIT=YES
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $PCRE != YES ]; then
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the HTTP rewrite module requires the PCRE library.
|
||||||
|
You can either disable the module by using --without-http_rewrite_module
|
||||||
|
option, or install the PCRE library into the system, or build the PCRE library
|
||||||
|
statically from the source with nginx by using --with-pcre=<path> option.
|
||||||
|
|
||||||
|
END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,168 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $PCRE_LIBRARY = PCRE2 ]; then
|
||||||
|
|
||||||
|
# PCRE2
|
||||||
|
|
||||||
|
if [ $NGX_CC_NAME = msvc ]; then
|
||||||
|
|
||||||
|
# With PCRE2, it is not possible to compile all sources.
|
||||||
|
# Since list of source files changes between versions, we
|
||||||
|
# test files which might not be present.
|
||||||
|
|
||||||
|
ngx_pcre_srcs="pcre2_auto_possess.c \
|
||||||
|
pcre2_chartables.c \
|
||||||
|
pcre2_compile.c \
|
||||||
|
pcre2_config.c \
|
||||||
|
pcre2_context.c \
|
||||||
|
pcre2_dfa_match.c \
|
||||||
|
pcre2_error.c \
|
||||||
|
pcre2_jit_compile.c \
|
||||||
|
pcre2_maketables.c \
|
||||||
|
pcre2_match.c \
|
||||||
|
pcre2_match_data.c \
|
||||||
|
pcre2_newline.c \
|
||||||
|
pcre2_ord2utf.c \
|
||||||
|
pcre2_pattern_info.c \
|
||||||
|
pcre2_string_utils.c \
|
||||||
|
pcre2_study.c \
|
||||||
|
pcre2_substitute.c \
|
||||||
|
pcre2_substring.c \
|
||||||
|
pcre2_tables.c \
|
||||||
|
pcre2_ucd.c \
|
||||||
|
pcre2_valid_utf.c \
|
||||||
|
pcre2_xclass.c"
|
||||||
|
|
||||||
|
ngx_pcre_test="pcre2_convert.c \
|
||||||
|
pcre2_extuni.c \
|
||||||
|
pcre2_find_bracket.c \
|
||||||
|
pcre2_script_run.c \
|
||||||
|
pcre2_serialize.c"
|
||||||
|
|
||||||
|
for ngx_src in $ngx_pcre_test
|
||||||
|
do
|
||||||
|
if [ -f $PCRE/src/$ngx_src ]; then
|
||||||
|
ngx_pcre_srcs="$ngx_pcre_srcs $ngx_src"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
ngx_pcre_objs=`echo $ngx_pcre_srcs \
|
||||||
|
| sed -e "s#\([^ ]*\.\)c#\1$ngx_objext#g"`
|
||||||
|
|
||||||
|
ngx_pcre_srcs=`echo $ngx_pcre_srcs \
|
||||||
|
| sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"`
|
||||||
|
ngx_pcre_objs=`echo $ngx_pcre_objs \
|
||||||
|
| sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"`
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
PCRE_CFLAGS = -O2 -Ob1 -Oi -Gs $LIBC $CPU_OPT
|
||||||
|
PCRE_FLAGS = -DHAVE_CONFIG_H -DPCRE2_STATIC -DPCRE2_CODE_UNIT_WIDTH=8 \\
|
||||||
|
-DHAVE_MEMMOVE
|
||||||
|
|
||||||
|
PCRE_SRCS = $ngx_pcre_srcs
|
||||||
|
PCRE_OBJS = $ngx_pcre_objs
|
||||||
|
|
||||||
|
$PCRE/src/pcre2.h:
|
||||||
|
cd $PCRE/src \\
|
||||||
|
&& copy /y config.h.generic config.h \\
|
||||||
|
&& copy /y pcre2.h.generic pcre2.h \\
|
||||||
|
&& copy /y pcre2_chartables.c.dist pcre2_chartables.c
|
||||||
|
|
||||||
|
$PCRE/src/pcre2-8.lib: $PCRE/src/pcre2.h $NGX_MAKEFILE
|
||||||
|
cd $PCRE/src \\
|
||||||
|
&& cl -nologo -c \$(PCRE_CFLAGS) -I . \$(PCRE_FLAGS) \$(PCRE_SRCS) \\
|
||||||
|
&& link -lib -out:pcre2-8.lib -verbose:lib \$(PCRE_OBJS)
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$PCRE/src/pcre2.h: $PCRE/Makefile
|
||||||
|
|
||||||
|
$PCRE/Makefile: $NGX_MAKEFILE
|
||||||
|
cd $PCRE \\
|
||||||
|
&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
|
||||||
|
&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
|
||||||
|
./configure --disable-shared $PCRE_CONF_OPT
|
||||||
|
|
||||||
|
$PCRE/.libs/libpcre2-8.a: $PCRE/Makefile
|
||||||
|
cd $PCRE \\
|
||||||
|
&& \$(MAKE) libpcre2-8.la
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
# PCRE
|
||||||
|
|
||||||
|
case "$NGX_CC_NAME" in
|
||||||
|
|
||||||
|
msvc)
|
||||||
|
ngx_makefile=makefile.msvc
|
||||||
|
ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"
|
||||||
|
ngx_pcre="PCRE=\"$PCRE\""
|
||||||
|
;;
|
||||||
|
|
||||||
|
owc)
|
||||||
|
ngx_makefile=makefile.owc
|
||||||
|
ngx_opt="CPU_OPT=\"$CPU_OPT\""
|
||||||
|
ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
;;
|
||||||
|
|
||||||
|
bcc)
|
||||||
|
ngx_makefile=makefile.bcc
|
||||||
|
ngx_opt="-DCPU_OPT=\"$CPU_OPT\""
|
||||||
|
ngx_pcre=`echo \-DPCRE=\"$PCRE\" \
|
||||||
|
| sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
ngx_makefile=
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
if [ -n "$ngx_makefile" ]; then
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
`echo "$PCRE/pcre.lib: $PCRE/pcre.h $NGX_MAKEFILE" \
|
||||||
|
| sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt
|
||||||
|
|
||||||
|
`echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$PCRE/pcre.h: $PCRE/Makefile
|
||||||
|
|
||||||
|
$PCRE/Makefile: $NGX_MAKEFILE
|
||||||
|
cd $PCRE \\
|
||||||
|
&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
|
||||||
|
&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
|
||||||
|
./configure --disable-shared $PCRE_CONF_OPT
|
||||||
|
|
||||||
|
$PCRE/.libs/libpcre.a: $PCRE/Makefile
|
||||||
|
cd $PCRE \\
|
||||||
|
&& \$(MAKE) libpcre.la
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS = -q -O2 -tWM -w-8004 $(CPU_OPT)
|
||||||
|
PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \
|
||||||
|
-DSUPPORT_PCRE8 -DHAVE_MEMMOVE
|
||||||
|
|
||||||
|
|
||||||
|
pcre.lib:
|
||||||
|
cd $(PCRE)
|
||||||
|
|
||||||
|
bcc32 -c $(CFLAGS) -I. $(PCREFLAGS) pcre_*.c
|
||||||
|
|
||||||
|
copy /y nul pcre.lst
|
||||||
|
for %n in (*.obj) do @echo +%n ^^& >> pcre.lst
|
||||||
|
echo + >> pcre.lst
|
||||||
|
|
||||||
|
tlib pcre.lib @pcre.lst
|
||||||
|
|
||||||
|
pcre.h:
|
||||||
|
cd $(PCRE)
|
||||||
|
|
||||||
|
copy /y pcre.h.generic pcre.h
|
||||||
|
copy /y config.h.generic config.h
|
||||||
|
copy /y pcre_chartables.c.dist pcre_chartables.c
|
@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS = -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT)
|
||||||
|
PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \
|
||||||
|
-DSUPPORT_PCRE8 -DHAVE_MEMMOVE
|
||||||
|
|
||||||
|
|
||||||
|
pcre.lib:
|
||||||
|
cd $(PCRE)
|
||||||
|
|
||||||
|
cl -nologo -c $(CFLAGS) -I . $(PCREFLAGS) pcre_*.c
|
||||||
|
|
||||||
|
link -lib -out:pcre.lib -verbose:lib pcre_*.obj
|
||||||
|
|
||||||
|
pcre.h:
|
||||||
|
cd $(PCRE)
|
||||||
|
|
||||||
|
copy /y pcre.h.generic pcre.h
|
||||||
|
copy /y config.h.generic config.h
|
||||||
|
copy /y pcre_chartables.c.dist pcre_chartables.c
|
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS = -c -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT)
|
||||||
|
PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 &
|
||||||
|
-DSUPPORT_PCRE8 -DHAVE_MEMMOVE
|
||||||
|
|
||||||
|
|
||||||
|
pcre.lib:
|
||||||
|
cd $(PCRE)
|
||||||
|
|
||||||
|
wcl386 $(CFLAGS) -i=. $(PCREFLAGS) pcre_*.c
|
||||||
|
|
||||||
|
dir /b *.obj > pcre.lst
|
||||||
|
|
||||||
|
wlib -n pcre.lib @pcre.lst
|
||||||
|
|
||||||
|
pcre.h:
|
||||||
|
cd $(PCRE)
|
||||||
|
|
||||||
|
copy /y pcre.h.generic pcre.h
|
||||||
|
copy /y config.h.generic config.h
|
||||||
|
copy /y pcre_chartables.c.dist pcre_chartables.c
|
@ -0,0 +1,83 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
echo "checking for perl"
|
||||||
|
|
||||||
|
|
||||||
|
NGX_PERL_VER=`$NGX_PERL -v 2>&1 | grep '^This is perl' 2>&1 \
|
||||||
|
| sed -e 's/^This is perl, \(.*\)/\1/'`
|
||||||
|
|
||||||
|
if test -n "$NGX_PERL_VER"; then
|
||||||
|
echo " + perl version: $NGX_PERL_VER"
|
||||||
|
|
||||||
|
if [ "`$NGX_PERL -e 'use 5.008006; print "OK"'`" != "OK" ]; then
|
||||||
|
echo
|
||||||
|
echo "$0: error: perl 5.8.6 or higher is required"
|
||||||
|
echo
|
||||||
|
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "`$NGX_PERL -MExtUtils::Embed -e 'print "OK"'`" != "OK" ]; then
|
||||||
|
echo
|
||||||
|
echo "$0: error: perl module ExtUtils::Embed is required"
|
||||||
|
echo
|
||||||
|
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
NGX_PM_CFLAGS=`$NGX_PERL -MExtUtils::Embed -e ccopts`
|
||||||
|
NGX_PM_LDFLAGS=`$NGX_PERL -MConfig -e 'print $Config{lddlflags}'`
|
||||||
|
|
||||||
|
NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`"
|
||||||
|
|
||||||
|
# gcc 4.1/4.2 warn about unused values in pTHX_
|
||||||
|
NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \
|
||||||
|
| sed -e 's/-Wunused-value/-Wno-unused-value/'`
|
||||||
|
# icc8 warns 'declaration hides parameter "my_perl"' in ENTER and LEAVE
|
||||||
|
NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \
|
||||||
|
| sed -e 's/-wd171/-wd171 -wd1599/'`
|
||||||
|
|
||||||
|
ngx_perl_ldopts=`$NGX_PERL -MExtUtils::Embed -e ldopts`
|
||||||
|
|
||||||
|
ngx_perl_dlext=`$NGX_PERL -MConfig -e 'print $Config{dlext}'`
|
||||||
|
ngx_perl_libdir="src/http/modules/perl/blib/arch/auto"
|
||||||
|
ngx_perl_module="$ngx_perl_libdir/nginx/nginx.$ngx_perl_dlext"
|
||||||
|
|
||||||
|
if $NGX_PERL -V:usemultiplicity | grep define > /dev/null; then
|
||||||
|
have=NGX_HAVE_PERL_MULTIPLICITY . auto/have
|
||||||
|
echo " + perl interpreter multiplicity found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $NGX_PERL -V:useithreads | grep undef > /dev/null; then
|
||||||
|
# FreeBSD port wants to link with -pthread non-threaded perl
|
||||||
|
ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$NGX_SYSTEM" = "Darwin" ]; then
|
||||||
|
# OS X system perl wants to link universal binaries
|
||||||
|
ngx_perl_ldopts=`echo $ngx_perl_ldopts \
|
||||||
|
| sed -e 's/-arch i386//' -e 's/-arch x86_64//'`
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $USE_PERL = YES ]; then
|
||||||
|
CORE_LINK="$CORE_LINK $ngx_perl_ldopts"
|
||||||
|
fi
|
||||||
|
|
||||||
|
NGX_LIB_PERL="$ngx_perl_ldopts"
|
||||||
|
|
||||||
|
if test -n "$NGX_PERL_MODULES"; then
|
||||||
|
have=NGX_PERL_MODULES value="(u_char *) \"$NGX_PERL_MODULES\""
|
||||||
|
. auto/define
|
||||||
|
NGX_PERL_MODULES_MAN=$NGX_PERL_MODULES/man3
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "$0: error: perl 5.8.6 or higher is required"
|
||||||
|
echo
|
||||||
|
|
||||||
|
exit 1;
|
||||||
|
fi
|
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$NGX_OBJS/src/http/modules/perl/ngx_http_perl_module.o: \\
|
||||||
|
$NGX_OBJS/$ngx_perl_module
|
||||||
|
|
||||||
|
$NGX_OBJS/$ngx_perl_module: \\
|
||||||
|
\$(CORE_DEPS) \$(HTTP_DEPS) \\
|
||||||
|
src/http/modules/perl/ngx_http_perl_module.h \\
|
||||||
|
$NGX_OBJS/src/http/modules/perl/Makefile
|
||||||
|
cd $NGX_OBJS/src/http/modules/perl && \$(MAKE)
|
||||||
|
|
||||||
|
rm -rf $NGX_OBJS/install_perl
|
||||||
|
|
||||||
|
|
||||||
|
$NGX_OBJS/src/http/modules/perl/Makefile: \\
|
||||||
|
$NGX_AUTO_CONFIG_H \\
|
||||||
|
src/core/nginx.h \\
|
||||||
|
src/http/modules/perl/Makefile.PL \\
|
||||||
|
src/http/modules/perl/nginx.pm \\
|
||||||
|
src/http/modules/perl/nginx.xs \\
|
||||||
|
src/http/modules/perl/typemap
|
||||||
|
grep 'define NGINX_VERSION' src/core/nginx.h \\
|
||||||
|
| sed -e 's/^.*"\(.*\)".*/\1/' > \\
|
||||||
|
$NGX_OBJS/src/http/modules/perl/version
|
||||||
|
sed "s/%%VERSION%%/\`cat $NGX_OBJS/src/http/modules/perl/version\`/" \\
|
||||||
|
src/http/modules/perl/nginx.pm > \\
|
||||||
|
$NGX_OBJS/src/http/modules/perl/nginx.pm
|
||||||
|
cp -p src/http/modules/perl/nginx.xs $NGX_OBJS/src/http/modules/perl/
|
||||||
|
cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/
|
||||||
|
cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/
|
||||||
|
|
||||||
|
cd $NGX_OBJS/src/http/modules/perl \\
|
||||||
|
&& NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \\
|
||||||
|
NGX_PM_LDFLAGS="$NGX_LD_OPT \$(NGX_PM_LDFLAGS)" \\
|
||||||
|
NGX_INCS="$CORE_INCS $NGX_OBJS $HTTP_INCS" \\
|
||||||
|
NGX_DEPS="\$(CORE_DEPS) \$(HTTP_DEPS)" \\
|
||||||
|
$NGX_PERL Makefile.PL \\
|
||||||
|
LIB=$NGX_PERL_MODULES \\
|
||||||
|
INSTALLSITEMAN3DIR=$NGX_PERL_MODULES_MAN
|
||||||
|
|
||||||
|
END
|
@ -0,0 +1,79 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ZLIB != NONE ]; then
|
||||||
|
CORE_INCS="$CORE_INCS $ZLIB"
|
||||||
|
|
||||||
|
case "$NGX_CC_NAME" in
|
||||||
|
|
||||||
|
msvc | owc | bcc)
|
||||||
|
have=NGX_ZLIB . auto/have
|
||||||
|
LINK_DEPS="$LINK_DEPS $ZLIB/zlib.lib"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib"
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
have=NGX_ZLIB . auto/have
|
||||||
|
LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"
|
||||||
|
|
||||||
|
# to allow -ipo optimization we link with the *.o but not library
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/adler32.o"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/crc32.o"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/deflate.o"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/trees.o"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/zutil.o"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/compress.o"
|
||||||
|
|
||||||
|
if [ $ZLIB_ASM != NO ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/match.o"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
have=NGX_ZLIB . auto/have
|
||||||
|
LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"
|
||||||
|
CORE_LIBS="$CORE_LIBS $ZLIB/libz.a"
|
||||||
|
#CORE_LIBS="$CORE_LIBS -L $ZLIB -lz"
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
if [ "$NGX_PLATFORM" != win32 ]; then
|
||||||
|
ZLIB=NO
|
||||||
|
|
||||||
|
# FreeBSD, Solaris, Linux
|
||||||
|
|
||||||
|
ngx_feature="zlib library"
|
||||||
|
ngx_feature_name="NGX_ZLIB"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <zlib.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs="-lz"
|
||||||
|
ngx_feature_test="z_stream z; deflate(&z, Z_NO_FLUSH)"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
if [ $ngx_found = yes ]; then
|
||||||
|
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
|
||||||
|
ZLIB=YES
|
||||||
|
ngx_found=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $ZLIB != YES ]; then
|
||||||
|
cat << END
|
||||||
|
|
||||||
|
$0: error: the HTTP gzip module requires the zlib library.
|
||||||
|
You can either disable the module by using --without-http_gzip_module
|
||||||
|
option, or install the zlib library into the system, or build the zlib library
|
||||||
|
statically from the source with nginx by using --with-zlib=<path> option.
|
||||||
|
|
||||||
|
END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,135 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
case "$NGX_CC_NAME" in
|
||||||
|
|
||||||
|
msvc)
|
||||||
|
ngx_makefile=makefile.msvc
|
||||||
|
ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"
|
||||||
|
ngx_zlib="ZLIB=\"$ZLIB\""
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
owc)
|
||||||
|
ngx_makefile=makefile.owc
|
||||||
|
ngx_opt="CPU_OPT=\"$CPU_OPT\""
|
||||||
|
ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
;;
|
||||||
|
|
||||||
|
bcc)
|
||||||
|
ngx_makefile=makefile.bcc
|
||||||
|
ngx_opt="-DCPU_OPT=\"$CPU_OPT\""
|
||||||
|
ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
ngx_makefile=
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
done=NO
|
||||||
|
|
||||||
|
|
||||||
|
case "$NGX_PLATFORM" in
|
||||||
|
|
||||||
|
win32)
|
||||||
|
|
||||||
|
if [ -n "$ngx_makefile" ]; then
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
`echo "$ZLIB/zlib.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`
|
||||||
|
\$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$ZLIB/libz.a: $NGX_MAKEFILE
|
||||||
|
cd $ZLIB \\
|
||||||
|
&& \$(MAKE) distclean \\
|
||||||
|
&& \$(MAKE) -f win32/Makefile.gcc \\
|
||||||
|
CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
|
||||||
|
libz.a
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
done=YES
|
||||||
|
;;
|
||||||
|
|
||||||
|
# FreeBSD: i386
|
||||||
|
# Linux: i686
|
||||||
|
|
||||||
|
*:i386 | *:i686)
|
||||||
|
case $ZLIB_ASM in
|
||||||
|
pentium)
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$ZLIB/libz.a: $NGX_MAKEFILE
|
||||||
|
cd $ZLIB \\
|
||||||
|
&& \$(MAKE) distclean \\
|
||||||
|
&& cp contrib/asm586/match.S . \\
|
||||||
|
&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\
|
||||||
|
./configure \\
|
||||||
|
&& \$(MAKE) OBJA=match.o libz.a
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
done=YES
|
||||||
|
;;
|
||||||
|
|
||||||
|
pentiumpro)
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$ZLIB/libz.a: $NGX_MAKEFILE
|
||||||
|
cd $ZLIB \\
|
||||||
|
&& \$(MAKE) distclean \\
|
||||||
|
&& cp contrib/asm686/match.S . \\
|
||||||
|
&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\
|
||||||
|
./configure \\
|
||||||
|
&& \$(MAKE) OBJA=match.o libz.a
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
done=YES
|
||||||
|
;;
|
||||||
|
|
||||||
|
NO)
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "$0: error: invalid --with-zlib-asm=$ZLIB_ASM option."
|
||||||
|
echo "The valid values are \"pentium\" and \"pentiumpro\" only".
|
||||||
|
echo
|
||||||
|
|
||||||
|
exit 1;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
if [ $done = NO ]; then
|
||||||
|
|
||||||
|
cat << END >> $NGX_MAKEFILE
|
||||||
|
|
||||||
|
$ZLIB/libz.a: $NGX_MAKEFILE
|
||||||
|
cd $ZLIB \\
|
||||||
|
&& \$(MAKE) distclean \\
|
||||||
|
&& CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
|
||||||
|
./configure \\
|
||||||
|
&& \$(MAKE) libz.a
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
fi
|
@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS = -q -O2 -tWM -w-8004 -w-8012 $(CPU_OPT)
|
||||||
|
|
||||||
|
zlib.lib:
|
||||||
|
cd $(ZLIB)
|
||||||
|
|
||||||
|
bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c \
|
||||||
|
trees.c zutil.c compress.c \
|
||||||
|
inflate.c inffast.c inftrees.c
|
||||||
|
|
||||||
|
tlib zlib.lib +adler32.obj +crc32.obj +deflate.obj \
|
||||||
|
+trees.obj +zutil.obj +compress.obj \
|
||||||
|
+inflate.obj +inffast.obj +inftrees.obj
|
@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT)
|
||||||
|
|
||||||
|
zlib.lib:
|
||||||
|
cd $(ZLIB)
|
||||||
|
|
||||||
|
cl -c $(CFLAGS) adler32.c crc32.c deflate.c \
|
||||||
|
trees.c zutil.c compress.c \
|
||||||
|
inflate.c inffast.c inftrees.c
|
||||||
|
|
||||||
|
link -lib -out:zlib.lib adler32.obj crc32.obj deflate.obj \
|
||||||
|
trees.obj zutil.obj compress.obj \
|
||||||
|
inflate.obj inffast.obj inftrees.obj
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
# Copyright (C) Igor Sysoev
|
||||||
|
# Copyright (C) Nginx, Inc.
|
||||||
|
|
||||||
|
|
||||||
|
CFLAGS = -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT)
|
||||||
|
|
||||||
|
zlib.lib:
|
||||||
|
cd $(ZLIB)
|
||||||
|
|
||||||
|
wcl386 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c &
|
||||||
|
compress.c inflate.c inffast.c inftrees.c
|
||||||
|
wlib -n zlib.lib adler32.obj crc32.obj deflate.obj trees.obj &
|
||||||
|
zutil.obj compress.obj inflate.obj inffast.obj inftrees.obj
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue