Added basic structure and setup test directory

This commit is contained in:
TriantaTV 2023-09-12 14:17:01 -05:00
parent eab395c121
commit 629d1e657a
13 changed files with 656 additions and 0 deletions

19
CMakeLists.txt Normal file
View File

@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.10)
project(
proxy-network
LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11 CACHE STRING "The C++ standard to use")
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
include_directories(${proxy-network_SOURCE_DIR}/src)
add_subdirectory(src)
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
add_subdirectory(test)
endif()

View File

@ -1,2 +1,18 @@
# proxy-network # proxy-network
## Compiling the project
Prerequisites
- C++11
In order to compile the project, simply run these two commands:
cmake -B build -S .
cmake --build build
## Running the Project
The program should now be compiled at ./build/bin/proxy-network
Simply run the program using:
build/bin/proxy-network

6
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,6 @@
add_executable(proxy-network
./proxy-network.cpp
)
target_include_directories(proxy-network PUBLIC ${CMAKE_CURRENT_LIST_DIR})

6
src/proxy-network.cpp Normal file
View File

@ -0,0 +1,6 @@
#include <iostream>
int main() {
std::cout << "Hello world" << std::endl;
return 0;
}

0
test/CMakeLists.txt Normal file
View File

304
test/mt_web_server.cpp Normal file
View File

