src/server/daemon/protocol.c

Sun, 23 Nov 2025 13:22:56 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 23 Nov 2025 13:22:56 +0100
changeset 636
40f069ddda37
parent 630
aae6e06d70b8
permissions
-rw-r--r--

add match_location nametrans SAF

4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
44
3da1f7b6847f added some error messages
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 38
diff changeset
4 * Copyright 2013 Olaf Wintermann. All rights reserved.
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "protocol.h"
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
121
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
31 #include "session.h"
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
32 #include "httplistener.h"
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
33 #include "request.h"
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
34
14
b8bf95b39952 New source folder layout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 11
diff changeset
35 #include "../util/pblock.h"
b8bf95b39952 New source folder layout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 11
diff changeset
36 #include "../util/pool.h"
b8bf95b39952 New source folder layout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 11
diff changeset
37 #include "../util/io.h"
103
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
38 #include "../util/util.h"
14
b8bf95b39952 New source folder layout
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 11
diff changeset
39 #include "../util/strbuf.h"
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40
121
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
41 #define HTTP_SCHEME "http"
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
42 #define HTTPS_SCHEME "https"
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 void protocol_status(Session *sn, Request *rq, int n, const char *m) {
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 rq->status_num = n;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 const char *msg = m ? m : protocol_status_message(n);
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 pb_param *pp = pblock_removekey(pb_key_status, rq->srvhdrs);
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 if (pp != NULL) {
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 param_free(pp);
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 pp = pblock_key_param_create(rq->srvhdrs, pb_key_status, msg, strlen(msg));
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 pblock_kpinsert(pb_key_status, pp, rq->srvhdrs);
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
58 NSAPI_PUBLIC const char * protocol_status_message(int code) {
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
59 cxstring s = protocol_status_message_s(code);
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
60 return s.ptr;
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
61 }
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
62
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 /*
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
65 * based on http_status_message from Open Webserver (frame/http.cpp)
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
67 cxstring protocol_status_message_s(int code)
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 {
87
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 82
diff changeset
69 WS_ASSERT(code > 0);
bdec069d2239 fixed pathcheck behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 82
diff changeset
70
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
71 cxstring r;
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 switch (code)
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 {
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 case PROTOCOL_CONTINUE : // 100
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
76 r = CX_STR("Continue");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 case PROTOCOL_SWITCHING: //101
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
79 r = CX_STR("Switching Protocols");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 case PROTOCOL_OK: // 200
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
82 r = CX_STR("OK");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 case PROTOCOL_CREATED: // 201
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
85 r = CX_STR("Created");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 case PROTOCOL_ACCEPTED: // 202
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
88 r = CX_STR("Accepted");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 case PROTOCOL_NONAUTHORITATIVE: // 203
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
91 r = CX_STR("Non-Authoritative Information");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 case PROTOCOL_NO_CONTENT: //204
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 /* There is another define to PROTOCOL_NO_RESPONSE for 204 in nsapi.h
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 The spec maps this to No Content.
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 Hence cahnging this to No Content
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
98 r = CX_STR("No Content");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 case PROTOCOL_RESET_CONTENT: // 205
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
101 r = CX_STR("Reset Content");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 case PROTOCOL_PARTIAL_CONTENT: // 206
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
104 r = CX_STR("Partial Content");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 case PROTOCOL_MULTI_STATUS: // 207
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
107 r = CX_STR("Multi Status");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 case PROTOCOL_MULTIPLE_CHOICES: // 300
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
110 r = CX_STR("Multiple Choices");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 case PROTOCOL_MOVED_PERMANENTLY: // 301
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
113 r = CX_STR("Moved Permanently");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 case PROTOCOL_REDIRECT: // 302
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
116 r = CX_STR("Moved Temporarily"); /* The spec actually says "Found" */
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 case PROTOCOL_SEE_OTHER: // 303
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
119 r = CX_STR("See Other");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 case PROTOCOL_NOT_MODIFIED: // 304
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
122 r = CX_STR("Use local copy"); /* The spec actually says "Not Modified" */
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 case PROTOCOL_USE_PROXY: // 305
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
125 r = CX_STR("Use Proxy");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 case PROTOCOL_TEMPORARY_REDIRECT: // 307
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
128 r = CX_STR("Temporary Redirect");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 case PROTOCOL_BAD_REQUEST: // 400
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
131 r = CX_STR("Bad request");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 case PROTOCOL_UNAUTHORIZED: // 401
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
134 r = CX_STR("Unauthorized");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 case PROTOCOL_PAYMENT_REQUIRED: // 402
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
137 r = CX_STR("Payment Required");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 case PROTOCOL_FORBIDDEN: // 403
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
140 r = CX_STR("Forbidden");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 case PROTOCOL_NOT_FOUND: // 404
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
143 r = CX_STR("Not found");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 case PROTOCOL_METHOD_NOT_ALLOWED: // 405 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
146 r = CX_STR("Method Not Allowed");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 case PROTOCOL_NOT_ACCEPTABLE: // 406 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
149 r = CX_STR("Not Acceptable");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 case PROTOCOL_PROXY_UNAUTHORIZED: // 407
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
152 r = CX_STR("Proxy Authentication Required");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 case PROTOCOL_REQUEST_TIMEOUT: // 408 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
155 r = CX_STR("Request Timeout");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 case PROTOCOL_CONFLICT: // 409
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
158 r = CX_STR("Conflict"); /* HTTP/1.1 */
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 case PROTOCOL_GONE: // 410
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
161 r = CX_STR("Gone"); /* HTTP/1.1 */
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 case PROTOCOL_LENGTH_REQUIRED: // 411 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
164 r = CX_STR("Length Required");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 case PROTOCOL_PRECONDITION_FAIL: // 412 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
167 r = CX_STR("Precondition Failed");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 case PROTOCOL_ENTITY_TOO_LARGE: // 413 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
170 r = CX_STR("Request Entity Too Large");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 case PROTOCOL_URI_TOO_LARGE: // 414 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
173 r = CX_STR("Request-URI Too Large");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 case PROTOCOL_UNSUPPORTED_MEDIA_TYPE: // 415
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
176 r = CX_STR("Unsupported Media Type");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 case PROTOCOL_REQUESTED_RANGE_NOT_SATISFIABLE: // 416
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
179 r = CX_STR("Requested range not satisfiable");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 case PROTOCOL_EXPECTATION_FAILED: // 417
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
182 r = CX_STR("Expectation Failed");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 case PROTOCOL_LOCKED: // 423
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
185 r = CX_STR("Locked");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 case PROTOCOL_FAILED_DEPENDENCY: // 424
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
188 r = CX_STR("Failed Dependency");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 case PROTOCOL_SERVER_ERROR: // 500
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
191 r = CX_STR("Server Error"); /* The spec actually says "Internal Server Error" */
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 case PROTOCOL_NOT_IMPLEMENTED: // 501
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
194 r = CX_STR("Not Implemented");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 case PROTOCOL_BAD_GATEWAY: // 502
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
197 r = CX_STR("Bad Gateway");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 case PROTOCOL_SERVICE_UNAVAILABLE: // 503
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
200 r = CX_STR("Service Unavailable");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
202 case PROTOCOL_GATEWAY_TIMEOUT: // 504 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
203 r = CX_STR("Gateway Timeout");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 case PROTOCOL_VERSION_NOT_SUPPORTED: // 505 /* HTTP/1.1 */
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
206 r = CX_STR("HTTP Version Not Supported");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 case PROTOCOL_INSUFFICIENT_STORAGE: // 507
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
209 r = CX_STR("Insufficient Storage");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 default:
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 switch (code / 100)
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213 {
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214 case 1:
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
215 r = CX_STR("Information");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 case 2:
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
218 r = CX_STR("Success");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220 case 3:
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
221 r = CX_STR("Redirect");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223 case 4:
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
224 r = CX_STR("Client error");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 case 5:
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
227 r = CX_STR("Server error");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 default:
630
aae6e06d70b8 add protocol_status_message_s function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 513
diff changeset
230 r = CX_STR("Unknown reason");
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233 break;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
234 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 return r;
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
237 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
238
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
239
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
240 void add_http_status_line(CxBuffer *out, pool_handle_t *pool, Request *rq) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
241 cxBufferWrite("HTTP/1.1 ", 1, 9, out);
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
242
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
243 char status_code_str[8];
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
244 int sc_len = snprintf(status_code_str, 8, "%d ", rq->status_num);
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
245 cxBufferWrite(status_code_str, 1, sc_len, out);
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
246
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
247 char *scmsg = pblock_findkeyval(pb_key_status, rq->srvhdrs);
23
a2c8fc23c90e Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 21
diff changeset
248 if(scmsg == NULL) {
a2c8fc23c90e Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 21
diff changeset
249 scmsg = "OK";
a2c8fc23c90e Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 21
diff changeset
250 }
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
251 cxBufferWrite(scmsg, 1, strlen(scmsg), out);
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
252
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
253 cxBufferWrite("\r\n", 1, 2, out);
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
254 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
255
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
256 void add_http_response_header(CxBuffer *out, Request *rq) {
7
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
257 pblock *h = rq->srvhdrs;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
258 pb_entry *p;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
259
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
260 for(int i=0;i<h->hsize;i++) {
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
261 p = h->ht[i];
45
a24aa388f02f added access log
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 44
diff changeset
262 while(p != NULL) {
7
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
263 /* from http.cpp */
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
264 const pb_key *key = PARAM_KEY(p->param);
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
265 if (key == pb_key_status || key == pb_key_server || key == pb_key_date) {
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
266 /* Skip internal Status:, Server:, and Date: information */
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
267 p = p->next;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
268 continue;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
269 }
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
270 /* end http.cpp */
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
271
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
272 char *name = p->param->name;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
273 char *value = p->param->value;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
274
77
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
275 // make first char of name uppercase
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
276 size_t name_len = strlen(name);
7
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
277 if(name[0] > 90) {
77
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
278 /*
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
279 * make first char uppercase and write the remaining chars
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
280 * unmodified to the buffer
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
281 */
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
282 cxBufferPut(out, name[0]-32);
77
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
283 if(name_len > 1) {
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
284 cxBufferWrite(name+1, 1, name_len-1, out);
77
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
285 }
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
286 } else {
f1cff81e425a some fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 67
diff changeset
287 // first char is already uppercase so just write the name
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
288 cxBufferWrite(name, 1, name_len, out);
7
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
289 }
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
290
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
291 cxBufferWrite(": ", 1, 2, out);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
292 cxBufferWrite(value, 1, strlen(value), out);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
293 cxBufferWrite("\r\n", 1, 2, out);
7
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
294
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
295 p = p->next;
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
296 }
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
297 }
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
298 }
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
299
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
300 struct HttpResponseWriter {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
301 Session *sn;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
302 Request *rq;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
303 CxBuffer buf;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
304 };
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
305
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
306 HttpResponseWriter *http_create_response(Session *sn, Request *rq) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
307 HttpResponseWriter *writer = pool_malloc(sn->pool, sizeof(HttpResponseWriter));
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
308 if(!writer) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
309 return NULL;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
310 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
311 if(cxBufferInit(&writer->buf, NULL, 512, pool_allocator(sn->pool), CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
312 pool_free(sn->pool, writer);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
313 return NULL;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
314 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
315 writer->sn = sn;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
316 writer->rq = rq;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
317
23
a2c8fc23c90e Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 21
diff changeset
318 if(rq->status_num == -1) {
a2c8fc23c90e Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 21
diff changeset
319 protocol_status(sn, rq, 200, "OK");
a2c8fc23c90e Added basic authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 21
diff changeset
320 }
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
321
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
322 // add the http status line to the output buffer
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
323 add_http_status_line(&writer->buf, sn->pool, rq);
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
324
103
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
325 // add date header
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
326 struct tm mtms;
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
327 struct tm *mtm = system_gmtime(&rq->req_start, &mtms);
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
328 char date[HTTP_DATE_LEN + 1];
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
329 strftime(date, HTTP_DATE_LEN, HTTP_DATE_FMT, mtm);
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
330 cxBufferWrite("Date: ", 1, 6, &writer->buf);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
331 cxBufferWrite(date, 1, strlen(date), &writer->buf);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
332 cxBufferWrite("\r\n", 1, 2, &writer->buf);
103
d3b514e2ddbd added date header to response
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 101
diff changeset
333
104
a8acbb12f27c implemented range requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 103
diff changeset
334 // add server header
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
335 cxBufferWrite("Server: webserver\r\n", 1, 19, &writer->buf);
104
a8acbb12f27c implemented range requests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 103
diff changeset
336
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
337 // check content length ans transfer encoding
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
338 char *ctlen = pblock_findkeyval(pb_key_content_length, rq->srvhdrs);
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
339 char *enc = pblock_findkeyval(pb_key_transfer_encoding, rq->srvhdrs);
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
340 if(ctlen && enc) {
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
341 pblock_removekey(pb_key_transfer_encoding, rq->srvhdrs);
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
342 }
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
343 if(!ctlen) {
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
344 // set transfer-encoding header
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
345 if(!enc) {
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
346 pblock_kvinsert(
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
347 pb_key_transfer_encoding,
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
348 "chunked",
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
349 7,
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
350 rq->srvhdrs);
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
351 } else if(strcmp(enc, "chunked")) {
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
352 pblock_removekey(pb_key_transfer_encoding, rq->srvhdrs);
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
353 pblock_kvinsert(
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
354 pb_key_transfer_encoding,
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
355 "chunked",
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
356 7,
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
357 rq->srvhdrs);
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
358 }
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
359
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
360 // set stream property
513
9a49c245a49c change net_write to attempt to write all bytes, improve error handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 433
diff changeset
361 httpstream_enable_chunked_write(sn->csd);
80
0de4a90979e1 fixed chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 78
diff changeset
362 rq->rq_attr.chunked = 1;
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
363 }
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
364
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
365 // add header from rq->srvhdrs
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
366 add_http_response_header(&writer->buf, rq);
48
37a512d7b8f6 fixed some memory leaks
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 45
diff changeset
367
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
368 // add connection header
101
7fbcdbad0baa added support for absolute URIs and improved keep alive
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 87
diff changeset
369 if(rq->rq_attr.keep_alive) {
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
370 cxBufferWrite("Connection: keep-alive\r\n", 1, 24, &writer->buf);
78
3578977d29a3 added keep-alive support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 77
diff changeset
371 pblock_kvinsert(pb_key_connection, "keep-alive", 10, rq->srvhdrs);
3578977d29a3 added keep-alive support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 77
diff changeset
372 } else {
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
373 cxBufferWrite("Connection: close\r\n", 1, 19, &writer->buf);
78
3578977d29a3 added keep-alive support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 77
diff changeset
374 pblock_kvinsert(pb_key_connection, "close", 5, rq->srvhdrs);
3578977d29a3 added keep-alive support
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 77
diff changeset
375 }
7
3c2ed7a7a5fd request and response header now used
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 4
diff changeset
376
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
377 // response header end
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
378 cxBufferWrite("\r\n", 1, 2,& writer->buf);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
379
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
380 // reset pos (required for http_start_response_async)
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
381 writer->buf.pos = 0;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
382
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
383 return writer;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
384 }
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
385
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
386 int http_send_response(HttpResponseWriter *writer) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
387 Connection *conn = ((NSAPISession*)writer->sn)->connection;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
388 CxBuffer *buf = &writer->buf;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
389
65
14722c5f8856 added chunked transfer encoding
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 48
diff changeset
390 // flush buffer to the socket
433
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
391 int ret = 0;
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
392 while(buf->pos < buf->size) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
393 int w = conn->write(conn, buf->space + buf->pos, buf->size - buf->pos);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
394 if(w <= 0) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
395 if(conn->ssl) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
396 if(conn->ssl_error == SSL_ERROR_WANT_WRITE) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
397 return 1;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
398 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
399 } else {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
400 if(errno == EWOULDBLOCK) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
401 return 1;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
402 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
403 }
433
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
404 ret = -1;
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
405 break;
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
406 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
407 buf->pos += w;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
408 }
141
ff311b63c3af many fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 121
diff changeset
409
433
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
410 if(ret == 0) {
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
411 writer->rq->senthdrs = 1;
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
412 }
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
413
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
414 cxBufferDestroy(buf);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
415 pool_free(writer->sn->pool, writer);
38
d07810b02147 added ldap authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
416
433
39fe86ae4db0 use non-blocking IO for pipes and socket in send_cgi
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 432
diff changeset
417 return ret;
4
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
418 }
998844b5ed25 Added some protocol functions
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
419
432
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
420
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
421 int http_start_response(Session *sn, Request *rq) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
422 HttpResponseWriter *writer = http_create_response(sn, rq);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
423 if(!writer) {
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
424 return 1;
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
425 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
426
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
427 return http_send_response(writer);
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
428 }
7c9137f9e7f9 add http_send_response function that is usable for non-blocking IO
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 415
diff changeset
429
235
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
430 int http_send_continue(Session *sn) {
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
431 NSAPISession *s = (NSAPISession*)sn;
415
d938228c382e switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 251
diff changeset
432 cxstring msg = CX_STR("HTTP/1.1 100 Continue\r\n\r\n");
235
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
433 int w = s->connection->write(s->connection, msg.ptr, msg.length);
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
434 if(w != msg.length) {
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
435 return 1;
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
436 }
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
437 return 0;
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
438 }
4990147c58d0 add handler for http expect header
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 141
diff changeset
439
9
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
440 int request_header(char *name, char **value, Session *sn, Request *rq) {
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
441 const pb_key *key = pblock_key(name);
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
442 pb_param *pp = pblock_findkey(key, rq->headers);
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
443 if(pp != NULL) {
21
627b09ee74e4 New configuration loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 14
diff changeset
444 *value = pp->value;
9
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
445 return REQ_PROCEED;
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
446 } else {
38
d07810b02147 added ldap authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
447 //return REQ_ABORTED;
d07810b02147 added ldap authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
448 *value = NULL;
d07810b02147 added ldap authentication
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
449 return REQ_NOACTION;
9
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
450 }
30e51941a673 Added mod_jk dependencies
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 8
diff changeset
451 }
82
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
452
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
453 char *http_uri2url(const char *prefix, const char *suffix) {
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
454 // TODO: implement
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
455 return NULL;
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
456 }
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
457
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
458 char *http_uri2url_dynamic(const char *prefix, const char *suffix,
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
459 Session *sn, Request *rq)
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
460 {
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
461 // TODO: implement
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
462 return NULL;
740cfd9dd443 added some nsapi stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 80
diff changeset
463 }
121
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
464
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
465 void http_get_scheme_host_port(
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
466 Session *sn,
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
467 Request *rq,
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
468 char **scheme,
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
469 char **host,
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
470 uint16_t *port)
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
471 {
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
472 Connection *con = ((NSAPISession*)sn)->connection;
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
473
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
474 if(con->ssl) {
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
475 *scheme = HTTPS_SCHEME;
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
476 } else {
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
477 *scheme = HTTP_SCHEME;
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
478 }
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
479
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
480 NSAPIRequest *request = (NSAPIRequest*)rq;
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
481
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
482 if(request->host) {
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
483 *host = request->host;
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
484 } else {
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
485 *host = "localhost";
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
486 }
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
487
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
488 *port = request->port;
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
489
a881dc866e23 adds more CGI stuff
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 110
diff changeset
490 }

mercurial