Bump copyright year
[yaz-moved-to-github.git] / test / tst_comstack.c
1 /* This file is part of the YAZ toolkit.
2  * Copyright (C) 1995-2010 Index Data
3  * See the file LICENSE for details.
4  */
5
6 #include <stdlib.h>
7 #include <stdio.h>
8
9 #include <yaz/test.h>
10 #include <yaz/comstack.h>
11
12 static void tst_http_request(void)
13 {
14     {
15         /* no content, no headers */
16         const char *http_buf = 
17             /*123456789012345678 */
18             "GET / HTTP/1.1\r\n"
19             "\r\n"
20             "GET / HTTP/1.0\r\n";
21         
22         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
23         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
24         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 16), 0);
25         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 17), 0);
26         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 18), 18);
27         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 19), 18);
28     }
29     {
30         /* one header, no content */
31         const char *http_buf = 
32             /*123456789012345678 */
33             "GET / HTTP/1.1\r\n"
34             "Content-Type: x\r\n"
35             "\r\n"
36             "GET / HTTP/1.0\r\n";
37         
38         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
39         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
40         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 34), 0);
41         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 35);
42         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 36), 35);
43     }        
44     {
45         /* one content-length header, length 0 */
46         const char *http_buf = 
47             /*123456789012345678 */
48             "GET / HTTP/1.1\r\n"
49             "Content-Length: 0\r\n"
50             "\r\n"
51             "GET / HTTP/1.0\r\n";
52         
53         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
54         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
55         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 35), 0);
56         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 37), 37);
57         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 37);
58     }        
59     {
60         /* one content-length header, length 5 */
61         const char *http_buf = 
62             /*123456789012345678 */
63             "GET / HTTP/1.1\r\n"
64             "Content-Length: 5\r\n"
65             "\r\n"
66             "ABCDE"
67             "GET / HTTP/1.0\r\n";
68         
69         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
70         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
71         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 0);
72         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 42);
73         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 43), 42);
74     }        
75     {
76         /* LF only in GET, one content-length header, length 5 */
77         const char *http_buf = 
78             /*123456789012345678 */
79             "GET / HTTP/1.1\n"
80             "Content-Length: 5\r\n"
81             "\r\n"
82             "ABCDE"
83             "GET / HTTP/1.0\r\n";
84         
85         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
86         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
87         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 0);
88         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 41);
89         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 42), 41);
90     }        
91     {
92         /* LF only in all places, one content-length header, length 5 */
93         const char *http_buf = 
94             /*123456789012345678 */
95             "GET / HTTP/1.1\n"
96             "Content-Length: 5\n"
97             "\n"
98             "ABCDE"
99             "GET / HTTP/1.0\r\n";
100         
101         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
102         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
103         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 38), 0);
104         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 39);
105         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 39);
106     }        
107
108     {
109         /* one header, unknown transfer-encoding (no content) */
110         const char *http_buf = 
111             /*12345678901234567890123456789 */
112             "GET / HTTP/1.1\r\n"
113             "Transfer-Encoding: chunke_\r\n"
114             "\r\n"
115             "GET / HTTP/1.0\r\n";
116         
117         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 45), 0);
118         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 46), 46);
119     }        
120
121     {
122         /* one header, one chunk */
123         const char *http_buf = 
124             /*12345678901234567890123456789 */
125             "GET / HTTP/1.1\r\n"
126             "Transfer-Encoding: chunked\r\n"
127             "\r\n"
128             "3\r\n"
129             "123\r\n"
130             "0\r\n\r\n"
131             "GET / HTTP/1.0\r\n";
132         
133         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 58), 0);
134         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 59), 59);
135     }        
136
137     {
138         /* one header, two chunks */
139         const char *http_buf = 
140             /*12345678901234567890123456789 */
141             "GET / HTTP/1.1\r\n"
142             "Transfer-Encoding: chunked\r\n"
143             "\r\n"
144             "3\r\n"
145             "123\r\n"
146             "2\r\n"
147             "12\n"
148             "0\r\n\r\n"
149             "GET / HTTP/1.0\r\n";
150         
151         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 64), 0);
152         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 65), 65);
153     }        
154 }
155
156 static void tst_http_response(void)
157 {
158     {
159         /* unlimited content, no headers */
160         const char *http_buf = 
161             /*123456789012345678 */
162             "HTTP/1.1 200 OK\r\n"
163             "\r\n"
164             "HTTP/1.1 200 OK\r\n";
165         
166         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
167         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
168         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 0);
169     }
170     {
171         /* response, content  */
172         const char *http_buf = 
173             /*123456789012345678 */
174             "HTTP/1.1 200 OK\r\n"
175             "Content-Length: 2\r\n"
176             "\r\n"
177             "12"
178             "HTTP/1.1 200 OK\r\n";
179         
180         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0);
181         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0);
182         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 39), 0);
183         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 40), 40);
184         YAZ_CHECK_EQ(cs_complete_auto(http_buf, 41), 40);
185     }
186 }
187
188
189 int main (int argc, char **argv)
190 {
191     YAZ_CHECK_INIT(argc, argv);
192     YAZ_CHECK_LOG();
193     tst_http_request();
194     tst_http_response();
195     YAZ_CHECK_TERM;
196 }
197
198 /*
199  * Local variables:
200  * c-basic-offset: 4
201  * c-file-style: "Stroustrup"
202  * indent-tabs-mode: nil
203  * End:
204  * vim: shiftwidth=4 tabstop=8 expandtab
205  */
206