@ -0,0 +1,304 @@
//====================================================== file = weblite.c =====
//= A super light weight HTTP server =
//=============================================================================
//= Notes: =
//= 1) Compiles for Winsock only since uses Windows threads. Generates =
//= one warning about unreachable code in main. Ignore this warning. =
//= 2) Serves HTML and GIF only. =
//= 3) Sometimes the browser drops a connection when doing a refresh. =
//= This is handled by checking the recv() return code in the function =
//= that handles GETs. =
//= 4) The 404 HTML message does not always display in Explorer. =
//=---------------------------------------------------------------------------=
//= Execution notes: =
//= 1) Execute this program in the directory which will be the root for =
//= all file references (i.e., the directory that is considered at =
//= "public.html"). =
//= 2) Open a Web browser and surf to http://xxx.xxx.xxx.xxx/yyy where =
//= xxx.xxx.xxx.xxx is the IP address or hostname of the machine that =
//= weblite is executing on and yyy is the requested object. =
//= 3) The only output (to stdout) from weblite is a message with the =
//= of the file currently being sent =
//=---------------------------------------------------------------------------=
//= Build: bcc32 weblite.c, cl weblite.c wsock32.lib (or ws2_32.lib) =
//= gcc weblite.c -lsocket -lnsl for BSD =
//=---------------------------------------------------------------------------=
//= Execute: weblite =
//=---------------------------------------------------------------------------=
//= History: KJC (12/29/00) - Genesis (from server.c) =
//= HF (01/25/01) - Ported to multi-platform environment =
//=============================================================================
#define WIN // WIN for Windows environment, UNIX for BSD or LINUX env.
//----- Include files ---------------------------------------------------------
#include <stdio.h> // Needed for printf()
#include <stdlib.h> // Needed for exit()
#include <string.h> // Needed for strcpy() and strlen()
#include <fcntl.h> // Needed for file i/o constants
#include <sys/stat.h> // Needed for file i/o constants
/* FOR BSD UNIX/LINUX ---------------------------------------------------- */
#ifdef UNIX
#include <sys/types.h> //
#include <netinet/in.h> //
#include <sys/socket.h> //
#include <arpa/inet.h> //
#endif
/* ------------------------------------------------------------------------ */
/* FOR WIN ---------------------------------------------------------------- */
#ifdef WIN
#include <stddef.h> // Needed for _threadid
#include <process.h> // Needed for _beginthread() and _endthread()
#include <io.h> // Needed for open(), close(), and eof()
#include <windows.h> // Needed for all Winsock stuff
#endif
/* ------------------------------------------------------------------------ */
//----- HTTP response messages ----------------------------------------------
#define OK_IMAGE "HTTP/1.0 200 OK\nContent-Type:image/gif\n\n"
#define OK_TEXT "HTTP/1.0 200 OK\nContent-Type:text/html\n\n"
#define NOTOK_404 "HTTP/1.0 404 Not Found\nContent-Type:text/html\n\n"
#define MESS_404 "<html><body><h1>FILE NOT FOUND</h1></body></html>"
//----- Defines -------------------------------------------------------------
#define BUF_SIZE 4096 // Buffer size (big enough for a GET)
#define PORT_NUM 9080 // Port number for a Web server
//----- Function prototypes -------------------------------------------------
/* FOR WIN --------------------------------------------------------------- */
#ifdef WIN
void handle_get(void *in_arg); // Thread function to handle GET
#endif
/* ----------------------------------------------------------------------- */
/* FOR UNIX/LINUX -------------------------------------------------------- */
#ifdef UNIX
void child_proc(int server_s, int client_s); // Fork function for GET
#endif
/* ----------------------------------------------------------------------- */
//===== modeule main ========================================================
int main(void)
{
/* FOR WIN ------------------------------------------------------------- */
#ifdef WIN
WORD wVersionRequested = MAKEWORD(1, 1); // Stuff for WSA functions
WSADATA wsaData; // Stuff for WSA functions
#endif
/* --------------------------------------------------------------------- */
unsigned int server_s; // Server socket descriptor
struct sockaddr_in server_addr; // Server Internet address
unsigned int client_s; // Client socket descriptor
struct sockaddr_in client_addr; // Client Internet address
struct in_addr client_ip_addr; // Client IP address
int addr_len; // Internet address length
/* FOR UNIX/LINUX ------------------------------------------------------ */
#ifdef UNIX
int nChild_proc_id; // New child process ID.
#endif
/* --------------------------------------------------------------------- */
/* FOR WIN ------------------------------------------------------------- */
#ifdef WIN
// Initialize winsock
WSAStartup(wVersionRequested, &wsaData);
#endif
/* --------------------------------------------------------------------- */
// Create a socket, fill-in address information, and then bind it
server_s = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT_NUM);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(server_s, (struct sockaddr *)&server_addr, sizeof(server_addr));
// Main loop to listen, accept, and then spin-off a thread to handle the GET
while (1)
{
// Listen for connections and then accept
listen(server_s, 100);
addr_len = sizeof(client_addr);
client_s = accept(server_s, (struct sockaddr *)&client_addr, &addr_len);
if (client_s == 0)
{
printf("ERROR - Unable to create socket \n");
exit(1);
}
/* FOR UNIX/LINUX ---------------------------------------------------- */
#ifdef UNIX
// Spin-off a child process by fork
nChild_proc_id = fork();
// Separate the parent and child process here ...
if (nChild_proc_id == -1) // if I am a new child, go to the child module.
{
child_proc(server_s, client_s);
}
#endif
/* ------------------------------------------------------------------- */
/* FOR WIN ----------------------------------------------------------- */
#ifdef WIN
// Spin-off a thread to handle this request (pass only client_s)
if (_beginthread(handle_get, 4096, (void *)client_s) < 0)
{
printf("ERROR - Unable to create thread \n");
exit(1);
}
#endif
/* ------------------------------------------------------------------- */
}
/* FOR UNIX/LINUX ------------------------------------------------------ */
#ifdef UNIX
// Close the server socket
close(server_s);
#endif
/* --------------------------------------------------------------------- */
/* FOR WIN ------------------------------------------------------------- */
#ifdef WIN
// Close the server socket and clean-up winsock
printf("this web server is shutting down .....\a\n");
closesocket(server_s);
WSACleanup();
#endif
/* --------------------------------------------------------------------- */
// To make sure this "main" returns an integer.
return (1);
}
/* FOR WIN --------------------------------------------------------------- */
#ifdef WIN
//===========================================================================
//= This is is the thread function to handle the GET =
//= - It is assumed that the request is a GET =
//===========================================================================
void handle_get(void *in_arg)
{
unsigned int client_s; // Client socket descriptor
char in_buf[BUF_SIZE]; // Input buffer for GET resquest
char out_buf[BUF_SIZE]; // Output buffer for HTML response
char *file_name; // File name
unsigned int fh; // File handle
unsigned int buf_len; // Buffer length for file reads
unsigned int retcode; // Return code
// Set client_s to in_arg
client_s = (unsigned int)in_arg;
// Receive the GET request from the Web browser
retcode = recv(client_s, in_buf, BUF_SIZE, 0);
// Handle the GET if there is one (see note #3 in the header)
if (retcode != -1)
{
// Parse out the filename from the GET request
strtok(in_buf, " ");
file_name = strtok(NULL, " ");
// Open the requested file
// - Start at 2nd char to get rid of leading "\"
fh = open(&file_name[1], O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
// Generate and send the response (404 if could not open the file)
if (fh == -1)
{
printf("File %s not found - sending an HTTP 404 \n", &file_name[1]);
strcpy(out_buf, NOTOK_404);
send(client_s, out_buf, strlen(out_buf), 0);
strcpy(out_buf, MESS_404);
send(client_s, out_buf, strlen(out_buf), 0);
}
else
{
printf("File %s is being sent \n", &file_name[1]);
if (strstr(file_name, ".gif") != NULL)
strcpy(out_buf, OK_IMAGE);
else
strcpy(out_buf, OK_TEXT);
send(client_s, out_buf, strlen(out_buf), 0);
while (!eof(fh))
{
buf_len = read(fh, out_buf, BUF_SIZE);
send(client_s, out_buf, buf_len, 0);
}
close(fh);
}
}
// Close the client socket and end the thread
closesocket(client_s);
_endthread();
}
#endif
/* ----------------------------------------------------------------------- */
/* FOR UNIX/LINUX -------------------------------------------------------- */
#ifdef UNIX
void child_proc(int server_s, int client_s)
{
char in_buf[BUF_SIZE]; // Input buffer for GET resquest
char out_buf[BUF_SIZE]; // Output buffer for HTML response
char *file_name; // File name
unsigned int fh; // File handle
unsigned int buf_len; // Buffer length for file reads
unsigned int retcode; // Return code
// Shut down the parent pipe
close(server_s);
// Receive the GET request from the Web browser
retcode = recv(client_s, in_buf, BUF_SIZE, 0);
// Handle the GET if there is one (see note #3 in the header)
if (retcode != -1)
{
// Parse out the filename from the GET request
strtok(in_buf, " ");
file_name = strtok(NULL, " ");
// Open the requested file
// - Start at 2nd char to get rid of leading "\"
// fh = open(&file_name[1], O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
fh = open(&file_name[1], O_RDONLY, S_IREAD | S_IWRITE);
// Generate and send the response (404 if could not open the file)
if (fh == -1)
{
printf("File %s not found - sending an HTTP 404 \n", &file_name[1]);
strcpy(out_buf, NOTOK_404);
send(client_s, out_buf, strlen(out_buf), 0);
strcpy(out_buf, MESS_404);
send(client_s, out_buf, strlen(out_buf), 0);
}
else
{
printf("File %s is being sent \n", &file_name[1]);
if (strstr(file_name, ".gif") != NULL)
strcpy(out_buf, OK_IMAGE);
else
strcpy(out_buf, OK_TEXT);
send(client_s, out_buf, strlen(out_buf), 0);
while (fh != EOF)
{
buf_len = read(fh, out_buf, BUF_SIZE);
send(client_s, out_buf, buf_len, 0);
}
close(fh);
}
}
// Shut down my (the child) pipe
close(client_s);
}
#endif
/* ----------------------------------------------------------------------- */

109
test/multi_threads.cpp Normal file
View File

@ -0,0 +1,109 @@
/* ************************************************************************* *
* *
* Multi.cpp: *
* This is a sample program for multi-threaded applications. *
* *
* As soon as this program starts, the main thread generates two child *
* threads. The two child threads wait for 10 seconds and terminate. *
* *
* While the two child threads are running, the main thread waits. The *
* main thread waits until both threads finish. *
* *
* Compile: *
* In Project->Setting->C/C++->CodeGenartion(in Category) *
* ->Select Multi-threaded for runtime library *
* *
* Coded by: H. Fujinoki *
* September 12, 11:00 AM at Edwardsville, IL *
* *
* ************************************************************************* */
#include <process.h> // for thread system calls (_beginthread, etc.)
#include <windows.h> // for TRUE, FALSE labels
#include <stdio.h> // for printf
#include <time.h> // for clock() and CLK_TCK
/* Global label defenition ------------------------------------------------ */
#define INTERVAL 1 // Transmission interval in seconds
#define REPEATS 50 // Number of child thread's repeats
/* Global Variables ------------------------------------------------------- */
int nChild1_status; // Child thread #1 status
int nChild2_status; // Child thread #2 status
/* Prototypes ------------------------------------------------------------- */
void ChildThread1(void *dummy); // The child thread #1
void ChildThread2(void *dummy); // The child thread #2
/* The MAIN --------------------------------------------------------------- */
void main (void)
{
/* Set the child thread status (TRUE = RUNNING) --- */
nChild1_status = TRUE;
nChild2_status = TRUE;
/* Create and start the two threads --- */
_beginthread (ChildThread1, 0, NULL ); // Start child process #1
_beginthread (ChildThread2, 0, NULL ); // Start child process #2
/* Spin-loop until both threads finish --- */
while ((nChild1_status == TRUE)||(nChild2_status == TRUE))
{ ; }
/* Two threads are now finished --- */
printf("Both child threads are finished ... \n");
printf("The main thread is finishing ... \n");
}
// The Child-Thread #1 ///////////////////////////////////////////////////////
void ChildThread1(void *dummy)
{
/* Child #1 local variable(s) --- */
int i; // Loop counter
/* This thread is started --- */
printf("Child Thread #1 has started ... \n");
/* wait for 10 seconds w/ count down --- */
for (i = 0; i < REPEATS ; i++)
{
/* Wait for 10 seconds --- */
Sleep((clock_t)INTERVAL * CLOCKS_PER_SEC);
/* Display count down --- */
printf("Child #1: %d more second(s) to finish ...\n", REPEATS -i);
}
/* Reset the status flag --- */
nChild1_status = FALSE;
/* Terminate this thread --- */
_endthread();
}
// The Child-Thread #2 ///////////////////////////////////////////////////////
void ChildThread2(void *dummy)
{
/* Child #2 local variable(s) --- */
int i; // Loop counter
/* This thread is started --- */
printf("Child Thread #2 has started ... \n");
/* wait for 10 seconds w/ count down --- */
for (i = 0; i < REPEATS ; i++)
{
/* Wait for 10 seconds --- */
Sleep((clock_t)INTERVAL * CLOCKS_PER_SEC);
/* Display count down --- */
printf("Child #2: %d more second(s) to finish ...\n", REPEATS -i);
}
/* Reset the status flag --- */
nChild2_status = FALSE;
/* Terminate this thread --- */
_endthread();
}
// THE END OF LINES //////////////////////////////////////////////////////////

BIN
test/page/almost_done.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

196
test/page/index.html Normal file
View File

@ -0,0 +1,196 @@
<HTML>
<HEAD>
<TITLE>Southern Illinois University Edwardsville</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<!--
<TABLE BORDERCOLOR="#FF0000" WIDTH="75%" ALIGN="CENTER" BORDER=4 CELLPADDING=5>
<TR>
<TD>
<FONT COLOR="#FF0000"><STRONG>Wednesday, December 13: The Vice Chancellor for Administration
has announced that due to inclement weather, the University will close at noon today, Wednesday, December 13. All final examinations scheduled to begin at noon or later will be rescheduled according to the <a href="http://www.register.siue.edu/registrar/schedules/examschedulefa01-inclweath.htm">Final Exam Inclement Weather Schedule</a>. Please consult <a href="http://www.siue.edu/CWIS/inclement.html">Inclement Weather Services</a> for information regarding services available during inclement weather closings and their hours of operation.
</STRONG>
</FONT>
</TD>
</TR>
</TABLE>
-->
<P>
<CENTER>
<IMG SRC="siuehdr2.jpg" USEMAP="#siuehdr" WIDTH=484 HEIGHT=113 BORDER=0 ALT=""><BR>
<IMG SRC="almost_done.gif">
<BR CLEAR=LEFT>
<MAP NAME="siuehdr">
<AREA SHAPE="rect" HREF="http://www.siu.edu/" COORDS="150,2,331,58">
<AREA SHAPE="rect" HREF="/CWIS/search.html" COORDS="3,71,133,89">
<AREA SHAPE="rect" HREF="/CWIS/whatsnew.html" COORDS="1,93,149,106">
<AREA SHAPE="rect" HREF="/CWIS/readyref.html" COORDS="341,72,477,90">
<AREA SHAPE="rect" HREF="/PA/" COORDS="338,94,484,108">
</MAP>
<IMG SRC="siuebdy1.jpg" USEMAP="#siuebdy" WIDTH=540 HEIGHT=486 BORDER=0 ALT="">
<BR CLEAR=LEFT>
<MAP NAME="siuebdy">
<AREA SHAPE="poly" HREF="/COVERSTORY/"
COORDS="7,7,115,7,97,26,7,26,0,17">
<AREA SHAPE="poly" HREF="http://www.admis.siue.edu/tour/" COORDS="122,8,108,21,211,22,223,9,122,8">
<AREA SHAPE="poly" HREF="/CWIS/pubcalendar.html"
COORDS="228,9,214,22,314,21,325,9,224,8,228,9">
<AREA SHAPE="poly" HREF="/ATHLETIC/"
COORDS="330,10,315,21,417,21,426,9,326,9,330,10">
<AREA SHAPE="poly" HREF="http://www.library.siue.edu/" COORDS="430,7,521,7,527,15,523,19,418,20">
<AREA SHAPE="rect" HREF="/CHANCELLOR/" COORDS="12,296,188,313">
<AREA SHAPE="rect" HREF="http://www.admis.siue.edu/" COORDS="12,365,258,384">
<AREA SHAPE="poly" HREF="CWIS/qikstudent.html" COORDS="112,449,123,463,224,462,209,448,108,448,112,449">
<AREA SHAPE="poly" HREF="CWIS/qikemploy.html" COORDS="214,448,229,463,240,463,326,463,312,448,214,448">
<AREA SHAPE="poly" HREF="CWIS/qikalumni.html" COORDS="317,448,333,464,429,463,413,448,317,448">
<AREA SHAPE="poly" HREF="CWIS/qikvisitor.html" COORDS="416,447,434,464,522,462,528,450,520,444,416,447">
<AREA SHAPE="rect" HREF="CWIS/academic.html" COORDS="375,184,500,215">
<AREA SHAPE="rect" HREF="CWIS/admin.html" COORDS="375,221,500,252">
<AREA SHAPE="rect" HREF="CWIS/community.html" COORDS="375,260,500,290">
<AREA SHAPE="rect" HREF="CWIS/publications.html" COORDS="375,297,500,319">
<AREA SHAPE="rect" HREF="CWIS/stdorg.html" COORDS="375,325,500,349">
<AREA SHAPE="rect" HREF="CWIS/student.html" COORDS="375,357,500,389">
</MAP>
<BR CLEAR="all">
<FONT SIZE="-1"><EM><STRONG>Urban opportunities at a suburban university: a 2,660-acre<BR> campus only 25 minutes from downtown St. Louis</STRONG></EM></FONT>
<P>
<FONT SIZE="+1"><A HREF="~gconroy/grow.html">Watch Us Grow</A>
</FONT>
<P>
<ADDRESS>
<STRONG><FONT SIZE="-1">Southern Illinois University Edwardsville<BR>
Edwardsville, Illinois 62026<BR>
618-650-2000</STRONG>
</FONT></ADDRESS>
<P>
<!-- Scrolling Announcement -->
<!--
<applet code="ScrollingText.class" width=600 height=30>
<param name=Text value="Beginning Tuesday, May 26, the prefix for all Edwardsville campus phone numbers will be 650 ...">
<param name=font value="TimesRoman">
<param name=fontsize value="18">
<param name=fontstyle value="Plain">
<param name=bgcolor value="White">
<param name=fgcolor value="0,84,70">
<param name=delay value="75">
<param name=dist value="5">
<param name=direction value="RightLeft">
<param name=align value="Center">
<FONT COLOR="#005446">
<STRONG>
Beginning Tuesday, May 26, the prefix for all Edwardsville campus phone numbers will be 650 ...</STRONG>
</FONT>
</applet>
-->
<P>
<IMG SRC="rule1.gif" ALT="" WIDTH=500 HEIGHT=20>
<!-- IMG SRC="CWIS/IMAGES/rule1.gif" ALT="" WIDTH=500 HEIGHT=2>
<P>
| <A HREF="/CHANCELLOR/">From the Chancellor</A>
|<BR>
| <A HREF="/AQIP">Academic Quality Improvement Project (AQIP)</a>
|<BR>
| <A HREF="http://www.admis.siue.edu/">Admission to SIUE</A>
| <A HREF="/COUGARNET/">CougarNet</A>
|<BR>
<P>
| <A HREF="CWIS/academic.html">Academic Programs</A>
| <A HREF="CWIS/admin.html">Administrative Services</A>
|<BR>
| <A HREF="CWIS/community.html">Community Services</A>
| <A HREF="CWIS/publications.html">Publications</A>
|<BR>
| <A HREF="CWIS/stdorg.html">Student Organizations</A>
| <A HREF="CWIS/student.html">Student Services</A>
|<BR>
<P>
| <A HREF="/COVERSTORY/">Cover Story</A>
|<BR>
| <A HREF="http://www.admis.siue.edu/tour/">Campus Tour</A>
| <A HREF="/CWIS/pubcalendar.html">Calendars</A>
| <A HREF="http://www.library.siue.edu/">Library</A>| <A HREF="/ATHLETIC/">Athletics</A>
|<BR>
<P>
<IMG SRC="CWIS/IMAGES/rule1.gif" ALT="" WIDTH=500 HEIGHT=2>
<FONT SIZE="-1">
<P>
| <A HREF="http://www.siu.edu/">University Home Page</A>
| <A HREF="CWIS/contents.html">Contents</A>
| <A HREF="CWIS/search.html">Search</A>
| <A HREF="CWIS/readyref.html">Ready Reference</A>
| <A HREF="CWIS/whatsnew.html">What's New?</A>
|<BR>
<FONT COLOR="#FF0000">QuickLinks for:</FONT>
| <A HREF="CWIS/qikstudent.html">Students</A>
| <A HREF="CWIS/qikemploy.html">Employees</A>
| <A HREF="CWIS/qikalumni.html">Alumni</A>
| <A HREF="CWIS/qikvisitor.html">Visitors</A>
|<BR>
<P>
<IMG SRC="CWIS/IMAGES/rule1.gif" ALT="" WIDTH=500 HEIGHT=2>
</CENTER>
<BLOCKQUOTE>
<P>
<EM>
<STRONG>URL: </STRONG>
http://www.siue.edu/<BR>
<STRONG>Published by: </STRONG>
SIUE CWIS Committee<BR>
Copyright &copy; 2001, Board of Trustees, Southern Illinois University
</EM>
</BLOCKQUOTE>
</FONT>
<!--
<P>
<TABLE BORDERCOLOR=#FF0000" WIDTH="50%" ALIGN="CENTER" BORDER=2 CELLPADDING=5>
<TR>
<TD>
<FONT SIZE=-1>
The SIUE agent who receives claims of infringement under
Title II of the <STRONG>Digital Millennium Copyright Act</STRONG> is <BR>
<BLOCKQUOTE>
Kim Kirn, University Legal Counsel<BR>
Telephone: 618-650-2514<BR>
Fax: 618-650-2270<BR>
E-mail: <A HREF="mailto:kkirn@siue.edu">kkirn@siue.edu</A>
</BLOCKQUOTE>
</FONT>
</TD>
</TR>
</TABLE>
-->
</BODY>
</HTML>

BIN
test/page/rule1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
test/page/siuebdy1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

BIN
test/page/siuebdy4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
test/page/siuehdr2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB