@@ -59,10 +59,17 @@
59 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Destinations for output text.
60 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
61 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CGI_HEADER 0
62 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CGI_BODY 1
63 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Flags for SSH HTTP clients
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CGI_SSH_CLIENT 0x0001 /* Client is SSH */
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CGI_SSH_COMPAT 0x0002 /* Compat for old SSH transport */
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CGI_SSH_FOSSIL 0x0004 /* Use new Fossil SSH transport */
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
64 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
65 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
66 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
67 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The HTTP reply is generated in two pieces: the header and the body.
68 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These pieces are generated separately because they are not necessary
@@ -451,15 +458,15 @@
451 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
452 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void cgi_replace_parameter(const char *zName, const char *zValue){
453 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
454 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nUsedQP; i++){
455 462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_strcmp(aParamQP[i].zName,zName)==0 ){
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aParamQP[i].zValue = zValue;
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aParamQP[i].zValue = mprintf("%s",zValue);
457 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
458 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
459 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cgi_set_parameter_nocopy(zName, zValue);
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_set_parameter_nocopy(zName, mprintf("%s",zValue));
461 468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
462 469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
463 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
464 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add a query parameter. The zName portion is fixed but a copy
465 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** must be made of zValue.
@@ -1283,10 +1290,235 @@
1283 1290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1284 1291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1285 1292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_init();
1286 1293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_trace(0);
1287 1294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine handles a single HTTP request from an SSH client which is
1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** coming in on g.httpIn and which replies on g.httpOut
1299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Once all the setup is finished, this procedure returns
1301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and subsequent code handles the actual generation of the webpage.
1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It is called in a loop so some variables will need to be replaced
1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void cgi_handle_ssh_http_request(const char *zIpAddr){
1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int nCycles = 0;
1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static char *zCmd = 0;
1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z, *zToken;
1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zType;
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, content_length;
1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zLine[2000]; /* A single line of input. */
1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zIpAddr ){
1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("REMOTE_ADDR", zIpAddr);
1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.zIpAddr = mprintf("%s", zIpAddr);
1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_panic("missing SSH IP address");
1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fgets(zLine, sizeof(zLine),g.httpIn)==0 ){
1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("missing HTTP header");
1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(zLine, &z);
1326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed HTTP header");
1328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(zToken, "echo")==0 ){
1331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* start looking for probes to complete transport_open */
1332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCmd = cgi_handle_ssh_probes(zLine, sizeof(zLine), z, zToken);
1333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fgets(zLine, sizeof(zLine),g.httpIn)==0 ){
1334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("missing HTTP header");
1335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(zLine, &z);
1338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed HTTP header");
1340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( zToken && strlen(zToken)==0 ){
1342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* transport_flip request and continued transport_open */
1343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_handle_ssh_transport(zCmd);
1344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fgets(zLine, sizeof(zLine),g.httpIn)==0 ){
1345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("missing HTTP header");
1346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(zLine, &z);
1349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed HTTP header");
1351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(zToken,"GET")!=0 && fossil_strcmp(zToken,"POST")!=0
1355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && fossil_strcmp(zToken,"HEAD")!=0 ){
1356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("unsupported HTTP method");
1357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("GATEWAY_INTERFACE","CGI/1.0");
1361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("REQUEST_METHOD",zToken);
1362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(z, &z);
1365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed URL in HTTP header");
1367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("REQUEST_URI", zToken);
1370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("SCRIPT_NAME", "");
1371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; zToken[i] && zToken[i]!='?'; i++){}
1374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken[i] ) zToken[i++] = 0;
1375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("PATH_INFO", zToken);
1377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_replace_parameter("PATH_INFO", zToken);
1379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Get all the optional fields that follow the first line.
1382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( fgets(zLine,sizeof(zLine),g.httpIn) ){
1384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zFieldName;
1385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zVal;
1386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zFieldName = extract_token(zLine,&zVal);
1389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zFieldName==0 || *zFieldName==0 ) break;
1390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( fossil_isspace(*zVal) ){ zVal++; }
1391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = strlen(zVal);
1392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( i>0 && fossil_isspace(zVal[i-1]) ){ i--; }
1393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zVal[i] = 0;
1394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; zFieldName[i]; i++){
1395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zFieldName[i] = fossil_tolower(zFieldName[i]);
1396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(zFieldName,"content-length:")==0 ){
1398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content_length = atoi(zVal);
1399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strcmp(zFieldName,"content-type:")==0 ){
1400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.zContentType = zType = mprintf("%s", zVal);
1401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strcmp(zFieldName,"host:")==0 ){
1402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("HTTP_HOST", zVal);
1404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strcmp(zFieldName,"user-agent:")==0 ){
1406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("HTTP_USER_AGENT", zVal);
1408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strcmp(zFieldName,"x-fossil-transport:")==0 ){
1410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strnicmp(zVal, "ssh", 3)==0 ){
1411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.fSshClient |= CGI_SSH_FOSSIL;
1413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.fullHttpReply = 0;
1414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_setenv("X-FOSSIL_TRANSPORT", zVal);
1415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nCycles==0 ){
1421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ! ( g.fSshClient & CGI_SSH_FOSSIL ) ){
1422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* did not find new fossil ssh transport */
1423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.fSshClient &= ~CGI_SSH_CLIENT;
1424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.fullHttpReply = 1;
1425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_replace_parameter("REMOTE_ADDR", "127.0.0.1");
1426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_reset_content();
1430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_destination(CGI_BODY);
1431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( content_length>0 && zType ){
1433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&g.cgiIn);
1434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(zType, "application/x-fossil")==0 ){
1435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_channel(&g.cgiIn, g.httpIn, content_length);
1436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_uncompress(&g.cgiIn, &g.cgiIn);
1437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strcmp(zType, "application/x-fossil-debug")==0 ){
1438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_channel(&g.cgiIn, g.httpIn, content_length);
1439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( fossil_strcmp(zType, "application/x-fossil-uncompressed")==0 ){
1440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_channel(&g.cgiIn, g.httpIn, content_length);
1441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(0);
1444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCycles++;
1445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine handles the old fossil SSH probes
1449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *cgi_handle_ssh_probes(char *zLine, int zSize, char *z, char *zToken){
1451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Start looking for probes */
1452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( fossil_strcmp(zToken, "echo")==0 ){
1453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(z, &z);
1454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed probe");
1456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strncmp(zToken, "test", 4)==0 ||
1458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_strncmp(zToken, "probe-", 6)==0 ){
1459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fprintf(g.httpOut, "%s\n", zToken);
1460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fflush(g.httpOut);
1461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed probe");
1463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fgets(zLine, zSize, g.httpIn)==0 ){
1465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed probe");
1466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(zLine, &z);
1469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed probe");
1471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Got all probes now first transport_open is completed
1475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** so return the command that was requested
1476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* *zCmd = mprintf("%s", zToken); */
1478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return mprintf("%s", zToken);
1479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine handles the old fossil SSH transport_flip
1483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and transport_open communications if detected.
1484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void cgi_handle_ssh_transport(const char *zCmd){
1486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z, *zToken;
1487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zLine[2000]; /* A single line of input. */
1488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* look for second newline of transport_flip */
1490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fgets(zLine, sizeof(zLine),g.httpIn)==0 ){
1491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("incorrect transport_flip");
1492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(zLine, &z);
1495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken && strlen(zToken)==0 ){
1496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* look for path to fossil */
1497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fgets(zLine, sizeof(zLine),g.httpIn)==0 ){
1498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if ( zCmd==0 ){
1499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("missing fossil command");
1500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* no new command so exit */
1502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_exit(0);
1503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_trace(zLine);
1506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zToken = extract_token(zLine, &z);
1507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zToken==0 ){
1508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("malformed fossil command");
1509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* see if we've seen the command */
1511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zCmd && zCmd[0] && fossil_strcmp(zToken, zCmd)==0 ){
1512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
1513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("transport_open failed");
1515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ malformed_request("transport_flip failed");
1518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1288 1520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1289 1521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1290 1522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine handles a single SCGI request which is coming in on
1291 1523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** g.httpIn and which replies on g.httpOut
1292 1524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1293 1525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!