├── C_webserver
├── files
│ ├── upload.txt
│ ├── uploaderr.txt
│ ├── snow.jpg
│ ├── weed.jpg
│ ├── favicon.ico
│ └── index.html
├── SSL
│ ├── all
│ │ ├── ca-cert.srl
│ │ ├── ca.p12
│ │ ├── client.p12
│ │ ├── server.p12
│ │ ├── ca-req.csr
│ │ ├── client-req.csr
│ │ ├── server-req.csr
│ │ ├── ca-cert.pem
│ │ ├── client-cert.pem
│ │ ├── server-cert.pem
│ │ ├── ca-key.pem
│ │ ├── client-key.pem
│ │ └── server-key.pem
│ ├── ca
│ │ ├── ca-cert.srl
│ │ ├── ca.p12
│ │ ├── ca-req.csr
│ │ ├── ca-cert.pem
│ │ └── ca-key.pem
│ ├── server
│ │ ├── server.p12
│ │ ├── server-req.csr
│ │ ├── server-cert.pem
│ │ └── server-key.pem
│ ├── client_ip
│ │ ├── client.p12
│ │ ├── client-req.csr
│ │ ├── client-cert.pem
│ │ └── client-key.pem
│ └── server_domain
│ │ ├── server.p12
│ │ ├── server-req.csr
│ │ ├── server-cert.pem
│ │ └── server-key.pem
├── http
│ ├── SSL
│ │ ├── all
│ │ │ ├── ca-cert.srl
│ │ │ ├── ca.p12
│ │ │ ├── client.p12
│ │ │ ├── server.p12
│ │ │ ├── ca-req.csr
│ │ │ ├── client-req.csr
│ │ │ ├── server-req.csr
│ │ │ ├── ca-cert.pem
│ │ │ ├── client-cert.pem
│ │ │ ├── server-cert.pem
│ │ │ ├── ca-key.pem
│ │ │ ├── client-key.pem
│ │ │ └── server-key.pem
│ │ ├── ca
│ │ │ ├── ca-cert.srl
│ │ │ ├── ca.p12
│ │ │ ├── ca-req.csr
│ │ │ ├── ca-cert.pem
│ │ │ └── ca-key.pem
│ │ ├── server
│ │ │ ├── server.p12
│ │ │ ├── server-req.csr
│ │ │ ├── server-cert.pem
│ │ │ └── server-key.pem
│ │ ├── client_ip
│ │ │ ├── client.p12
│ │ │ ├── client-req.csr
│ │ │ ├── client-cert.pem
│ │ │ └── client-key.pem
│ │ └── server_domain
│ │ │ ├── server.p12
│ │ │ ├── server-req.csr
│ │ │ ├── server-cert.pem
│ │ │ └── server-key.pem
│ ├── includes
│ │ ├── WebServer.h
│ │ ├── SSL.h
│ │ ├── filesystem.h
│ │ ├── request.h
│ │ ├── global.h
│ │ ├── pipe.h
│ │ ├── response.h
│ │ ├── Http.h
│ │ └── TCP.h
│ ├── main.c
│ ├── response.c
│ ├── request.c
│ ├── WebServer.c
│ ├── filesystem.c
│ ├── SSL.c
│ ├── pipe.c
│ ├── Http.c
│ └── TCP.c
├── test
└── Makefile
├── README.md
└── LICENSE
/C_webserver/files/upload.txt:
--------------------------------------------------------------------------------
1 | Send done.
2 |
--------------------------------------------------------------------------------
/C_webserver/files/uploaderr.txt:
--------------------------------------------------------------------------------
1 | Send error.
2 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/ca-cert.srl:
--------------------------------------------------------------------------------
1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA4
2 |
--------------------------------------------------------------------------------
/C_webserver/SSL/ca/ca-cert.srl:
--------------------------------------------------------------------------------
1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA5
2 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/ca-cert.srl:
--------------------------------------------------------------------------------
1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA4
2 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/ca/ca-cert.srl:
--------------------------------------------------------------------------------
1 | 2F82CB83C2A0B4CEC3EB0E0C82923FE9F34E9AA5
2 |
--------------------------------------------------------------------------------
/C_webserver/test:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/test
--------------------------------------------------------------------------------
/C_webserver/SSL/all/ca.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/all/ca.p12
--------------------------------------------------------------------------------
/C_webserver/SSL/ca/ca.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/ca/ca.p12
--------------------------------------------------------------------------------
/C_webserver/files/snow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/files/snow.jpg
--------------------------------------------------------------------------------
/C_webserver/files/weed.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/files/weed.jpg
--------------------------------------------------------------------------------
/C_webserver/SSL/all/client.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/all/client.p12
--------------------------------------------------------------------------------
/C_webserver/SSL/all/server.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/all/server.p12
--------------------------------------------------------------------------------
/C_webserver/files/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/files/favicon.ico
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/ca.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/all/ca.p12
--------------------------------------------------------------------------------
/C_webserver/http/SSL/ca/ca.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/ca/ca.p12
--------------------------------------------------------------------------------
/C_webserver/SSL/server/server.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/server/server.p12
--------------------------------------------------------------------------------
/C_webserver/SSL/client_ip/client.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/client_ip/client.p12
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/client.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/all/client.p12
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/server.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/all/server.p12
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server/server.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/server/server.p12
--------------------------------------------------------------------------------
/C_webserver/SSL/server_domain/server.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/SSL/server_domain/server.p12
--------------------------------------------------------------------------------
/C_webserver/http/SSL/client_ip/client.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/client_ip/client.p12
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server_domain/server.p12:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oneflyingfish/WebServer_C/HEAD/C_webserver/http/SSL/server_domain/server.p12
--------------------------------------------------------------------------------
/C_webserver/Makefile:
--------------------------------------------------------------------------------
1 | all:
2 | gcc http/*.c -I http/includes -levent -lssl -lcrypto -o test
3 | clean:
4 | rm test
5 | remove:
6 | rm -r http
7 | rm *.zip
8 |
--------------------------------------------------------------------------------
/C_webserver/files/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/C_webserver/http/includes/WebServer.h:
--------------------------------------------------------------------------------
1 | #ifndef WEBSERVER_H
2 | #define WEBSERVER_H
3 |
4 | #include "TCP.h"
5 | #include "Http.h"
6 | #include"global.h"
7 | #include "SSL.h"
8 |
9 | #define ALLOW_ACCEPT 1
10 | #define HTTP_KIND int
11 | #define HTTP 0
12 | #define HTTPS 1
13 |
14 | int RunWebServer(char *ip, int port, int maxListener, HTTP_KIND flag);
15 | int RunHttpServer(char *ip, int port, int maxListener);
16 | int RunHttpsServer(char *ip, int port, int maxListener);
17 |
18 | #endif
--------------------------------------------------------------------------------
/C_webserver/http/includes/SSL.h:
--------------------------------------------------------------------------------
1 | #ifndef SSL_H
2 | #define SSL_H
3 |
4 | #include
5 | #include
6 | #include
7 | #include"global.h"
8 |
9 | // #define CERTF "SSL/server/server-cert.pem"
10 | // #define KEYF "SSL/server/server-key.pem"
11 | // #define CAFILE "SSL/ca/ca-cert.pem"
12 |
13 | #define CERTF "SSL/server_domain/server-cert.pem"
14 | #define KEYF "SSL/server_domain/server-key.pem"
15 | #define CAFILE "SSL/ca/ca-cert.pem"
16 |
17 | SSL_CTX* InitSSL();
18 | SSL* AttachSSLWithSocket(int sockId, SSL_CTX* ctx);
19 | Bool VerifyX509(SSL* ssl);
20 | void FreeSSL(SSL *ssl, SSL_CTX *ctx);
21 |
22 | #endif
--------------------------------------------------------------------------------
/C_webserver/http/includes/filesystem.h:
--------------------------------------------------------------------------------
1 | #ifndef _FILESYSTEM_H_
2 | #define _FILESYSTEM_H_
3 |
4 | #include"global.h"
5 | #include"response.h"
6 | #include"request.h"
7 | #include"TCP.h"
8 |
9 | int createfile(char *name,struct Request* req);
10 |
11 | struct FileInfo* file2body(char *path);
12 |
13 | int GetFileLength(char* path);
14 | /*****************************************************
15 | * 功能:返回一个磁盘文件的字节长度
16 | *
17 | * 返回值:成功时返回字节数,失败返回-1
18 | *****************************************************/
19 |
20 | int EndWithString(char *str1, char *str2);
21 |
22 | void GetFileName(char *path, char *result);
23 |
24 | void getType(char* file_name,char* extension);
25 |
26 | #endif
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WebServer_C
2 | 基于C语言实现一个简易的Web服务器,支持Http和Https(基于OpenSSL的TLS协议)
3 |
4 | ## 开发环境:
5 | * 开发语言:`C (部分测试网页涉及HTML+CSS内容,不影响功能)`
6 | * 开发环境:`Ubuntu 20.04, gcc V9.3.0, OpenSSL 1.1.1`
7 |
8 | ## 功能说明:
9 | * 对HTTP、HTTPS的支持
10 | * Centent-Type的支持(对应Chunked模式)
11 | * 对分块传输的支持
12 | * 文件传输
13 | * 注:在HTTP层,仅完成部分头部协议识别,传输层与SSL层完成了封装,自适应HTTPS与HTTP数据报的传送
14 |
15 | ## 环境复现
16 | ```Bash
17 | sudo apt-get update
18 | sudo apt-get install openssl
19 | sudo apt-get install libssl-dev
20 | sudo apt-get install gcc
21 | ```
22 |
23 | ## 二进制构建
24 | ```Bash
25 | make
26 |
27 | # 清理项目
28 | make clean
29 | ```
30 |
31 | ## 开发人员
32 | 此项目为合作项目,由我和曹书瑜共同完成。
33 |
34 | ## 附言
35 | 关于如何创建测试用SSL证书,可参考我的[博客](https://www.aflyingfish.top/articles/d9a29d96e0ce/)
36 |
--------------------------------------------------------------------------------
/C_webserver/http/includes/request.h:
--------------------------------------------------------------------------------
1 | #ifndef _REQUEST_H_
2 | #define _REQUEST_H_
3 |
4 | #include"global.h"
5 |
6 | #define typenums 5
7 |
8 | typedef struct Request{
9 | char method[8]; //only GET or POST
10 | char URL[dflen];
11 | size_t URLlen;
12 | char version[16];
13 |
14 | char connection[12]; //Connection: close or Keep-Alive //or Upgrade
15 | char accept[2*dflen];
16 | char Encoding[12];
17 | //char accept[2*dflen];
18 | //char authorization[2*dflen];
19 | //--------------------------------------------------------------
20 | char contentLength[16]; //Content-Length: num
21 | char contentType[16];
22 | char* bodyptr;
23 | char* contentptr;
24 | } Request;
25 |
26 | int headlize(char* ptr);
27 | int headhandler(struct Request* req,size_t slen,char* ptr);
28 | struct Request* phaser(size_t len,char* buffer);
29 |
30 | #endif
--------------------------------------------------------------------------------
/C_webserver/http/includes/global.h:
--------------------------------------------------------------------------------
1 | #ifndef _GLOBAL_H_
2 | #define _GLOBAL_H_
3 |
4 | #include
5 | #include
6 | #include
7 |
8 | #define dflen 100
9 | #define dftypelen 20
10 | #define dfpage "/index.html"
11 | #define FILEDIR "files"
12 | #define FILEDIR2 "files/"
13 | #define rn "\r\n"
14 | #define page 4096
15 | #define chunkborder 800
16 | #define Bool int
17 | #define true 1
18 | #define false 0
19 | #define stateLen 60
20 | #define alivetime 60
21 |
22 | #define OK 200
23 | #define NotFound 404
24 | #define BadRequest 400
25 | #define InternalServerError 500
26 | #define MethodNotAllowed 405
27 | #define NotAcceptable 406
28 | #define RequestURITooLarge 414
29 | #define HTTPVersionnotsupported 505
30 |
31 | #define OUTPUT_ERROR_INFOR //条件编译,决定是否输出错误信息
32 | #define OUTPUT_DEBUG_INFO //条件编译,决定是否打印额外执行输出
33 |
34 | #endif
35 |
--------------------------------------------------------------------------------
/C_webserver/http/main.c:
--------------------------------------------------------------------------------
1 | #include "TCP.h"
2 | #include "Http.h"
3 | #include"global.h"
4 | #include "WebServer.h"
5 |
6 | #define HTTP_PORT 12345
7 | #define HTTPS_PORT 54321
8 | #define MaxListener 10
9 | #define Max_TRY_TIMES 10
10 |
11 | int main()
12 | {
13 | int pid = fork();
14 | if(pid!=0)
15 | {
16 | // 父进程, 运行Https服务器
17 | for (int i = 0; i < Max_TRY_TIMES;i++)
18 | {
19 | RunHttpsServer(NULL, HTTPS_PORT, MaxListener);
20 | }
21 | #ifdef OUTPUT_DEBUG_INFO
22 | printf("HTTPS server尝试启动%d次后仍旧失败,放弃启动\n", Max_TRY_TIMES);
23 | #endif
24 | }
25 | else
26 | {
27 | // 子进程,运行http服务器
28 | for (int i = 0; i < Max_TRY_TIMES; i++)
29 | {
30 | RunHttpServer(NULL, HTTP_PORT, MaxListener);
31 | }
32 | #ifdef OUTPUT_DEBUG_INFO
33 | printf("HTTP server尝试启动%d次后仍旧失败,放弃启动\n", Max_TRY_TIMES);
34 | #endif
35 | }
36 |
37 | while(1);
38 | }
--------------------------------------------------------------------------------
/C_webserver/http/includes/pipe.h:
--------------------------------------------------------------------------------
1 | #ifndef _PIPE_H_
2 | #define _PIPE_H_
3 |
4 | #include"global.h"
5 | #include"request.h"
6 | #include"response.h"
7 | #include"filesystem.h"
8 |
9 | struct Block{
10 | struct FinalResponse* response;
11 | int connection;
12 | int keepalivetime;
13 | int chunked;
14 | struct FileInfo* fileinfo;
15 | };
16 |
17 | struct Block* init(struct Request* req);
18 |
19 | struct Block* getfile(struct Request* req, struct Block* block);
20 | struct Block* postfile(struct Request* req, struct Block* block);
21 |
22 | struct Block* connectioncheck(struct Request* req, struct Block* block);
23 |
24 | #endif
25 | //----------------------------------------------------------------------------
26 |
27 | /*
28 | struct FinalResponse* constructor(struct Request* req);
29 |
30 | struct FinalResponse* addhead(struct FinalResponse* rst,struct AdditionalResponse* ad);
31 |
32 | struct AdditionalResponse* connectioncheck();
33 |
34 | struct FileInfo* fileattach(char* path);
35 |
36 | */
--------------------------------------------------------------------------------
/C_webserver/SSL/all/ca-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL
4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs
5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex
6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e
7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy
8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r
9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn
10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl
11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3
12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz
13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2
14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9
15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN
16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG
17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/SSL/ca/ca-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL
4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs
5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex
6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e
7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy
8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r
9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn
10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl
11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3
12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz
13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2
14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9
15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN
16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG
17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/ca-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL
4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs
5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex
6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e
7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy
8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r
9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn
10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl
11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3
12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz
13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2
14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9
15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN
16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG
17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/ca/ca-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC5zCCAc8CAQAwgYoxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNoVmlzaW9uMQ0wCwYDVQQL
4 | DAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgGCSqGSIb3DQEJARYLYWZs
5 | eWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDYa6Ka07Ex
6 | L3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMyCw0SwNR2Ufze+Riys1+e
7 | k179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72fYsAKOdx4SzIGWfdokWpy
8 | G61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oEeibobvXCeoMpfsN7kT9r
9 | yN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBytuSiIkC6vIONaQzTZ2Jn
10 | VwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGClnU5vTxtxCJmSG6VNndCl
11 | ZomMAn1jJDajAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqGSIb3
12 | DQEBCwUAA4IBAQBcj1wA7gJX/Z8zboNl98h2UMksXgrglnfpoOqo6yJrVNA14GFz
13 | 8gaSRNRaf8M7LFM2SzrAeihC9qzuTHiFt964cqleKpn4s5oYiTuWUzL4bFtDUjD2
14 | qt9iGhObAwbt6i2okMOxPDwkhjBW2hu1sIzXR7Py9dUKPfGmhhyLUs54gTv8Nxo9
15 | hnuDrpMs2wnG9Ky38J8Jis+x7CixCHdGFqGDTN4j8Vjjk6lnwGfcau/kSJFUD9tN
16 | oUAIBw/4RkP+fv8NlKR1oia5L1qmWDSU4wFvv/tPMquVhR/XQsVQKOiaYbnoxbFG
17 | /S+xQCP7WtEoM8Bu54tTSJBFEDzA9omNgKPY
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/client-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm
5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc
6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890
7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3
8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI
9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW
10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ
11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG
12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg
13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n
14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR
15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj
16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4
17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q==
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/server-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL
5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF
6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD
7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw
8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV
9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO
10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp
11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG
12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj
13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l
14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI
15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j
16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0
17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/SSL/client_ip/client-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm
5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc
6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890
7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3
8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI
9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW
10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ
11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG
12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg
13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n
14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR
15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj
16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4
17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q==
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/SSL/server/server-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL
5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF
6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD
7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw
8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV
9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO
10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp
11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG
12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj
13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l
14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI
15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j
16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0
17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/client-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm
5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc
6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890
7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3
8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI
9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW
10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ
11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG
12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg
13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n
14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR
15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj
16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4
17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q==
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/server-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL
5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF
6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD
7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw
8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV
9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO
10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp
11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG
12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj
13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l
14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI
15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j
16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0
17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/client_ip/client-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6DCCAdACAQAwgYsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2Fm
5 | bHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxvaJX7fc
6 | RSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot383WfSv8FaSroDep0ZU890
7 | 2GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX4tusFWQOlF1NQkV1z9H3
8 | UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0imeECc7qQMpxElTkUk3ZI
9 | tMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7XPH8+n2yOzSj7k5tnC0oW
10 | IJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/mWx57Hz1X/iBn1DZNm1cZ
11 | 9MFfl7+8ES6mPQIDAQABoBcwFQYJKoZIhvcNAQkHMQgMBjEyMzQ1NjANBgkqhkiG
12 | 9w0BAQsFAAOCAQEAwkG2tUNkGWXxl4e6u59JfrNdhLTBWnO4wngF6xH64jGcHbEg
13 | Io42yQrBeZ8jmjpGrYbCdNlQqtx5veGgAfOD+wXm4KGJwbAacpBqajCY+orvxy3n
14 | s1h2v3NZ/D+74twsEE8TQeHAq4Z6wqbL4y7SkQnNyaePMHhM6tK1FGnohyUu/bCR
15 | brocrjuc+wsgcvV2m6rLxkO2nLnfAFvzR7iIXobr5dr0OqHYBjbvIBIFRt6YB4cj
16 | m4V7EtKBFxVmL1/Qnim3L7/MqHcG5IEJHu/2GehfXn/7IGE9PvuZlcDeFhGStAn4
17 | DJtLKY4QWrLDWgoZmj5nPNwNZy47gqAsCF2n/Q==
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server/server-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC6jCCAdICAQAwgY0xCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEaMBgGCSqGSIb3DQEJARYL
5 | YWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDgXIF
6 | JJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewogujsEXbFPEzNJb/GAOxwD
7 | HppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7DktnMJSdNnPqOaD+am+wn7Iw
8 | +qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4a/xn1SwyETPs31fx6mmV
9 | 01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDLEf3dn7ahwpJrvDPSBRCO
10 | rw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igwOob4Yj/uwCRpOAyzWRLp
11 | 2oaeg3HtfYDWs2/LAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2MA0GCSqG
12 | SIb3DQEBCwUAA4IBAQBpIJfk4hmga2x+rHmYB0xc6WIvUAblrpkwaaO2k9+ZbeLj
13 | d+8IDWfrA5H5RUQwaI4Q9fmOLTtR2aNMj6OoOCEj/F7DI4MXMr+Z+NA1zLeNla5l
14 | BwX/MYJYP/ElZLb9ygG/wZeoFLnqhz6LW7iJjdB2Vtg6o8goeIpzi1nfYZHc4OnI
15 | y9THVZA3xR7JTBXM7p/K3dBcfYz9H7Uu7CW3v0BnVK1v+Qxa35C+dR3Eug/sdh+j
16 | zPSzxuuPQAYfXSozQgGxN8pNAvOeVzqMVcJNKnkcAr0HOAtvHo1ulmGc2lf8W8b0
17 | ObP19R28lV0vbkK1jkmXvTw80L15kxfhAlyVjyUH
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/SSL/server_domain/server-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC8DCCAdgCAQAwgZMxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNoLmNvbTEaMBgGCSqGSIb3
5 | DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
6 | AQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixnwvkzmbp21BlCeDerQVQu
7 | s5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpiJ5DBCDvWDjluW9dg/ujw
8 | 4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNCpItMjATAdMv7ElWzZ84H
9 | y54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdrQ/QwE1v4dRAfLYi/Rop+
10 | ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3nR7YNF0t/j/KIFR8/6Ve
11 | OPUMAOu6UL2G4P7UxWpt1TmhAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2
12 | MA0GCSqGSIb3DQEBCwUAA4IBAQB3n/LAP3kfvoLs7rkUPjpMl6Pazf++EoV4fJrT
13 | 9VyO1Gh1pwKDtVewS0CaEcvwkpgdY80zB8tQhshiXEMjBwb7qhJGuFLnSLwYT7Qr
14 | gdN/x5dS0CjwW2Afyo/wnNdKf6Xa9dMq1X2pX2Hr7sJxQej/Jv8cXbFWUPuN74GF
15 | pTxKqqDnza3+PWEKv1kDL0Xc7DAZ1xYIZ8Dk+M633HgYdYMt4Lm/RBif2/++x/Wu
16 | P5pWgdCe8cUT8DJFzBC4OacDtcC7FEne/QyoPM3qLF9Fv53Q39vmXsxESC20nmMo
17 | gdy8q0YlRhjI2xLGZvSuqXfdQZE0pR6oAraH9j0ElqdVQy6w
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server_domain/server-req.csr:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE REQUEST-----
2 | MIIC8DCCAdgCAQAwgZMxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTEOMAwG
3 | A1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNoVmVyc2lvbjENMAsGA1UE
4 | CwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNoLmNvbTEaMBgGCSqGSIb3
5 | DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
6 | AQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixnwvkzmbp21BlCeDerQVQu
7 | s5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpiJ5DBCDvWDjluW9dg/ujw
8 | 4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNCpItMjATAdMv7ElWzZ84H
9 | y54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdrQ/QwE1v4dRAfLYi/Rop+
10 | ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3nR7YNF0t/j/KIFR8/6Ve
11 | OPUMAOu6UL2G4P7UxWpt1TmhAgMBAAGgFzAVBgkqhkiG9w0BCQcxCAwGMTIzNDU2
12 | MA0GCSqGSIb3DQEBCwUAA4IBAQB3n/LAP3kfvoLs7rkUPjpMl6Pazf++EoV4fJrT
13 | 9VyO1Gh1pwKDtVewS0CaEcvwkpgdY80zB8tQhshiXEMjBwb7qhJGuFLnSLwYT7Qr
14 | gdN/x5dS0CjwW2Afyo/wnNdKf6Xa9dMq1X2pX2Hr7sJxQej/Jv8cXbFWUPuN74GF
15 | pTxKqqDnza3+PWEKv1kDL0Xc7DAZ1xYIZ8Dk+M633HgYdYMt4Lm/RBif2/++x/Wu
16 | P5pWgdCe8cUT8DJFzBC4OacDtcC7FEne/QyoPM3qLF9Fv53Q39vmXsxESC20nmMo
17 | gdy8q0YlRhjI2xLGZvSuqXfdQZE0pR6oAraH9j0ElqdVQy6w
18 | -----END CERTIFICATE REQUEST-----
19 |
--------------------------------------------------------------------------------
/C_webserver/http/response.c:
--------------------------------------------------------------------------------
1 | #include"response.h"
2 |
3 | struct BasicResponse* responseFirstLine(int scode,char* description){
4 | struct BasicResponse* rst = (struct BasicResponse*)malloc(sizeof(struct BasicResponse));
5 | sprintf(rst->state,"HTTP/1.1 %d %s\r\n",scode,description);
6 | rst->len = strlen(rst->state);
7 | return rst;
8 | }
9 |
10 | struct AdditionalResponse* initResponse(char* key,char* value){
11 | struct AdditionalResponse* rst = (struct AdditionalResponse*)malloc(sizeof(struct AdditionalResponse));
12 | sprintf(rst->state,"%s: %s\r\n",key,value);
13 | rst->len = strlen(rst->state);
14 | return rst;
15 | }
16 |
17 | void addResponse(struct FinalResponse* res,struct AdditionalResponse* ar){
18 | char* tmp = res->data+res->len;
19 | memcpy(tmp,ar->state,ar->len);
20 | res->len = res->len+ar->len;
21 | free(ar);
22 | }
23 |
24 | void addBasicResponse(struct FinalResponse* res,struct BasicResponse* br){
25 | memcpy(res->data,br->state,br->len);
26 | res->len = br->len;
27 | free(br);
28 | }
29 |
30 | void addTail(struct FinalResponse* res){
31 | memcpy(res->data+res->len,"\r\n",2);
32 | res->len = res->len+2;
33 | }
--------------------------------------------------------------------------------
/C_webserver/http/includes/response.h:
--------------------------------------------------------------------------------
1 | #ifndef _RESPONSE_H_
2 | #define _RESPONSE_H_
3 |
4 | #include"global.h"
5 |
6 | struct BasicResponse{
7 | size_t len;
8 | char state[stateLen];
9 | //--------------------------------------------------------------
10 | /*
11 | char connection[12]; //close or keep-alive
12 | char allow[]; //Allow: GET, POST
13 | char keepAlive[20]; //Keep-Alive: ???
14 | size_t contentLength; //Content-Length: num
15 | char transferEncoding[]; //Transfer-Encoding: chunked
16 | char contentType[]; //Content-Type: string
17 | */
18 | };
19 | struct AdditionalResponse{
20 | size_t len;
21 | char state[dflen];
22 | };
23 | struct FinalResponse{
24 | size_t len;
25 | char *data;
26 | };
27 | struct FileInfo{
28 | size_t len;
29 | int chunked;
30 | char type[dftypelen];
31 | char *fpath;
32 | };
33 |
34 |
35 | struct BasicResponse* responseFirstLine(int scode,char* description);
36 | struct AdditionalResponse* initResponse(char* key,char* value);
37 | void addResponse(struct FinalResponse* res,struct AdditionalResponse* ar);
38 | void addBasicResponse(struct FinalResponse* res,struct BasicResponse* br);
39 | void addTail(struct FinalResponse* res);
40 | #endif
--------------------------------------------------------------------------------
/C_webserver/SSL/all/ca-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo
8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG
9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy
11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f
12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE
13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy
14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl
15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB
16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV
17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v
18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W
19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq
20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk
21 | Dv1+KXmmHdU5OaQUpyuDsN0=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/SSL/ca/ca-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo
8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG
9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy
11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f
12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE
13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy
14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl
15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB
16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV
17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v
18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W
19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq
20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk
21 | Dv1+KXmmHdU5OaQUpyuDsN0=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/client-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY
9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38
11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX
12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i
13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X
14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m
15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA
17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy
18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe
19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh
20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe
21 | x5/u67ewVMFW42mvLtuSw/CX
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/ca-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo
8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG
9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy
11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f
12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE
13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy
14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl
15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB
16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV
17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v
18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W
19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq
20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk
21 | Dv1+KXmmHdU5OaQUpyuDsN0=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/ca/ca-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnTCCAoUCFE6LmALvewpst3nJfL070p2PFkR3MA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzU0OVoXDTMwMTAyNzA2MzU0OVowgYoxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGjAYBgNVBAoMEWFmbHlpbmdmaXNo
8 | VmlzaW9uMQ0wCwYDVQQLDAR0ZXN0MRQwEgYDVQQDDAthZmx5aW5nZmlzaDEaMBgG
9 | CSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
10 | ggEKAoIBAQDYa6Ka07ExL3ogOi4wkTsdKKYA2B/q6nR010HbpyDJ3MFes394fYMy
11 | Cw0SwNR2Ufze+Riys1+ek179TI2I9gfADg1+x1laCSNslAsSVpDQVAJjspCpJ72f
12 | YsAKOdx4SzIGWfdokWpyG61wl372/iwPzodoo5jTkH3Kq9tOduU4h5olGBw0Y5oE
13 | eibobvXCeoMpfsN7kT9ryN9ZNFMrbo72oyil4B1J3ncAWNLq26G3zsB3fFLf/MBy
14 | tuSiIkC6vIONaQzTZ2JnVwIEWwv10nPq44ioo3u8Zpv/TcNNt3NjeB7Yg1ZOUGCl
15 | nU5vTxtxCJmSG6VNndClZomMAn1jJDajAgMBAAEwDQYJKoZIhvcNAQELBQADggEB
16 | AHmTRk1QSZpUhsTLNluH6JiXDq0MyroypPfLhw9DZdh03LA+phGw2Bs9AeWf5qwV
17 | 4Z2txU5FKNyQUODKqC3qtFC8riLqncwhZ87QEEWUuTRWBbpTmsNjZl40Tr0vir9v
18 | WAy7gmke18YfRjdRpep7DDmHb3+PxkllSzKD4N78Ruhm4vIHTagoOiYmkgRMt94W
19 | T7YNI4LE8OGq+5WtXb6V8H5gzoWexBsh87fIJuYpB5xEMnV0BSYVs5Nnlj62qAqq
20 | ijwKav+Nok5PfL5Ozn+aple4UL8tk0qjF6BdFyQPRZ5Iqx5KntMeQ0EhrMMmhhzk
21 | Dv1+KXmmHdU5OaQUpyuDsN0=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/server-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa
9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB
10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog
11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn
12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4
13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL
14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw
15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD
16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc
17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz
18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ
19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc
20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV
21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/SSL/client_ip/client-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY
9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38
11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX
12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i
13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X
14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m
15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA
17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy
18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe
19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh
20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe
21 | x5/u67ewVMFW42mvLtuSw/CX
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/SSL/server/server-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa
9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB
10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog
11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn
12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4
13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL
14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw
15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD
16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc
17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz
18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ
19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc
20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV
21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/client-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY
9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38
11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX
12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i
13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X
14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m
15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA
17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy
18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe
19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh
20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe
21 | x5/u67ewVMFW42mvLtuSw/CX
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/server-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa
9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB
10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog
11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn
12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4
13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL
14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw
15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD
16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc
17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz
18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ
19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc
20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV
21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/client_ip/client-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDnjCCAoYCFC+Cy4PCoLTOw+sODIKSP+nzTpqkMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzgzN1oXDTMwMTAyNzA2MzgzN1owgYsxCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VoYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UEAwwLYWZseWluZ2Zpc2gxGjAY
9 | BgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
10 | MIIBCgKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73Ot38
11 | 3WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG87kwX
12 | 4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWMHe0i
13 | meECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8cY7X
14 | PH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1Pu/m
15 | Wx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
16 | AQBd9JzeFH9PLRPn5OyTSev4RG89xaq2qWPhOoREU3IDg3/ulGh6geptkfnXXCzA
17 | ZRU8KCKIp01fOhApYzCuxRWkyLTpz6pyO2XyK/dCYw/wVQK/bYnIipHIJVTpmmMy
18 | X6rF1QrhmDu4luWmKwJkkMVDBwTPtsjl0apTaR6jxHHUnP3I8TH/s2GONB+wBMKe
19 | m7L7FWfCdyrLWfKTyGnd8jcW4dqBMlKi9N/B8iFLv8ApKnKnk4lXzO4cC+RS/ohh
20 | z//My1uxt3IdwMQMftjeNryDKzN+1eNcplB6le21bksBd6a60J0Jm97rzTMnyRPe
21 | x5/u67ewVMFW42mvLtuSw/CX
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server/server-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDoDCCAogCFC+Cy4PCoLTOw+sODIKSP+nzTpqjMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA2MzcwNFoXDTMwMTAyNzA2MzcwNFowgY0xCzAJBgNVBAYTAmNuMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEWMBQGA1UEAwwNMTkyLjE2OC4xMzcuMjEa
9 | MBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEBAQUAA4IB
10 | DwAwggEKAoIBAQDDgXIFJJ8gHBVK0byvlOn8YDLZPLQFOvgzkCy+5swGE3cGewog
11 | ujsEXbFPEzNJb/GAOxwDHppoJOw7YsU4oEvpW82SftAeJMSBFAaAUxidvqZ7Dktn
12 | MJSdNnPqOaD+am+wn7Iw+qDoFw0oHWTnh7/ANQHD+mrBSXD1/h4+nsL8+3k5JYo4
13 | a/xn1SwyETPs31fx6mmV01KJvc5YoIMudtGBZnN+jpKQ4pX4iZK1nBMja+d8NCDL
14 | Ef3dn7ahwpJrvDPSBRCOrw4Hvtx0n9LFwhWeOoFbwhp63MPK3TiQ3wNGMP/m2igw
15 | Oob4Yj/uwCRpOAyzWRLp2oaeg3HtfYDWs2/LAgMBAAEwDQYJKoZIhvcNAQELBQAD
16 | ggEBAKMFHOpoBpHbjpo39iDmaqgpUpkoLUG6MWyxEnugSnDpFnv7bCGX+mzxPYSc
17 | cPtScN3ZKWPNGvGs4W95TxPwHcpQSuQGEQQRATh3lwlvrJSqQrWYjehQT5sMlDrz
18 | ziDrOEN2CGzCE0Arv7DvG1aj9+bjENHpf16sYq2SBB3SIhfEQQ458CnHa5El0HVQ
19 | F8k2hQFym+z4ZZA3CjmiSf8fFgatXplvmQlZfaR98AL1ZBdw9FQMGaBzQ/BZG3Qc
20 | VP9FwfFbyN/w5oB5rGsTty+FQd6XfsAZLaE7yzQqkiXsW6134gap2EmzHXf2QcVV
21 | dUZBz1EtA3HkT5S5kPI5MzGL6Wc=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/SSL/server_domain/server-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDpjCCAo4CFC+Cy4PCoLTOw+sODIKSP+nzTpqlMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA4MzgzMFoXDTMwMTAyNzA4MzgzMFowgZMxCzAJBgNVBAYTAkNOMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNo
9 | LmNvbTEaMBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEB
10 | AQUAA4IBDwAwggEKAoIBAQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixn
11 | wvkzmbp21BlCeDerQVQus5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpi
12 | J5DBCDvWDjluW9dg/ujw4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNC
13 | pItMjATAdMv7ElWzZ84Hy54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdr
14 | Q/QwE1v4dRAfLYi/Rop+ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3
15 | nR7YNF0t/j/KIFR8/6VeOPUMAOu6UL2G4P7UxWpt1TmhAgMBAAEwDQYJKoZIhvcN
16 | AQELBQADggEBAMlct80kKtw81bqFhM8JjALqEaBYpkbyfb2bp07Dp4GmmUBtqtw5
17 | 38AbQuShRVGcEPVdoJuNFyZ4Dec6im/kmfeh420V5x28o3vozOce5MOzdGGIlT5L
18 | Agj3lXOogHjtfKJTjTo6gbjcZMoP9K9OmN/6tjMbYKmfJHKHtxpAsTfWPXTeW6vy
19 | PYf8Quu/pCtbqsh0blaTZHfml8whSEN3f87EhWXkzypX3vZotXQuRQ7y/TP/x8/I
20 | slJ3WEdzTVZ6KWpswa8mUIZdzJByOlosw7zk5F213YKojt5PVl5huWELBMVjZwMo
21 | VenTGhv8OIP6gkfngLh6iGT/fw63Ev2P410=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server_domain/server-cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDpjCCAo4CFC+Cy4PCoLTOw+sODIKSP+nzTpqlMA0GCSqGSIb3DQEBCwUAMIGK
3 | MQswCQYDVQQGEwJjbjEOMAwGA1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMRow
4 | GAYDVQQKDBFhZmx5aW5nZmlzaFZpc2lvbjENMAsGA1UECwwEdGVzdDEUMBIGA1UE
5 | AwwLYWZseWluZ2Zpc2gxGjAYBgkqhkiG9w0BCQEWC2FmbHlpbmdmaXNoMB4XDTIw
6 | MTAyOTA4MzgzMFoXDTMwMTAyNzA4MzgzMFowgZMxCzAJBgNVBAYTAkNOMQ4wDAYD
7 | VQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xGzAZBgNVBAoMEmFmbHlpbmdmaXNo
8 | VmVyc2lvbjENMAsGA1UECwwEdGVzdDEcMBoGA1UEAwwTd3d3LmFmbHlpbmdmaXNo
9 | LmNvbTEaMBgGCSqGSIb3DQEJARYLYWZseWluZ2Zpc2gwggEiMA0GCSqGSIb3DQEB
10 | AQUAA4IBDwAwggEKAoIBAQC/JgIC+GtfR/vDegZskJGEVi1uCPKzcn62WJh7/Ixn
11 | wvkzmbp21BlCeDerQVQus5Qc26TBbIBO2XxVMlG2Adqy8i2kPbd/mJ/ecLRG9zpi
12 | J5DBCDvWDjluW9dg/ujw4MOqnD6hRMSGa7vlY/owFDJusL/83I/dNEqUdJHE/UNC
13 | pItMjATAdMv7ElWzZ84Hy54DA+nhcT53+oGtdKZQWkARYA5634eHfKvrHcYVcqdr
14 | Q/QwE1v4dRAfLYi/Rop+ogr8IY/OPjkP+gNnNJk9PUfUQw8HPqnPlQPwRy20Cuv3
15 | nR7YNF0t/j/KIFR8/6VeOPUMAOu6UL2G4P7UxWpt1TmhAgMBAAEwDQYJKoZIhvcN
16 | AQELBQADggEBAMlct80kKtw81bqFhM8JjALqEaBYpkbyfb2bp07Dp4GmmUBtqtw5
17 | 38AbQuShRVGcEPVdoJuNFyZ4Dec6im/kmfeh420V5x28o3vozOce5MOzdGGIlT5L
18 | Agj3lXOogHjtfKJTjTo6gbjcZMoP9K9OmN/6tjMbYKmfJHKHtxpAsTfWPXTeW6vy
19 | PYf8Quu/pCtbqsh0blaTZHfml8whSEN3f87EhWXkzypX3vZotXQuRQ7y/TP/x8/I
20 | slJ3WEdzTVZ6KWpswa8mUIZdzJByOlosw7zk5F213YKojt5PVl5huWELBMVjZwMo
21 | VenTGhv8OIP6gkfngLh6iGT/fw63Ev2P410=
22 | -----END CERTIFICATE-----
23 |
--------------------------------------------------------------------------------
/C_webserver/http/includes/Http.h:
--------------------------------------------------------------------------------
1 | #ifndef HTTP_H
2 | #define HTTP_H
3 |
4 | #include
5 | #include
6 | #include"global.h"
7 | #include"request.h"
8 | #include"response.h"
9 | #include"pipe.h"
10 | #include"filesystem.h"
11 | #include "TCP.h"
12 |
13 | typedef enum HttpKind
14 | {
15 | Error_400,
16 | Error_404,
17 | Error_500,
18 | Error_501,
19 | Success_200
20 | } HttpKind;
21 |
22 | typedef struct Eventarg{
23 | struct event_base* base;
24 | struct event* event;
25 | Socket* sock;
26 | int firsttime;
27 | } Eventarg;
28 |
29 | void accept_cb(int fd, short events, void* arg);
30 | void close_cb(int fd, short events, void* arg);
31 | int DealWithRequest(Socket sock); // 成功时返回0,存在错误返回-1
32 | int ReadHttpHeaderBytes(Socket sock, char *data, int maxBuffer);
33 |
34 | void printRequest(struct Request* req);
35 | void printResponse(struct Block* block);
36 |
37 | void freeRequest(struct Request* req);
38 | void freeResponse(struct FinalResponse* res);
39 | void freeFileinfo(struct FileInfo* fi);
40 | void freeBlock(struct Block* block);
41 |
42 | void sendResponse(struct Block* block, Socket sock);
43 | void CloseHttp(Eventarg* eventarg);
44 |
45 | int ResponseHttpWithHtml(Socket sock, HttpKind httpKind, char *htmlPath);
46 | int ResponseHttp(Socket sock, char *contentType, char *filePath, Bool allowChunked);
47 |
48 | #endif
--------------------------------------------------------------------------------
/C_webserver/SSL/all/ca-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/
3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ
4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc
5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS
6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW
7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2
8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9
9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc
10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO
11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH
12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W
13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs
14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT
15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa
16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP
17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf
18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci
19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl
20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC
21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR
22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ
23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78
24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5
25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY
26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/SSL/ca/ca-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/
3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ
4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc
5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS
6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW
7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2
8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9
9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc
10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO
11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH
12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W
13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs
14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT
15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa
16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP
17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf
18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci
19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl
20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC
21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR
22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ
23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78
24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5
25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY
26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/client-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73
3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8
4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM
5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8
6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1
7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0
8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX
9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS
10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh
11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib
12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5
13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+
14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T
15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d
16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt
17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed
18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119
19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY
20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3
21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7
22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T
23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk
24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0
25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC
26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU=
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/SSL/all/server-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK
3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L
4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK
5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg
6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too
7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3
8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI
9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX
10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua
11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ
12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW
13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq
14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ
15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM
16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2
17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD
18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo
19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow
20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P
21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI
22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF
23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH
24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY
25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK
26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/SSL/server/server-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK
3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L
4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK
5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg
6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too
7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3
8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI
9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX
10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua
11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ
12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW
13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq
14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ
15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM
16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2
17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD
18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo
19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow
20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P
21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI
22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF
23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH
24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY
25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK
26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/ca-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/
3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ
4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc
5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS
6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW
7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2
8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9
9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc
10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO
11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH
12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W
13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs
14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT
15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa
16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP
17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf
18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci
19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl
20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC
21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR
22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ
23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78
24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5
25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY
26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/ca/ca-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEA2GuimtOxMS96IDouMJE7HSimANgf6up0dNdB26cgydzBXrN/
3 | eH2DMgsNEsDUdlH83vkYsrNfnpNe/UyNiPYHwA4NfsdZWgkjbJQLElaQ0FQCY7KQ
4 | qSe9n2LACjnceEsyBln3aJFqchutcJd+9v4sD86HaKOY05B9yqvbTnblOIeaJRgc
5 | NGOaBHom6G71wnqDKX7De5E/a8jfWTRTK26O9qMopeAdSd53AFjS6tuht87Ad3xS
6 | 3/zAcrbkoiJAuryDjWkM02diZ1cCBFsL9dJz6uOIqKN7vGab/03DTbdzY3ge2INW
7 | TlBgpZ1Ob08bcQiZkhulTZ3QpWaJjAJ9YyQ2owIDAQABAoIBAQCD5HTgboraMtj2
8 | sv5bUub3ykIA2bX58JCwdE8KkjwFSaf/Et1ojPVbliiNeT8CLM0zBhPrNC3d8mo9
9 | bF4FTgtDHE1VKiBmIpOYJFDrCB6RF+Gs6LIIpNOHQyNOGB0ooosGG+YPsC9zAzMc
10 | HvedhyFLMM6NEsaciL5guYOZuhPP8pUzgHlX+QbYi5BSebbxIUtVkExgyLfwTpIO
11 | f79X5pQJa6PKMoApBU+eH+lhH2e4UHYJhxNeqXnxvYBWM01LsPHT+AvEsFqZAotH
12 | R9sPwGvfw+euf51AV5Xe5IIO0judyFe2NRgHNSCJtqFTQrP5c0r+kzg8c44qZe/W
13 | mRDxrFuhAoGBAOypoKYNPuGnfqHsAWg7GDrBDJNxFg57uavljqRAe8l9mf1t8SUs
14 | HKGtCyNKyMqeB+fhREtTTnZvD48B/vdLPr17Ju+kmgf3pMdNG68/xl9WsnjBz0aT
15 | z7saf4olr4aRTZPyBG5w/o1BJhwUwa526sFhalpBQHD/98VKvvfUuZJPAoGBAOoa
16 | mARXRvsQfM8ET8B62F7f5eGu0RNLCMAmFE0pG/kIIEl1yM3Xa+OcEYQIhQdNg5TP
17 | xSNHeimJDdlvTIRIQAbNdVDQX/vzKbPlqJ5frK6dEGBqqpkY+F4Leo8TPH5ygmVf
18 | /cAffC6fGykpvJRocY0b3CSEC+C5LHOEGPBs7KVtAoGAE/6s3PqngmclUsbew5Ci
19 | lmwzBM38IBMh97z4VTZBfx+GgBvm0M4uSRaWp0+tMTkyz8t/eqG6MlVlyh5QDVKl
20 | JVsfSgXtIZkxqckA+sh3mRx5DazKN1tLpLIzbleKweLK3CIJb89KImMLtjmmt3fC
21 | k74IP0HeEO3/YALVqZimaQ8CgYAgsuo84Pv3IYxtVgrVtdL3HYr8hPCLI1XrkOYR
22 | CQbxN+Nan2sW5VoahrgjmxUJuhgA9yxwCxHTL2OR1Wv4pibbTGNwkEp35LUUfaWZ
23 | yX9TPHkHHp8Jl2VJrYzG40b12oTAKDJHXZ543JxsmXnPuO7zaMrNBuypzPOahv78
24 | xhof2QKBgEB5yS0/qH5Y6k8vijLZkwNmp9xgn49H6S4LHy5CHenuAE8DLn1w9RO5
25 | e3GpB58EoqArGxTXrDD1xPnM6X9DDv81KWZkjGJNF75gUs+4w7BfVpdiZ1dNMntY
26 | xC8xpo/1Z2acQ6sSjIGPaTSZP9wCQmCFY+iUaEseZyTjDaWyAzQK
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/SSL/client_ip/client-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73
3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8
4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM
5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8
6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1
7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0
8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX
9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS
10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh
11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib
12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5
13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+
14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T
15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d
16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt
17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed
18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119
19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY
20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3
21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7
22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T
23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk
24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0
25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC
26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU=
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/client-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73
3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8
4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM
5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8
6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1
7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0
8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX
9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS
10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh
11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib
12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5
13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+
14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T
15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d
16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt
17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed
18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119
19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY
20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3
21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7
22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T
23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk
24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0
25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC
26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU=
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/all/server-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK
3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L
4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK
5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg
6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too
7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3
8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI
9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX
10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua
11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ
12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW
13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq
14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ
15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM
16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2
17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD
18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo
19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow
20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P
21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI
22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF
23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH
24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY
25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK
26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server/server-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAw4FyBSSfIBwVStG8r5Tp/GAy2Ty0BTr4M5AsvubMBhN3BnsK
3 | ILo7BF2xTxMzSW/xgDscAx6aaCTsO2LFOKBL6VvNkn7QHiTEgRQGgFMYnb6mew5L
4 | ZzCUnTZz6jmg/mpvsJ+yMPqg6BcNKB1k54e/wDUBw/pqwUlw9f4ePp7C/Pt5OSWK
5 | OGv8Z9UsMhEz7N9X8eppldNSib3OWKCDLnbRgWZzfo6SkOKV+ImStZwTI2vnfDQg
6 | yxH93Z+2ocKSa7wz0gUQjq8OB77cdJ/SxcIVnjqBW8IaetzDyt04kN8DRjD/5too
7 | MDqG+GI/7sAkaTgMs1kS6dqGnoNx7X2A1rNvywIDAQABAoIBACcqYnYnTP14wsc3
8 | Vy5xjaJyfx1H7ORzWM+znVMtF0hMU/bnZTMDO9l3D5NAzHB0zZObw9PYKKSeaPjI
9 | o6vhaPO54WfsobK4OOmG4nqIqxDG5cEXLwHgGJWaGASfQOJW3kMq6t6nBt8X5xnX
10 | MaS0bDSMKeth2ksYdFnDa7mtwnA9cmvsVUFWH0Kb3GIHEvIkrBW0NySx09Torpua
11 | gPENHC/SLH9Wp2iq0buUbxqZ8zhQd23LUyuuAlzFE+x4gm1ElVWiVfdKoege3kyZ
12 | fWJy1j0ZSQOqbIoBg782R5W21o2i4ZJHm6zyHrxLPpTdgO7n0TA4j3TfIBekKexW
13 | /tBHD0kCgYEA+jTo6E1LxVsK5yt6FkFXFpcmKrH+uPU7c39JWET9AXsU4KVvEAoq
14 | aE7Z9UnBGHf1tU/SZrmqL9mD5KJMZdJiUSAuTmmdE7GITx9O2/wnf3VA+dmHgBQJ
15 | aHyRG/3vNDxOO2HPIjl5hHpawotyqdV/TXOnGkLV2rrkQbHyS1OZPXcCgYEAyAhM
16 | IW180qLjwTdFGrizjsbrsdtUXYxjPoL6YbFgcKNG8MiQzY0rSqZZM8um67qAXCE2
17 | to7ge2xhOPre9n6ARFctAmuQ+EZTcO8Rjd2V+LBYRZqJD/ieA0EnkyV7TE8tF9XD
18 | wYgfIwIdWbPytzrZ1bDzAZMPQo+iqu3IuY2EZU0CgYAZXJGbMnKSv6a8RfDrHpZo
19 | SMvqmf4620i6bVWO5/dJViOIndxDIPSpfAyly2MSSt6SEVQ/a2Rv0zmGTFk4HPow
20 | RPXMpvHwFBfABWll7QpH5ie+66jLd7x4ZeADmVrMzawUYtavHmpN3mUiwSXPRz/P
21 | JwDyLYIl2LnYWuQ3dHLdAwKBgBTU0GDWzx38eq1/fQHYZFKlIpyGE9YeLaOv7jVI
22 | TJvOVS/0IyhU4EJI6pc7SSnZZU6y4sjGPlh8I+/UKG4RJHh5f6V14EYKxNvI+dIF
23 | Vn3sl3TAMC/qm0IJgf6P87Qxtqd5yoYYD+4MZVQXKlqslUzsvZHXZ8ptvOoCE1pH
24 | g5ctAoGBAOTr9bzuXG73yvd8/x84ElqTgc7Fu+RtbEzcNoV+dzZiHXM6/ejb1NjY
25 | mw1ScFEYWSn8EMNd47QjIWHFwEMPQ+uE07ejcIcXEIJNlByBjjCz7A3zu/DoTpnK
26 | EtFdgrjQcMJ6XOYt+jOQAtWZLsxg9LAJ+UxEwNgYXItf9T7tnHs0
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/SSL/server_domain/server-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAvyYCAvhrX0f7w3oGbJCRhFYtbgjys3J+tliYe/yMZ8L5M5m6
3 | dtQZQng3q0FULrOUHNukwWyATtl8VTJRtgHasvItpD23f5if3nC0Rvc6YieQwQg7
4 | 1g45blvXYP7o8ODDqpw+oUTEhmu75WP6MBQybrC//NyP3TRKlHSRxP1DQqSLTIwE
5 | wHTL+xJVs2fOB8ueAwPp4XE+d/qBrXSmUFpAEWAOet+Hh3yr6x3GFXKna0P0MBNb
6 | +HUQHy2Iv0aKfqIK/CGPzj45D/oDZzSZPT1H1EMPBz6pz5UD8EcttArr950e2DRd
7 | Lf4/yiBUfP+lXjj1DADrulC9huD+1MVqbdU5oQIDAQABAoIBADEoPyAwbryEMJTm
8 | zrwguauE1g4UMwY/DaMrSZupKRqOI7RHdpKUnSJg9EAQfuu7tv1s5wPvOVgNylHG
9 | rQjXlTyr110DmiswPvzfkx0k+1i+wBVEXs7/vXlKGSuSoqk/xFId+GVU4A2Jqzqk
10 | 6XRv3UBmKBmJR14l0oA3Mj2svB1o7LF0BnVS2oJ5nAzvRCWWGfLQJZi2gdv4EUQx
11 | A+kvF3Kpt8jBp4nhI1TpwBkOhdG5KBmjwE6JsImT3h2rtYGIAsA8a4zfm2o5/kfJ
12 | pb0uuH5FxfsWOI9/5mLsrmETZTa7fhCWDVlWCqntoZIlkpJMxGJANiXcc4vJm24R
13 | MraqOrkCgYEA/Sa4w9OsKESU81fGTke2lF4eXIKpAWyXnecpBuZKJXMw5XpozQLx
14 | ZBdM+4h3VqDtA7CfJfrFdtKXb/pB1bs/DIgHTNsDT15A7McbPR5cuUDmbVBx0pGz
15 | ArkhBN3/urNHnfjL1hcPJ2XJTxeugp84pTQeP1ZFQ7aRBV6apqFGtgMCgYEAwUyr
16 | H/le9H/l0VKO3E0BJZQYjTSN7u8a37Mu2kjvYG544dFTJpyX9d2FMaxxx1LgWCMq
17 | izLJpbRp/eRADEPVo2fASJS0c/raZ+v0lCBEgdzAmoga8wrXAmsE92Iu8Y+pfOwa
18 | 0gMqsq9e1gI0asaLjod24l9TuZrjr9Q1oOVsIosCgYB5W+jTqFQt8cLebcPZnzN+
19 | KSiw/Mp8rkx5HGpkrl35WiGkwWwgbDrA2xLCuwdK9lbpn/CLyo6Dii2jNvv8tIlj
20 | PosRYyVRFURWvpTmVfnprZ1J5njKk6KXuZyEstB39p5ssus1NVTEdF1vl1DHugDz
21 | 4epmPrtx3MHlKxdErqgxdQKBgGAmWcyqxy/JWrCXZ1Zvu01M8DV02dDrAKwbPgf4
22 | VZHbAagZ7kl7hR8YVEOUKnhiYhOVUnkxBxq0tjBDVBSFvYPtfLjdtzElq3Qb62mu
23 | 70TFYMy9POJ+FtsuDqdbIEyqED2CWAj06E0/bGX5bMdcAVkhSuJpVoUxZWY1oYNp
24 | +zLnAoGBAOQ3Qu4Bm76drrzGQ4rszTGRk3APhcbSnS+cIcB48cpn5/Sv8I/ofTxa
25 | P/VF9GZDy6FYzAS8GF/m5O8isVdj1nl3wcowh3mAxO+aAooLvF2F2abtJNMK9bTL
26 | a7YHmJAkzovlupKi3ZAVbjW0qPMKo0kRKzuyAvQ3EYB8L9je5F+J
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/client_ip/client-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEogIBAAKCAQEAxvaJX7fcRSDqaAvhBwI1TnFTjLk907VeswMrX8BWEkhwYt73
3 | Ot383WfSv8FaSroDep0ZU8902GW6haU07x7xtsQIdS08ZdC1AdVmZLDeehgd+RG8
4 | 7kwX4tusFWQOlF1NQkV1z9H3UJdBsMBV+MWnS3hUGyDD0+nUDyQkaEZmlUHP4SWM
5 | He0imeECc7qQMpxElTkUk3ZItMnSSWW+b+LAUMVil+svKauG3OYvVslOsGv0n0R8
6 | cY7XPH8+n2yOzSj7k5tnC0oWIJzwpMWjIyoRRBD0addz1GT3VsyC9JEqOfdCotr1
7 | Pu/mWx57Hz1X/iBn1DZNm1cZ9MFfl7+8ES6mPQIDAQABAoIBADzUgXmvV/wWrTQ0
8 | dY9UAIJEKbw7ooiIyjRHAsranjYmyZ2g98uatUXoCUoxTm7MYmXphCXYpqvGpnlX
9 | 4lA9kL9FPiS9ONsULVMrMIwWe16u4vMUlkPxJdhpOzqrBb4crJNXc0aftlKAfEgS
10 | 9fYCUDzFxEkrAlRXCEu8zBjJdXGqTGTJweERnrLMX18lv/IrZxL+6m8C24YMHuFh
11 | NpIVGhtYxTDhUZlVD9dxMvCpBPnENVr7Z8882MpbQORazMKCsL115eunqQcrBEib
12 | 4M1iea89zmsB7eYaah8F6mCz+CLr5IPD7XVK9PGfYEdHHVo6BdsbDL+kdPi3dwT5
13 | 48IIT00CgYEA5P7EZTLTgZuafpBXtRV+xS9kVvP26bI5DOyzsPRoiuIUYKvw/9/+
14 | fnQxQuJuWsBY6CfHZe6S6mNe4nPqP+1F5aeK2vEF1kvnp4g9L1HQztE4NGIqlj7T
15 | m/sLgQQ9NP6Fb/sv9+JcZ+SN9aEe3o0CaADbIgrbeE5VWVmd7pd9YbcCgYEA3m0d
16 | uP4krvPWFL1wVXLNRZEeElGITskGewKR4eX8Pn90od+g+Vm27qvE8/6Ox0mBsMFt
17 | sfDQaJWqqTdoYiZusJP9L6vbzn50T9/71+D/BOvYaNVr35b4HUJ7WIDmnq+/W2ed
18 | Rx3j124ql8exbs680jznIxj7pIxQdNRLNtfQp6sCgYADxSoInICc9qnhgZDgG119
19 | 85zMTbH4AQYtb0w6EpwSBUzelpYeMFrpTBJvjnjQp7APCnCe/gGPOFmcktn9eXOY
20 | J10C48r7zz4eJQEU4Vz1ur4ZJrCazqf/Pm/fDOnREIuz30fX5fMthrbLn355nYq3
21 | maQB+HnKjkebc/1Eq1vWGwKBgCL7IDiO57AIMzwRyw/1PSlauFMDNZ/GZ9mCvvS7
22 | Gd+uZeZraEKvBGEm7JO/Di9zdQ0abqkUiYJZP3zbdPQyvSfSLniH28rvAlXpkQ8T
23 | mKfqe5+JKS0B7kWTxhhWNW7xjvPOKOMdZU7lSZeTVWlq5DFgWK2haToowyKMnMOk
24 | T3F/AoGAbxm3F6hL8pubyzzF4dMT9CHPEyoiFkRDSFijNKtylqfxGJYcHohMxKp0
25 | 4Hm5xXt2K80Sh3Jx2G1wg/n5kwz/DbYHm6PfgR688o35ZxPf6D2VuO/l7w7qdOTC
26 | gTKWj+uXWjKoWc1rod5ebDm62p9bVZ99weIWG9QHBlfLs+AunGU=
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/SSL/server_domain/server-key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAvyYCAvhrX0f7w3oGbJCRhFYtbgjys3J+tliYe/yMZ8L5M5m6
3 | dtQZQng3q0FULrOUHNukwWyATtl8VTJRtgHasvItpD23f5if3nC0Rvc6YieQwQg7
4 | 1g45blvXYP7o8ODDqpw+oUTEhmu75WP6MBQybrC//NyP3TRKlHSRxP1DQqSLTIwE
5 | wHTL+xJVs2fOB8ueAwPp4XE+d/qBrXSmUFpAEWAOet+Hh3yr6x3GFXKna0P0MBNb
6 | +HUQHy2Iv0aKfqIK/CGPzj45D/oDZzSZPT1H1EMPBz6pz5UD8EcttArr950e2DRd
7 | Lf4/yiBUfP+lXjj1DADrulC9huD+1MVqbdU5oQIDAQABAoIBADEoPyAwbryEMJTm
8 | zrwguauE1g4UMwY/DaMrSZupKRqOI7RHdpKUnSJg9EAQfuu7tv1s5wPvOVgNylHG
9 | rQjXlTyr110DmiswPvzfkx0k+1i+wBVEXs7/vXlKGSuSoqk/xFId+GVU4A2Jqzqk
10 | 6XRv3UBmKBmJR14l0oA3Mj2svB1o7LF0BnVS2oJ5nAzvRCWWGfLQJZi2gdv4EUQx
11 | A+kvF3Kpt8jBp4nhI1TpwBkOhdG5KBmjwE6JsImT3h2rtYGIAsA8a4zfm2o5/kfJ
12 | pb0uuH5FxfsWOI9/5mLsrmETZTa7fhCWDVlWCqntoZIlkpJMxGJANiXcc4vJm24R
13 | MraqOrkCgYEA/Sa4w9OsKESU81fGTke2lF4eXIKpAWyXnecpBuZKJXMw5XpozQLx
14 | ZBdM+4h3VqDtA7CfJfrFdtKXb/pB1bs/DIgHTNsDT15A7McbPR5cuUDmbVBx0pGz
15 | ArkhBN3/urNHnfjL1hcPJ2XJTxeugp84pTQeP1ZFQ7aRBV6apqFGtgMCgYEAwUyr
16 | H/le9H/l0VKO3E0BJZQYjTSN7u8a37Mu2kjvYG544dFTJpyX9d2FMaxxx1LgWCMq
17 | izLJpbRp/eRADEPVo2fASJS0c/raZ+v0lCBEgdzAmoga8wrXAmsE92Iu8Y+pfOwa
18 | 0gMqsq9e1gI0asaLjod24l9TuZrjr9Q1oOVsIosCgYB5W+jTqFQt8cLebcPZnzN+
19 | KSiw/Mp8rkx5HGpkrl35WiGkwWwgbDrA2xLCuwdK9lbpn/CLyo6Dii2jNvv8tIlj
20 | PosRYyVRFURWvpTmVfnprZ1J5njKk6KXuZyEstB39p5ssus1NVTEdF1vl1DHugDz
21 | 4epmPrtx3MHlKxdErqgxdQKBgGAmWcyqxy/JWrCXZ1Zvu01M8DV02dDrAKwbPgf4
22 | VZHbAagZ7kl7hR8YVEOUKnhiYhOVUnkxBxq0tjBDVBSFvYPtfLjdtzElq3Qb62mu
23 | 70TFYMy9POJ+FtsuDqdbIEyqED2CWAj06E0/bGX5bMdcAVkhSuJpVoUxZWY1oYNp
24 | +zLnAoGBAOQ3Qu4Bm76drrzGQ4rszTGRk3APhcbSnS+cIcB48cpn5/Sv8I/ofTxa
25 | P/VF9GZDy6FYzAS8GF/m5O8isVdj1nl3wcowh3mAxO+aAooLvF2F2abtJNMK9bTL
26 | a7YHmJAkzovlupKi3ZAVbjW0qPMKo0kRKzuyAvQ3EYB8L9je5F+J
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/C_webserver/http/request.c:
--------------------------------------------------------------------------------
1 | #include"request.h"
2 |
3 | char* headers[typenums] = {"Connection: ","Accept: ","Content-Length: ","Content-Type: ","Transfer-Encoding: "};
4 |
5 | int requestFirstline(struct Request* req,char* ptr,size_t len){
6 | char *tmp = strstr(ptr," ");
7 | if(tmp==NULL||(tmp-ptr)>=8) return -1;
8 | memcpy(req->method,ptr,tmp-ptr);
9 | len -= (tmp-ptr+1);
10 | ptr = tmp+1;
11 |
12 | tmp = strstr(ptr," ");
13 | if(tmp==NULL) return -1;
14 | memcpy(req->URL,ptr,tmp-ptr);
15 | req->URLlen = tmp-ptr;
16 | len -= (tmp-ptr+1);
17 | ptr = tmp+1;
18 | memcpy(req->version,ptr,len);
19 | return 0;
20 | }
21 |
22 | struct Request* phaser(size_t len,char* buffer){
23 | //return NULL if receive wrong method
24 | char* ptr = buffer;
25 | int slen;
26 |
27 | struct Request* rst = (struct Request*)malloc(sizeof(struct Request));
28 | memset(rst,0,sizeof(struct Request));
29 | slen = headlize(ptr);
30 | if(slen<=3){free(rst);return NULL;}
31 | if(requestFirstline(rst,ptr,slen)==-1){
32 | //Unspport request method
33 | free(rst);
34 | return NULL;
35 | }
36 | ptr = ptr+slen+2;
37 | //----------------------------Phase other headers.
38 | while((slen=headlize(ptr))>0){
39 | //if(strstr(ptr,headers[i]!=ptr)) continue;
40 | if(headhandler(rst,slen,ptr)==false){
41 | free(rst);
42 | return NULL;
43 | }
44 | ptr = ptr+slen+2;
45 | }
46 | return rst;
47 | }
48 |
49 | int headlize(char* ptr){
50 | //extract lines from buffer
51 | int rst = 0;
52 | char* tmp = strstr(ptr,rn);
53 | if(tmp==NULL) return -1;
54 | rst = tmp - ptr;
55 | return rst;
56 | }
57 |
58 | int headhandler(struct Request* req,size_t slen,char* ptr){
59 | if(memcmp(ptr,headers[0],12)==0) memcpy(req->connection,ptr+12,slen-12);
60 | else if(memcmp(ptr,headers[1],8)==0) memcpy(req->accept,ptr+8,slen-8);
61 | else if(memcmp(ptr,headers[2],16)==0) memcpy(req->contentLength,ptr+16,slen-16);
62 | else if(memcmp(ptr,headers[3],14)==0) memcpy(req->contentType,ptr+14,slen-14);
63 | else if(memcmp(ptr,headers[4],19)==0) memcpy(req->Encoding,ptr+19,slen-19);
64 | return true;
65 | }
66 |
--------------------------------------------------------------------------------
/C_webserver/http/WebServer.c:
--------------------------------------------------------------------------------
1 | #include "WebServer.h"
2 |
3 | int RunHttpServer(char *ip, int port, int maxListener)
4 | {
5 | RunWebServer(ip, port, maxListener, HTTP);
6 | }
7 |
8 | int RunHttpsServer(char *ip, int port, int maxListener)
9 | {
10 | RunWebServer(ip, port, maxListener, HTTPS);
11 | }
12 |
13 | int RunWebServer(char *ip, int port, int maxListener, HTTP_KIND flag)
14 | {
15 | Socket serverSocket = InitSocketServer(ip, port, maxListener);
16 | if (serverSocket.sockId < 0)
17 | {
18 | #ifdef OUTPUT_DEBUG_INFO
19 | if (flag == HTTP)
20 | {
21 | printf("HTTP server Socket初始化出错\n");
22 | }
23 | else
24 | {
25 | printf("HTTPS server Socket初始化出错\n");
26 | }
27 | #endif
28 |
29 | return -1; // 程序发生错误
30 | }
31 |
32 | #ifdef OUTPUT_DEBUG_INFO
33 | if(flag==HTTP)
34 | {
35 | printf("HTTP server:%d 启动成功,进程pid= %d\n",port, getpid());
36 | }
37 | else
38 | {
39 | printf("HTTPS server %d 启动成功,进程pid= %d\n",port, getpid());
40 | }
41 | #endif
42 |
43 | while (ALLOW_ACCEPT)
44 | {
45 | Socket clientSocket = AcceptClientSocket(serverSocket, flag==HTTPS?true:false);
46 | if (clientSocket.sockId < 0)
47 | {
48 | #ifdef OUTPUT_DEBUG_INFO
49 | printf("客户端套接字错误\n");
50 | #endif
51 | continue; //出错
52 | }
53 |
54 | if(clientSocket.isHttps && clientSocket.ssl==NULL)
55 | {
56 | #ifdef OUTPUT_DEBUG_INFO
57 | printf("HTTPS监听Socket发生错误,未创建进程\n");
58 | #endif
59 | continue; // https初始化出错
60 | }
61 |
62 | int pid = fork();
63 | if (!pid)
64 | {
65 | close(serverSocket.sockId);
66 | // 子进程处理模块
67 | DealWithRequest(clientSocket);
68 | #ifdef OUTPUT_DEBUG_INFO
69 | printf("子进程: %d 退出\n", getpid());
70 | #endif
71 | exit(0);
72 | }
73 |
74 | // 安全代码,以防前面代码bug,额外做安全判断
75 | if (pid == 0)
76 | {
77 | // 这段代码理论上不会执行
78 | exit(0);
79 | }
80 |
81 | // 不能关闭SSL,会导致子进程SSL失效
82 | //close(clientSocket.sockId);
83 | clientSocket.ctx = NULL;
84 | clientSocket.ssl = NULL;
85 |
86 | // 父进程
87 | #ifdef OUTPUT_DEBUG_INFO
88 | if (flag == HTTP)
89 | {
90 | printf("HTTP建立连接成功: ip= %s , port= %d ,创建子进程pid=%d\n", inet_ntoa(clientSocket.address.sin_addr), ntohs(clientSocket.address.sin_port), pid);
91 | }
92 | else
93 | {
94 | printf("HTTPS建立连接成功: ip= %s , port= %d ,创建子进程pid=%d\n", inet_ntoa(clientSocket.address.sin_addr), ntohs(clientSocket.address.sin_port), pid);
95 | }
96 | #endif
97 | }
98 | }
--------------------------------------------------------------------------------
/C_webserver/http/filesystem.c:
--------------------------------------------------------------------------------
1 | #include"filesystem.h"
2 |
3 |
4 | int createfile(char *name,struct Request* req){
5 | struct FileInfo* rst;
6 | FILE *fp;
7 | int len;
8 | char* actpath;
9 |
10 | actpath = (char*)malloc(strlen(FILEDIR2)+strlen(name)+1);
11 | memset(actpath,0,strlen(FILEDIR2)+strlen(name)+1);
12 | memcpy(actpath,FILEDIR2,strlen(FILEDIR2));
13 | memcpy(actpath+strlen(FILEDIR2),name,strlen(name));
14 |
15 | fp = fopen(actpath,"w");
16 | if(fp==NULL) return false;
17 |
18 | if(memcmp(req->Encoding,"chunked",7)==0){
19 | Socket sock = *((Socket*)req->bodyptr);
20 | char* entry;
21 | size_t entrylen;
22 | while(1){
23 | entry = RecvOneChunk(sock,&entrylen);
24 | if(entry<=0) {free(entry);break;}
25 | fwrite(entry,entrylen,1,fp);
26 | free(entry);
27 | }
28 | }else{
29 | fwrite(req->contentptr,atol(req->contentLength),1,fp);
30 | }
31 | fclose(fp);
32 | free(actpath);
33 | return true;
34 | }
35 |
36 | struct FileInfo* file2body(char *path){
37 | //错误则返回NULL,可能需要响应错误码
38 | //记得free
39 | struct FileInfo* rst;
40 | FILE *fp;
41 | int len;
42 |
43 | //if(access(path, F_OK)!= 0) return NULL;
44 |
45 | char* actpath;
46 | if(strlen(path)<=1){
47 | actpath = (char*)malloc(strlen(FILEDIR)+strlen(dfpage)+1);
48 | memset(actpath,0,strlen(FILEDIR)+strlen(dfpage)+1);
49 | memcpy(actpath,FILEDIR,strlen(FILEDIR));
50 | memcpy(actpath+strlen(FILEDIR),dfpage,strlen(dfpage));
51 | }else{
52 | actpath = (char*)malloc(strlen(FILEDIR)+strlen(path)+1);
53 | memset(actpath,0,strlen(FILEDIR)+strlen(path)+1);
54 | memcpy(actpath,FILEDIR,strlen(FILEDIR));
55 | memcpy(actpath+strlen(FILEDIR),path,strlen(path));
56 | }
57 |
58 | fp = fopen(actpath,"r");
59 | if(fp==NULL) return NULL;
60 | fseek(fp,0,SEEK_END);
61 | len = ftell(fp);
62 | if(len<=0) return NULL;
63 | rst = (struct FileInfo*)malloc(sizeof(struct FileInfo));
64 | getType(actpath,rst->type);
65 | rst->len = len;
66 | if(len>=chunkborder) rst->chunked = true;
67 | else rst->chunked = false;
68 | rst->fpath = actpath;
69 | return rst;
70 | }
71 |
72 | int GetFileLength(char *path)
73 | {
74 | FILE *fp = fopen(path, "rb");
75 | if(fp==NULL)
76 | {
77 | #ifdef OUTPUT_ERROR_INFOR
78 | printf("打开客户端请求文件出错,文件名为%s\n",path);
79 | #endif
80 | return -1;
81 | }
82 |
83 | fseek(fp, 0, SEEK_END);
84 | int length = ftell(fp);
85 |
86 | fclose(fp);
87 | return length;
88 | }
89 |
90 | int EndWithString(char *str1, char *str2)
91 | {
92 | if(strlen(str1)= path))
110 | {
111 | p--;
112 | }
113 |
114 | p++;
115 | while(*p!='\0')
116 | {
117 | *result = *p;
118 | result++;
119 | p++;
120 | }
121 | *result = '\0';
122 | }
123 |
124 | void getType(char* file_name,char* extension){
125 | char* tmp = strstr(file_name,".");
126 | if(tmp==NULL) return;
127 | size_t len = strlen(file_name);
128 | size_t bias = tmp-file_name;
129 | memcpy(extension,tmp+1,len-bias);
130 | }
--------------------------------------------------------------------------------
/C_webserver/http/SSL.c:
--------------------------------------------------------------------------------
1 | #include "SSL.h"
2 |
3 | SSL_CTX* InitSSL()
4 | {
5 | SSL_library_init(); // 初始化SSL库
6 | OpenSSL_add_all_algorithms(); //载入所有SSL算法
7 | SSL_load_error_strings(); //载入所有错误信息
8 |
9 | SSL_CTX *ctx = SSL_CTX_new(TLS_server_method());
10 | if(ctx==NULL)
11 | {
12 | #ifdef OUTPUT_ERROR_INFOR
13 | printf("初始化CTX失败\n");
14 | #endif
15 | return NULL;
16 | }
17 |
18 | // 要求校验对方证书
19 | SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
20 | // 加载CA的证书
21 | SSL_CTX_load_verify_locations(ctx, CAFILE, NULL); //设置CA
22 |
23 | // 加载自己的证书
24 | if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM)<=0)
25 | {
26 | ERR_print_errors_fp(stderr);
27 | #ifdef OUTPUT_ERROR_INFOR
28 | printf("加载认证证书出错\n");
29 | #endif
30 | return NULL;
31 | }
32 |
33 | // 加载自己的私钥
34 | if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0)
35 | {
36 | ERR_print_errors_fp(stderr);
37 | #ifdef OUTPUT_ERROR_INFOR
38 | printf("加载私钥出错\n");
39 | #endif
40 | return NULL;
41 | }
42 |
43 | // 验证私钥是否正确
44 | if (!SSL_CTX_check_private_key(ctx))
45 | {
46 | #ifdef OUTPUT_ERROR_INFOR
47 | printf("公钥与私钥不匹配\n");
48 | #endif
49 | return NULL;
50 | }
51 |
52 | // SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAFILE));
53 | // // SSL_CTX_set_cipher_list(ctx, "RC4-MD5");
54 |
55 | SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
56 | return ctx;
57 | }
58 |
59 | SSL* AttachSSLWithSocket(int sockId, SSL_CTX* ctx)
60 | {
61 | if(ctx==NULL)
62 | {
63 | #ifdef OUTPUT_ERROR_INFOR
64 | printf("计算SSL时,ctx=NULL \n");
65 | #endif
66 | return NULL;
67 | }
68 |
69 | SSL* ssl = SSL_new(ctx);
70 | if (ssl==NULL)
71 | {
72 | #ifdef OUTPUT_ERROR_INFOR
73 | printf("初始化SSL时发生错误\n");
74 | #endif
75 | return NULL;
76 | }
77 |
78 | //绑定套接字与SSL
79 | if (SSL_set_fd(ssl, sockId)==0)
80 | {
81 | #ifdef OUTPUT_ERROR_INFOR
82 | printf("关联SSL与套接字出错\n");
83 | #endif
84 | return NULL;
85 | }
86 |
87 | for (int i = 0; i < 100;i++)
88 | {
89 | int k = SSL_accept(ssl);
90 | if (k<=0)
91 | {
92 | continue;
93 | }
94 | else
95 | {
96 | if(!VerifyX509(ssl))
97 | {
98 | SSL_free(ssl);
99 | return NULL;
100 | }
101 |
102 | return ssl;
103 | }
104 | }
105 |
106 | #ifdef OUTPUT_ERROR_INFOR
107 | printf("SSL连接出错, 信息: %s \n", ERR_reason_error_string(ERR_get_error()));
108 | #endif
109 | return NULL;
110 | }
111 |
112 | Bool VerifyX509(SSL* ssl)
113 | {
114 |
115 | X509 *client_cert = SSL_get_peer_certificate(ssl);
116 |
117 | #ifdef OUTPUT_DEBUG_INFO
118 | printf("\n用户证书如下:\n");
119 | #endif
120 |
121 | if (client_cert != NULL)
122 | {
123 | char *str = X509_NAME_oneline(X509_get_subject_name(client_cert), 0, 0);
124 | if (!str)
125 | {
126 | #ifdef OUTPUT_ERROR_INFOR
127 | printf("subject\n");
128 | #endif
129 | return false;
130 | }
131 |
132 | #ifdef OUTPUT_DEBUG_INFO
133 | printf("subject: %s\n", str);
134 | #endif
135 | OPENSSL_free(str);
136 |
137 | str = X509_NAME_oneline(X509_get_issuer_name(client_cert), 0, 0);
138 | if (!str)
139 | {
140 | #ifdef OUTPUT_ERROR_INFOR
141 | printf("issuer存在错误\n");
142 | #endif
143 | return false;
144 | }
145 |
146 | #ifdef OUTPUT_DEBUG_INFO
147 | printf("issuer: %s\n\n", str);
148 | #endif
149 | X509_free(client_cert);
150 | OPENSSL_free(str);
151 | return true;
152 | }
153 | else
154 | {
155 | #ifdef OUTPUT_ERROR_INFOR
156 | printf("用户证书不存在\n");
157 | #endif
158 | return false;
159 | }
160 | }
161 |
162 | void FreeSSL(SSL* ssl, SSL_CTX* ctx)
163 | {
164 | if(!ssl)
165 | {
166 | SSL_shutdown(ssl);
167 | SSL_free(ssl);
168 | ssl = NULL;
169 | }
170 |
171 | if(!ctx)
172 | {
173 | SSL_CTX_free(ctx);
174 | ctx = NULL;
175 | }
176 | }
177 |
178 | // SSL_write(ssl, "Server is connect to you!\n", strlen("Server is connect to you!\n"));
179 | // SSL_read(ssl, buf, sizeof(buf));
--------------------------------------------------------------------------------
/C_webserver/http/includes/TCP.h:
--------------------------------------------------------------------------------
1 | #ifndef TCP_H
2 | #define TCP_H
3 |
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include
15 | #include
16 | #include
17 |
18 | #include "SSL.h"
19 | #include"global.h"
20 | #include"filesystem.h"
21 |
22 | #define MAX_CHUNK_SIZE 1024
23 |
24 | // 定义别名
25 | typedef struct sockaddr SockAddr;
26 | typedef struct sockaddr_in SockAddr_In;
27 |
28 | // 套接字结构体
29 | typedef struct Socket
30 | {
31 | int sockId; // socket id
32 | struct sockaddr_in address; // socket 地址
33 | int addressLength; // 一般等于sizeof(SockAddr),由accept函数赋值
34 | SSL* ssl; // 非NULL时指向SSL相关内容
35 | SSL_CTX *ctx;
36 | Bool isHttps;
37 | } Socket;
38 |
39 | /********************************************************************************
40 | * 功能:创建一个套接字地址
41 | *
42 | * ip:C语言类型数组,当指定为NULL时表示INADDR_ANY
43 | * port: 端口号
44 | * 返回值: 套接字地址
45 | ************************************************************************* ******/
46 | SockAddr_In CreateSocketAddr_IN(char *ip, unsigned short int port);
47 |
48 | /********************************************************************************
49 | * 功能:初始化一个Socket Server
50 | * ip: C语言类型数组,当指定为NULL时表示INADDR_ANY
51 | * port: 端口号
52 | * maxListen: 最大监听数目
53 | * 返回值: 监听Socket结构。套接字创建失败:Socket.sockId=-1; 端口绑定失败:Socket.sockId=-2; 设置监听失败:Socket.sockId=-2
54 | * ************************************************************************* ***/
55 | Socket InitSocketServer(char* ip, unsigned short int port, int maxListen); // 创建监听套接字并绑定端口
56 |
57 | /********************************************************************************
58 | * 功能:接受客户端连接,内部会阻塞
59 | *
60 | * serverSocket: 监听Socket结构
61 | * isHttps: 是否是Https服务器,true/false
62 | * 返回值:客户端Socket结构
63 | * ************************************************************************* ***/
64 | Socket AcceptClientSocket(Socket serverSocket, Bool isHttps);
65 |
66 | /********************************************************************************
67 | * 功能:关闭套接字
68 | *
69 | * sock: 等待关闭的Socket
70 | * 返回值: 成功:1 , 套接字已过期:0 , 失败:-1
71 | * ************************************************************************* ***/
72 | int CloseSocket(Socket sock);
73 |
74 | /********************************************************************************
75 | * 功能:基于TCP读取字节流,会在末尾额外添加'\0',但不保证有用,通过特定字符串判断结束
76 | *
77 | * sock: 客户端Socket
78 | * data: 存放数据的缓冲区
79 | * maxBuffer: 缓冲区大小,应额外多出一个字节
80 | * endFlag: C语言字符串,结束标志
81 | * alarm: TCP超时未返回数据,且超过alarm时,自动关闭套接字,返回-3。alarm<=0时无效
82 | * 返回值: 成功:有效数据长度;读取发生错误:-1 客户端主动断开连接:-2 超时:-3 缓冲区溢出:-4
83 | * ************************************************************************* ***/
84 | int RecvDataByFlag(Socket sock, char *data, int maxBuffer,char *endFlag, int alarm);
85 |
86 | /********************************************************************************
87 | * 功能:基于TCP读取指定长度字节流
88 | *
89 | * sock: 客户端Socket
90 | * data: 存放数据的缓冲区
91 | * length: 期望读取的数据长度
92 | * alarm: TCP超时未返回数据,且超过alarm时,自动关闭套接字,返回-3。alarm<=0时无效
93 | * 返回值: 成功:有效数据长度; 读取发生错误:-1 客户端主动断开连接:-2 超时:-3 读取长度无效:-4
94 | * ************************************************************************* ***/
95 | int RecvDataByLength(Socket sock, char *data, int length, int alarm);
96 |
97 | /********************************************************************************
98 | * 功能:基于TCP在chunked模式下,从Socket缓冲区读取一个块的有效内容,为malloc分配的内存,应!!显式释放!!尾部额外添加'\0',但不保证有用
99 | * sock: 客户端Socket
100 | * dataLength: 返回有效数据长度
101 | * 返回值: 成功:堆区指针,指向有效数据 出错:NULL
102 | * ************************************************************************* ***/
103 | char *RecvOneChunk(Socket sock, unsigned long int *dataLength);
104 |
105 | /********************************************************************************
106 | * 功能:基于TCP发送字节数组
107 |
108 | * sock: 客户端Socket
109 | * data: 数组首地址
110 | * datalength:数据长度
111 | * allowChunk:是否使用分块,使用true/false
112 | * sendEndFlag:结尾是否发送分块结束标志"0\r\n\r\n",使用true/false
113 | * 返回值: 成功:0 出错:-1
114 | * ************************************************************************* ***/
115 | int SendData(Socket sock, char *data, int dataLength, Bool allowchunked, Bool SendEndFlag);
116 |
117 | /********************************************************************************
118 | * 功能:基于TCP以二进制读取方式,将磁盘文件发送到套接字内核缓冲区
119 | *
120 | * sock: 客户端Socket
121 | * data: C字符串,文件路径
122 | * allowChunk:是否使用分块,使用true/false
123 | * sendEndFlag:结尾是否发送分块结束标志"0\r\n\r\n",使用true/false
124 | * 返回值: 成功:0 出错:-1
125 | ************************************************************************* ***/
126 | int SendFile(Socket sock, char *path, Bool allowchunked, Bool SendEndFlag);
127 |
128 | /********************************************************************************
129 | * 功能:在分块传输时,用于在结尾发送结束标志"0\r\n\r\n"
130 | *
131 | * sock: 客户端Socket
132 | * 返回值: 成功:0 出错:-1
133 | ************************************************************************* ***/
134 | int SendChunkEndFlag(Socket sock);
135 |
136 | /********************************************************************************
137 | * 功能:对socket write的封装,自适应HTTP/HTTPS
138 | ************************************************************************* ***/
139 | int write_sock(Socket sock,char* buffer, int bufferSize);
140 |
141 | /********************************************************************************
142 | * 功能:对socket recv的封装,自适应HTTP/HTTPS
143 | * flag: 仅实现了MSG_WAITALL和0的支持
144 | ************************************************************************* ***/
145 | int recv_sock(Socket sock, char *buffer, int size, int flag);
146 |
147 | /********************************************************************************
148 | * 功能:对socket read的封装,自适应HTTP/HTTPS
149 | ************************************************************************* ***/
150 | int read_sock(Socket sock, char *buffer, int bufferSize);
151 |
152 | #endif
153 |
154 | /*************************************
155 | struct sockaddr
156 | {
157 | unsigned short int sa_family;
158 | char sa_data[14];
159 | };
160 |
161 | struct socketaddr_in
162 | {
163 | unsigned short int sin_family;
164 | uint16_t sin_port;
165 | struct in_addr sin_addr;
166 | unsigned char sin_zero[8];
167 | };
168 | ***************************************/
--------------------------------------------------------------------------------
/C_webserver/http/pipe.c:
--------------------------------------------------------------------------------
1 | #include"pipe.h"
2 |
3 | struct Block* init(struct Request* req){
4 | if(req==NULL) return NULL;
5 | struct BasicResponse* br = NULL;
6 | struct AdditionalResponse* ar =NULL;
7 | struct Block* rst = NULL;
8 |
9 | rst = (struct Block*)malloc(sizeof(struct Block));
10 | memset(rst,0,sizeof(struct Block));
11 | rst->response = (struct FinalResponse*)malloc(sizeof(struct FinalResponse));
12 | memset(rst->response,0,sizeof(struct FinalResponse));
13 | rst->response->data = (char*)malloc(page);
14 | memset(rst->response->data,0,page);
15 |
16 | if(memcmp(req->version,"HTTP/1.1",8)!=0){
17 | //版本不支持
18 | br = responseFirstLine(HTTPVersionnotsupported,"HTTP Version not supported");
19 | addBasicResponse(rst->response,br);
20 | addTail(rst->response);
21 | return rst;
22 | }else if(memcmp(req->method,"GET",3)==0){
23 | //GET
24 | rst = getfile(req,rst);
25 | addTail(rst->response);
26 | return rst;
27 | }else if(memcmp(req->method,"POST",4)==0){
28 | //POST
29 | rst = postfile(req,rst);
30 | addTail(rst->response);
31 | return rst;
32 | }else{
33 | //不支持的请求方法+Allow字段
34 | br = responseFirstLine(MethodNotAllowed,"Method Not Allowed");
35 | ar = initResponse("Allow","GET,POST");
36 | addBasicResponse(rst->response,br);
37 | addResponse(rst->response,ar);
38 | addTail(rst->response);
39 | return rst;
40 | }
41 | return NULL;
42 | }
43 |
44 | struct Block* getfile(struct Request* req, struct Block* block){
45 | if(req==NULL||block==NULL) return NULL;
46 | struct FileInfo* fi = file2body(req->URL);
47 | struct BasicResponse* br = NULL;
48 | struct AdditionalResponse* ar = NULL;
49 | if(fi!=NULL){
50 | block->fileinfo = fi;
51 | block->chunked = fi->chunked;
52 | br = responseFirstLine(OK,"OK");
53 | addBasicResponse(block->response,br);
54 | if(fi->chunked==false){
55 | ar = initResponse("Content-Type",fi->type);
56 | char tmpnum[20];
57 | sprintf(tmpnum,"%ld",fi->len);
58 | struct AdditionalResponse* ar1 = initResponse("Content-Length",tmpnum);
59 | addResponse(block->response,ar);
60 | addResponse(block->response,ar1);
61 | }else{
62 | ar = initResponse("Transfer-Encoding","chunked");
63 | addResponse(block->response,ar);
64 | }
65 | }else{
66 | br = responseFirstLine(NotFound,"Not Found");
67 | ar = initResponse("Content-Length","0");
68 | addBasicResponse(block->response,br);
69 | addResponse(block->response,ar);
70 | }
71 | connectioncheck(req,block);
72 | return block;
73 | }
74 |
75 | struct Block* postfile(struct Request* req, struct Block* block){
76 | if(req==NULL||block==NULL) return NULL;
77 | struct BasicResponse* br = NULL;
78 | struct AdditionalResponse* ar = NULL;
79 | char *tmp,*fname;
80 | if(memcmp(req->Encoding,"chunked",7)!=0){
81 | tmp = req->bodyptr;
82 | fname = strstr(tmp,"filename=")+10;
83 | tmp = strstr(tmp,"\r\n\r\n");tmp = tmp+4;
84 | req->contentptr = tmp;
85 | size_t actlen = tmp - req->bodyptr;
86 | actlen += 46;
87 | actlen = atol(req->contentLength)-actlen;
88 | sprintf(req->contentLength,"%ld",actlen);
89 | tmp = strstr(fname,"\"");
90 | *tmp = '\0';
91 | printf("[FileName] %s\n",fname);
92 | }
93 |
94 | if(createfile(fname,req)==true){
95 | br = responseFirstLine(OK,"OK");
96 | addBasicResponse(block->response,br);
97 | ar = initResponse("Content-Type","text");
98 | addResponse(block->response,ar);
99 | ar = initResponse("Content-Length","0");
100 | addResponse(block->response,ar);
101 | }else{
102 | br = responseFirstLine(NotAcceptable,"Not Acceptable");
103 | addBasicResponse(block->response,br);
104 | }
105 | connectioncheck(req,block);
106 | return block;
107 | }
108 |
109 | struct Block* connectioncheck(struct Request* req, struct Block* block){
110 | if(req==NULL||block==NULL) return NULL;
111 | struct AdditionalResponse* ar;
112 | if(memcmp(req->URL,"/favicon.ico",12)==0){
113 | block->connection = false;
114 | block->keepalivetime = 0;
115 | ar = initResponse("Connection","close");
116 | addResponse(block->response,ar);
117 | }else if((memcmp(req->connection,"keep-alive",10)==0)||(memcmp(req->connection,"Keep-Alive",10)==0)){
118 | //keep alive
119 | block->connection = true;
120 | block->keepalivetime = alivetime;
121 | ar = initResponse("Connection","keep-alive");
122 | addResponse(block->response,ar);
123 | char tmp[6];
124 | sprintf(tmp,"%d",alivetime);
125 | ar = initResponse("Keep-Alive",tmp);
126 | addResponse(block->response,ar);
127 | }else{
128 | block->connection = false;
129 | block->keepalivetime = 0;
130 | ar = initResponse("Connection","close");
131 | addResponse(block->response,ar);
132 | }
133 | return block;
134 | }
135 |
136 | //--------------------------------------------------------------------------------
137 | /*
138 | struct FinalResponse* constructor(struct Request* req){
139 | if(req==NULL) return NULL;
140 | FinalResponse* rst = NULL;
141 | BasicResponse* brep = NULL;
142 | AdditionalResponse* addq =NULL;
143 | if(memcmp(req->version,"HTTP/1.1",8)!=0){
144 | //版本不支持
145 | brep = responseFirstLine(NotAcceptable,"Not Acceptable");
146 | rst = (FinalResponse*)malloc(sizeof(struct FinalResponse));
147 | rst->len = brep->len+2;
148 | rst->data = (char*)malloc(rst->len);
149 | memcpy(rst->data,brep->state,brep->len);
150 | memcpy((rst->data)+brep->len,"\r\n",2);
151 | free(brep);
152 | return rst;
153 | }
154 | if(memcmp(req->method,"GET",3)==0){
155 | //GET
156 | }else if(memcmp(req->method,"POST",4)==0){
157 | //POST
158 | }else{
159 | //不支持的请求方法+Allow字段
160 | brep = responseFirstLine(MethodNotAllowed,"Method Not Allowed");
161 | rst = (FinalResponse*)malloc(sizeof(struct FinalResponse));
162 | addq = addResponse("Allow","GET,POST");
163 | rst->data = (char*)malloc(page);
164 | rst->len = brep->len;
165 | memcpy(rst->data,brep->state,brep->len);
166 | }
167 | return NULL;
168 | }
169 |
170 | struct FinalResponse* addhead(struct FinalResponse* rst,struct AdditionalResponse* ad){
171 | if(rst==NULL) return NULL;
172 | if(ad==NULL) return NULL;
173 | char* tmp = rst->data + rst->len;
174 | memcpy(tmp,add->state,add->len);
175 | rst->len = rst->len+ad->len;
176 | return rst;
177 | }
178 |
179 | struct AdditionalResponse* connectioncheck();
180 |
181 | struct FileInfo* fileattach(char* path){
182 | struct FinalResponse* file = body2file(path);
183 | if(file==NULL) return NULL;
184 | struct FileInfo* rst = (struct FileInfo*)malloc(sizeof(struct FileInfo));
185 | rst->fi = file;
186 | char numlen[20];
187 | itoa(file->len,numlen,10);
188 | rst->ad = addResponse("Content-Length",&numlen);
189 | return rst;
190 | }
191 | */
--------------------------------------------------------------------------------
/C_webserver/http/Http.c:
--------------------------------------------------------------------------------
1 | #include "Http.h"
2 |
3 | #define BUFFER_SIZE 8192
4 |
5 | int DealWithRequest(Socket sock){
6 | //libevent并发
7 | struct event_base* base = event_base_new(); //event_init();
8 | Eventarg* eventarg = (Eventarg*)malloc(sizeof(Eventarg));
9 | eventarg->base = base;
10 | eventarg->firsttime = true;
11 | eventarg->sock = &sock;
12 | struct event* ev_listen = event_new(base,sock.sockId,EV_READ | EV_PERSIST,accept_cb,eventarg);
13 | eventarg->event = ev_listen;
14 | struct timeval tv;
15 | tv.tv_sec = alivetime;
16 | event_add(ev_listen,&tv);
17 | event_base_dispatch(base);
18 | return 0;
19 | }
20 |
21 | void accept_cb(int fd, short events, void* arg){
22 | Eventarg* eventarg = (Eventarg*)arg;
23 | if(events==EV_TIMEOUT){
24 | if(eventarg->firsttime==true) return;
25 | else{CloseHttp(eventarg);}
26 | }else{
27 | eventarg->firsttime=false;
28 | struct Request* req = NULL;
29 | char buffer[BUFFER_SIZE];
30 |
31 | int flag = ReadHttpHeaderBytes(*(eventarg->sock), buffer, BUFFER_SIZE);
32 | if (flag == -1){
33 | //出现错误
34 | return;
35 | }
36 | else if (flag == -2){
37 | // 客户端主动断开
38 | CloseHttp(eventarg);
39 | return;
40 | }
41 |
42 | req = phaser(strlen(buffer),buffer);
43 | if(memcmp(req->contentLength,"\0",1)!=0){
44 | size_t len = atol(req->contentLength);
45 | req->bodyptr = (char*)malloc(len+1);
46 | memset(req->bodyptr,0,len+1);
47 | RecvDataByLength(*(eventarg->sock),req->bodyptr,len,0);
48 | }
49 | if(memcmp(req->Encoding,"chunked",7)==0) req->bodyptr = (char*)(eventarg->sock);
50 | printRequest(req);
51 |
52 | struct Block* block = init(req);
53 |
54 | printResponse(block);
55 | sendResponse(block,*(eventarg->sock));
56 | if(block->connection==false){
57 | CloseHttp(eventarg);
58 | }
59 | freeRequest(req);
60 | freeBlock(block);
61 | }
62 | }
63 |
64 | void freeRequest(struct Request* req){
65 | if(req==NULL) return;
66 | if(req->bodyptr!=NULL) free(req->bodyptr);
67 | free(req);
68 | }
69 |
70 | void freeResponse(struct FinalResponse* res){
71 | if(res==NULL) return;
72 | if(res->data!=NULL) free(res->data);
73 | free(res);
74 | }
75 |
76 | void freeFileinfo(struct FileInfo* fi){
77 | if(fi==NULL) return;
78 | if(fi->fpath!=NULL) free(fi->fpath);
79 | free(fi);
80 | }
81 |
82 | void freeBlock(struct Block* block){
83 | if(block==NULL) return;
84 | if(block->response!=NULL) freeResponse(block->response);
85 | if(block->fileinfo!=NULL) freeFileinfo(block->fileinfo);
86 | free(block);
87 | }
88 |
89 | void printRequest(struct Request* req){
90 | printf("\n----------------------------------------------\n[New Request]\n");
91 | printf(" method: %s\n",req->method);
92 | printf(" URL: %s\n",req->URL);
93 | printf(" URLlen: %ld\n",req->URLlen);
94 | printf(" version: %s\n",req->version);
95 | printf(" Connection: %s\n",req->connection);
96 | printf(" Accept: %s\n",req->accept);
97 | printf(" contentType: %s\n",req->contentType);
98 | printf(" contentLength: %s\n",req->contentLength);
99 | printf(" Encoding: %s\n",req->Encoding);
100 | //if(req->bodyptr!=NULL) printf("data:\n%s\n",req->bodyptr);
101 | }
102 |
103 | void printResponse(struct Block* block){
104 | printf("\n----------------------------------------------\n[Response]\n");
105 | printf("%s\n",block->response->data);
106 | if(block->fileinfo!=NULL)
107 | printf("path: %s\ntype: %s\n",block->fileinfo->fpath,block->fileinfo->type);
108 | printf("----------------------------------------------\n");
109 | }
110 |
111 | int ReadHttpHeaderBytes(Socket sock, char *data, int maxBuffer)
112 | {
113 | int flag = RecvDataByFlag(sock, data, maxBuffer, "\r\n\r\n",0);
114 |
115 | if (flag == -1)
116 | {
117 | #ifdef OUTPUT_ERROR_INFOR
118 | printf("读取http header时发生错误\n");
119 | #endif
120 | *data = '\0';
121 | return -1;
122 | }
123 | else if (flag == -2)
124 | {
125 | return -2;
126 | }
127 | return 0;
128 | }
129 |
130 | void sendResponse(struct Block* block, Socket sock){
131 | if(block==NULL) return;
132 | SendData(sock,block->response->data,block->response->len,false,false);
133 | if(block->fileinfo!=NULL){
134 | SendFile(sock,block->fileinfo->fpath,block->chunked,true);
135 | }
136 | }
137 |
138 | int ResponseHttpWithHtml(Socket sock, HttpKind httpKind, char *htmlPath)
139 | {
140 | // 计算http 头部内容
141 | char headerBuffer[BUFFER_SIZE];
142 | memset(headerBuffer, 0, BUFFER_SIZE);
143 |
144 | // 计算获取正确的html path
145 | char path[500];
146 | memset(path, 0, 500);
147 | strcpy(path, "response/");
148 |
149 | // 插入http类型,并计算正确的http文件所在path
150 | switch (httpKind)
151 | {
152 | case Error_400:
153 | strcat(headerBuffer, "HTTP/1.1 400 BAD REQUEST\r\n");
154 |
155 | strcat(path, "400.html");
156 | break;
157 | case Error_404:
158 | strcat(headerBuffer, "HTTP/1.1 404 NOT FOUND\r\n");
159 |
160 | strcat(path, "404.html");
161 | break;
162 | case Error_500:
163 | strcat(headerBuffer, "HTTP/1.1 500 Internal Server Error\r\n");
164 |
165 | strcat(path, "500.html");
166 | break;
167 | case Error_501:
168 | strcat(headerBuffer, "HTTP/1.1 501 Method Not Implemented\r\n");
169 |
170 | strcat(path, "501.html");
171 | break;
172 | case Success_200:
173 | strcat(path, htmlPath);
174 | if (htmlPath == NULL || access(path, F_OK) != 0)
175 | {
176 | #ifdef OUTPUT_ERROR_INFOR
177 | printf("获取返回html时为空,将自动渲染404界面\n");
178 | #endif
179 | strcat(headerBuffer, "HTTP/1.1 400 BAD REQUEST\r\n");
180 | memset(path, 0, 500);
181 | strcpy(path, "response/404.html");
182 | httpKind = Error_404;
183 | break;
184 | }
185 |
186 | // 以下仅为测试代码
187 | strcat(headerBuffer, "HTTP/1.1 200 OK\r\n");
188 | break;
189 |
190 | default:
191 | #ifdef OUTPUT_ERROR_INFOR
192 | printf("HTTP_HTML Response错误枚举\n");
193 | #endif
194 | return -1;
195 | }
196 |
197 | strcat(headerBuffer, "Server: C http server 1.0\r\n");
198 | strcat(headerBuffer, "Connection: keep-alive\r\n");
199 | strcat(headerBuffer, "Content-Type: text/html\r\n");
200 |
201 | // 写入data长度
202 | int dataLength = GetFileLength(path);
203 |
204 | char dataLengthString[30];
205 | memset(dataLengthString, 0, 30);
206 | sprintf(dataLengthString, "Content-Length: %d\r\n", dataLength);
207 | strcat(headerBuffer, dataLengthString);
208 | //strcat(headerBuffer, "Transfer-Encoding: chunked\r\n");
209 |
210 | // 写入空行
211 | strcat(headerBuffer, "\r\n");
212 |
213 | #ifdef OUTPUT_DEBUG_INFO
214 | printf("发送头部:\n%s", headerBuffer);
215 | #endif
216 |
217 | SendData(sock, headerBuffer,strlen(headerBuffer),false,false); // 发送头部
218 | SendFile(sock, path,false,true);
219 | // char *d = "test\r\nthis is test
";
220 | // SendData(sock, d, strlen(d),true,true);
221 | }
222 |
223 | int ResponseHttp(Socket sock, char *contentType, char *filePath, Bool allowChunked)
224 | {
225 | // 计算获取正确的文件path
226 | char path[500];
227 | memset(path, 0, 500);
228 | strcpy(path, "response/");
229 | strcat(path, filePath);
230 |
231 | // 判断文件是否存在
232 | if (access(path, F_OK) != 0)
233 | {
234 | // 资源文件不存在
235 | ResponseHttpWithHtml(sock, Error_404, NULL);
236 | return -1;
237 | }
238 |
239 | // 计算http 头部内容
240 | char headerBuffer[BUFFER_SIZE];
241 | memset(headerBuffer, 0, BUFFER_SIZE);
242 |
243 | strcat(headerBuffer, "HTTP/1.1 200 OK\r\n");
244 | strcat(headerBuffer, "Server: C http server 1.0\r\n");
245 | strcat(headerBuffer, "Connection: keep-alive\r\n");
246 |
247 | // 输入ContentType
248 | strcat(headerBuffer, "Content-Type: ");
249 | strcat(headerBuffer, contentType);
250 | strcat(headerBuffer, "\r\n");
251 |
252 | strcat(headerBuffer, "Content-Disposition:attachment;filename=");
253 | char fileName[40];
254 | memset(fileName, 0, 40);
255 | GetFileName(filePath, fileName);
256 | strcat(headerBuffer, fileName);
257 | strcat(headerBuffer, "\r\n");
258 |
259 | if(!allowChunked)
260 | {
261 | // 使用Content-Length的方式写入
262 | int dataLength = GetFileLength(path);
263 |
264 | char dataLengthString[30];
265 | memset(dataLengthString, 0, 30);
266 | sprintf(dataLengthString, "Content-Length: %d\r\n", dataLength);
267 | strcat(headerBuffer, dataLengthString);
268 | }
269 | else
270 | {
271 | // 使用chunked的方式写入
272 | strcat(headerBuffer, "Transfer-Encoding: chunked\r\n");
273 | }
274 | strcat(headerBuffer, "\r\n"); // 增加空行, 头部生成完毕
275 |
276 | #ifdef OUTPUT_DEBUG_INFO
277 | printf("发送头部:\n%s", headerBuffer);
278 | #endif
279 |
280 | SendData(sock, headerBuffer,strlen(headerBuffer),false,false); // 发送头部
281 | SendFile(sock, path, allowChunked,true);
282 | return 0;
283 | }
284 |
285 | void CloseHttp(Eventarg* eventarg){
286 | event_base_loopbreak(eventarg->base);
287 | event_del(eventarg->event);
288 | event_free(eventarg->event);
289 | event_base_free(eventarg->base);
290 | CloseSocket(*(eventarg->sock));
291 | free(eventarg);
292 | printf("[Info] HTTP/HTTPS connection close.\n");
293 | return;
294 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/C_webserver/http/TCP.c:
--------------------------------------------------------------------------------
1 | #include "TCP.h"
2 | #include
3 | #include
4 |
5 | SockAddr_In CreateSocketAddr_IN(char *ip, unsigned short int port)
6 | {
7 | SockAddr_In sockaddr;
8 | sockaddr.sin_family = AF_INET; // IPV4
9 | sockaddr.sin_port = htons(port);
10 | if(ip!=NULL)
11 | {
12 | sockaddr.sin_addr.s_addr = inet_addr(ip);
13 | }
14 | else
15 | {
16 | sockaddr.sin_addr.s_addr = INADDR_ANY;
17 | }
18 |
19 | bzero(&(sockaddr.sin_zero), 8); // 填充位清零
20 | return sockaddr;
21 | }
22 |
23 | Socket InitSocketServer(char *ip, unsigned short int port, int maxListen)
24 | {
25 | Socket sock;
26 | // 初始化
27 | sock.ctx = NULL;
28 | sock.isHttps = false;
29 | sock.ssl = NULL;
30 |
31 | sock.sockId = socket(AF_INET, SOCK_STREAM, 0);
32 | if(sock.sockId < 0)
33 | {
34 | #ifdef OUTPUT_ERROR_INFOR
35 | printf("套接字创建失败\n");
36 | #endif
37 | sock.sockId = -1;
38 | return sock;
39 | }
40 |
41 | sock.address = CreateSocketAddr_IN(ip, port);
42 | sock.addressLength = sizeof(SockAddr);
43 | if (bind(sock.sockId, (SockAddr *)&(sock.address),sock.addressLength) < 0)
44 | {
45 | #ifdef OUTPUT_ERROR_INFOR
46 | printf("端口绑定失败\n");
47 | #endif
48 | sock.sockId = -2;
49 | return sock;
50 | }
51 |
52 | if(listen(sock.sockId, maxListen) < 0)
53 | {
54 | #ifdef OUTPUT_ERROR_INFOR
55 | printf("设置监听失败\n");
56 | #endif
57 | sock.sockId = -3;
58 | return sock;
59 | }
60 |
61 | return sock;
62 | }
63 |
64 | Socket AcceptClientSocket(Socket serverSocket, Bool isHttps)
65 | {
66 | Socket sock;
67 | sock.isHttps = isHttps;
68 | sock.ssl = NULL; // SSL字段初始化为NULL
69 | sock.ctx = NULL;
70 | sock.addressLength = sizeof(SockAddr);
71 |
72 | #ifdef OUTPUT_DEBUG_INFO
73 | printf("开始监听客户端连接\n");
74 | #endif
75 |
76 | sock.sockId = accept(serverSocket.sockId, (SockAddr*)&(sock.address), &(sock.addressLength));
77 | if(sock.sockId<0)
78 | {
79 | #ifdef OUTPUT_ERROR_INFOR
80 | printf("客户端连接出错,套接字返回值:%d\n", sock.sockId);
81 | #endif
82 | }
83 |
84 | if(isHttps)
85 | {
86 | sock.ctx = InitSSL();
87 | sock.ssl = AttachSSLWithSocket(sock.sockId, sock.ctx);
88 | }
89 |
90 | return sock;
91 | }
92 |
93 | int CloseSocket(Socket sock)
94 | {
95 | if(sock.isHttps)
96 | {
97 | FreeSSL(sock.ssl, sock.ctx);
98 | sock.ssl = NULL;
99 | sock.ctx = NULL;
100 |
101 | return 0;
102 | }
103 | else
104 | {
105 | // http的socket
106 | if(sock.sockId>0)
107 | {
108 | if (close(sock.sockId) < 0)
109 | {
110 | #ifdef OUTPUT_ERROR_INFOR
111 | printf("关闭套接字失败,错误信息: %s\n", strerror(errno));
112 | #endif
113 | return -1; // 失败
114 | }
115 | else
116 | {
117 | sock.sockId = -10;
118 | return 1; // 成功
119 | }
120 | }
121 | else
122 | {
123 | #ifdef OUTPUT_ERROR_INFOR
124 | printf("关闭套接字不存在\n");
125 | #endif
126 | return 0;
127 | }
128 | }
129 | }
130 |
131 | int RecvDataByFlag(Socket sock, char *data, int maxBuffer, char *endFlag, int alarm)
132 | {
133 | int startTime = time(NULL); // 程序开始时间戳,单位为s
134 |
135 | memset(data, 0, maxBuffer);
136 | char ch = '\0', *p = data, *flag = endFlag;
137 |
138 | // 开始读取数据
139 | while (1)
140 | {
141 | if (*flag == '\0')
142 | {
143 | *p = '\0';
144 | return (int)(p-data); // 结束读取
145 | }
146 |
147 | int length = read_sock(sock, &ch, 1);
148 | if(length<0)
149 | {
150 | return -1;
151 | }
152 |
153 | if (length == 0 && (time(NULL) - startTime > alarm) && alarm>0)
154 | {
155 | // 超时未读取到数据,且已经超过最大alarm时,断开TCP连接
156 | CloseSocket(sock);
157 | return -3;
158 | }
159 |
160 | if ((p - data) >= maxBuffer - 1)
161 | {
162 | // 对于空头判断
163 | if(strlen(data)<=0)
164 | {
165 | #ifdef OUTPUT_ERROR_INFOR
166 | printf("等候头部时对方主动退出\n");
167 | #endif
168 | data[0] = '\0';
169 | return -2;
170 | }
171 |
172 | #ifdef OUTPUT_ERROR_INFOR
173 | data[maxBuffer] = '\0';
174 | printf("Read()读取时缓冲区太小,未能在\"%s\"之前返回,当前buffer size为: %d, 已经读取的数据为:%s\n", endFlag, maxBuffer - 1, data);
175 | #endif
176 | return -4;
177 | }
178 |
179 | *p = ch;
180 | p++;
181 |
182 | // 开始读取
183 | if (ch == *flag)
184 | {
185 | flag++;
186 | }
187 | else
188 | {
189 | flag = endFlag;
190 | }
191 | }
192 | }
193 |
194 | int RecvDataByLength(Socket sock, char *data, int length, int alarm)
195 | {
196 | int startTime = time(NULL); // 程序开始时间戳,单位为s
197 |
198 | if(length <= 0)
199 | {
200 | return -4;
201 | }
202 |
203 | memset(data, 0, length+1);
204 | int recvLength = recv_sock(sock, data, length, MSG_WAITALL); // 等待所有数据到达,否则阻塞
205 | if (recvLength < 0)
206 | {
207 | #ifdef OUTPUT_ERROR_INFOR
208 | printf("RecvDataByLength: Recv()发生错误\n");
209 | #endif
210 | return -1;
211 | }
212 | else if (recvLength == 0 && (time(NULL) - startTime > alarm) && alarm > 0)
213 | {
214 | // 未接收到数据,且超时
215 | CloseSocket(sock);
216 | return -3;
217 | }
218 | else if (recvLength == 0)
219 | {
220 | // 对方断开
221 | return -2;
222 | }
223 | return recvLength;
224 | }
225 |
226 | int SendData(Socket sock, char *data, int dataLength, Bool allowchunked, Bool SendEndFlag)
227 | {
228 | if(!allowchunked)
229 | {
230 | if (write_sock(sock, data, dataLength) < 0)
231 | {
232 | return -1;
233 | }
234 | }
235 | else
236 | {
237 | char *p = data;
238 | while (1)
239 | {
240 | if((p-data)>=dataLength)
241 | {
242 | // 发送完成
243 | if(SendEndFlag)
244 | {
245 | if(SendChunkEndFlag(sock)<0)
246 | {
247 | return -1;
248 | }
249 | }
250 | return 0;
251 | }
252 |
253 | char OctData[17]; // 块长度不应该超过8字节表示范围
254 | memset(OctData, 0, 17);
255 | if((data+dataLength-p)>=MAX_CHUNK_SIZE)
256 | {
257 | sprintf(OctData, "%lx\r\n", (unsigned long int)MAX_CHUNK_SIZE);
258 | write_sock(sock, OctData, strlen(OctData)); // 写入长度
259 |
260 | if (write_sock(sock, p, MAX_CHUNK_SIZE) < 0)
261 | {
262 | return -1;
263 | }
264 | p += MAX_CHUNK_SIZE;
265 | }
266 | else
267 | {
268 | sprintf(OctData, "%lx\r\n", data + dataLength - p);
269 | write_sock(sock, OctData, strlen(OctData)); // 写入长度
270 |
271 | if (write_sock(sock, p, data + dataLength - p) < 0)
272 | {
273 | return -1;
274 | }
275 |
276 | p += data + dataLength - p;
277 | }
278 |
279 | // 写入块尾部
280 | if (write_sock(sock, "\r\n", 2) < 0)
281 | {
282 | return -1;
283 | }
284 | }
285 | }
286 | return 0;
287 | }
288 |
289 | int SendFile(Socket sock, char *path, Bool allowchunked, Bool SendEndFlag)
290 | {
291 | FILE *fp = fopen(path, "rb");
292 | if (fp == NULL)
293 | {
294 | #ifdef OUTPUT_ERROR_INFOR
295 | printf("发送文件时,打开文件出错,文件名: %s\n", path);
296 | #endif
297 | return -1;
298 | }
299 |
300 | int fileLength = GetFileLength(path);
301 |
302 | unsigned char buffer[MAX_CHUNK_SIZE];
303 | int sendedLength = 0, len=0;
304 | while (1)
305 | {
306 | // 判断文件结束
307 | if(feof(fp) || sendedLength>=fileLength)
308 | {
309 | if (allowchunked)
310 | {
311 | // 发送完成
312 | if (SendEndFlag)
313 | {
314 | if (SendChunkEndFlag(sock) < 0)
315 | {
316 | return -1;
317 | }
318 | }
319 | }
320 | break;
321 | }
322 |
323 | memset(buffer, 0, MAX_CHUNK_SIZE);
324 | if ((fileLength - sendedLength) >= MAX_CHUNK_SIZE)
325 | {
326 | fread(buffer, sizeof(unsigned char), MAX_CHUNK_SIZE, fp);
327 | len = MAX_CHUNK_SIZE;
328 | }
329 | else
330 | {
331 | fread(buffer,1, fileLength - sendedLength, fp);
332 | len = fileLength - sendedLength;
333 | }
334 |
335 | if(allowchunked)
336 | {
337 | // 打印数据长度
338 | char OctData[17]; // 块长度不应该超过8字节表示范围
339 | memset(OctData, 0, 17);
340 | sprintf(OctData, "%x\r\n", len);
341 | write_sock(sock, OctData, strlen(OctData)); // 写入长度
342 | //printf("传送头部: %s", OctData );
343 | }
344 |
345 | if(len>0)
346 | {
347 | write_sock(sock, buffer, len); // 发送数据
348 | sendedLength += len;
349 | len = 0;
350 | if (allowchunked)
351 | {
352 | write_sock(sock, "\r\n", 2);
353 | }
354 | }
355 |
356 |
357 | #ifdef OUTPUT_DEBUG_INFO
358 | //printf("传送正文: %s",buffer);
359 | #endif
360 | }
361 |
362 | fclose(fp);
363 | return 0;
364 | }
365 |
366 | int SendChunkEndFlag(Socket sock)
367 | {
368 | if (write_sock(sock, "0\r\n\r\n", 5) < 0)
369 | {
370 | return - 1;
371 | }
372 |
373 | return 0;
374 | }
375 |
376 | char* RecvOneChunk(Socket sock,unsigned long int* dataLength)
377 | {
378 | // 读取有效数据长度
379 | char len[18];
380 | memset(len, 0, 18);
381 |
382 | char *p = len;
383 | while (1)
384 | {
385 | if (read_sock(sock, p, 1) < 0)
386 | {
387 | return NULL;
388 | }
389 |
390 | if((p-len)>=18)
391 | {
392 | // 溢出
393 | return NULL;
394 | }
395 |
396 | if((p-len)>=1 && *p=='\n' && *(p-1)=='\r')
397 | {
398 | *(p - 1) = '\0';
399 | break; //读取长度完成
400 | }
401 |
402 | p++;
403 | }
404 |
405 | sscanf(len, "%lx", dataLength);
406 |
407 | // 读取有效数据
408 | char ch = '\0';
409 | char *data = (char *)malloc(sizeof(char) * (*dataLength+1));
410 | if(data==NULL)
411 | {
412 | return NULL;
413 | }
414 |
415 | for (int i = 0; i < *dataLength; i++)
416 | {
417 | if(*dataLength==0)
418 | {
419 | break;
420 | }
421 |
422 | if (read_sock(sock, &ch, 1) < 0)
423 | {
424 | free(data);
425 | return NULL;
426 | }
427 | data[i] = ch;
428 | }
429 |
430 | data[*dataLength] = '\0';
431 |
432 | char flag1 = '\0', flag2 = '\0';
433 | if (read_sock(sock, &flag1, 1) < 0)
434 | {
435 | free(data);
436 | return NULL;
437 | }
438 |
439 | if (read_sock(sock, &flag2, 1) < 0)
440 | {
441 | free(data);
442 | return NULL;
443 | }
444 |
445 | if(!(flag1=='\r'&& flag2=='\n'))
446 | {
447 | free(data);
448 | return NULL; // 块结束不正确
449 | }
450 |
451 | return data;
452 | }
453 |
454 | int write_sock(Socket sock, char *buffer, int bufferSize)
455 | {
456 | if(sock.isHttps)
457 | {
458 | if (sock.ssl == NULL)
459 | {
460 | return -1;
461 | }
462 | return SSL_write(sock.ssl, buffer, bufferSize);
463 | }
464 | else
465 | {
466 | return write(sock.sockId, buffer, bufferSize);
467 | }
468 | }
469 |
470 | int read_sock(Socket sock, char *buffer, int bufferSize)
471 | {
472 | if (sock.isHttps)
473 | {
474 | if(sock.ssl==NULL)
475 | {
476 | return -1;
477 | }
478 | return SSL_read(sock.ssl, buffer, bufferSize);
479 | }
480 | else
481 | {
482 | return read(sock.sockId, buffer, bufferSize);
483 | }
484 | }
485 |
486 | int recv_sock(Socket sock, char *buffer, int size, int flag)
487 | {
488 | int MAX_WAIT_TIME = 30; // 最大阻塞30s
489 |
490 | if (sock.isHttps)
491 | {
492 | if (sock.ssl == NULL)
493 | {
494 | return -1;
495 | }
496 |
497 | if(flag==MSG_WAITALL)
498 | {
499 | int length = 0;
500 | unsigned long int startTime = time(NULL);
501 | while (1)
502 | {
503 | if(length>=size)
504 | {
505 | return length;
506 | }
507 |
508 | int len = SSL_read(sock.ssl, buffer + length, size - length);
509 | length += len;
510 |
511 | if (len < 0)
512 | {
513 | return -1;
514 | }
515 | else if(len==0 && (time(NULL)-startTime)>MAX_WAIT_TIME)
516 | {
517 | // 超时
518 | return 0;
519 | }
520 | }
521 | }
522 | else
523 | {
524 | return SSL_read(sock.ssl, buffer, size);
525 | }
526 |
527 | }
528 | else
529 | {
530 | return recv(sock.sockId, buffer, size, flag);
531 | }
532 | }
--------------------------------------------------------------------------------