1http Brief Introduction
HTTP Hypertext Transfer Protocol: Host address: Port/url
Host is resolved to an IP address by the DNS server, so you can sometimes use the domain name directly,
HTTP default Access 80 port, HTTPS default Access 443 port
The general process is: After the browser enters the address, first establish a TCP connection with the Web server,
Then the browser sends the HTTP request message, the Web server responds to the message,
Then give him a response, and then the server actively disconnects.
2HTTP Request Message Format
The first one is the method of the request, and here's how:
Get,post,head,put,delete,options,trace,connect;
1GET
In the browser input URL, the browser will send a Get HTTP message request.
If you do not write the URL by default the "/" server can correspond to the page according to this response.
The header information contains some important request information, such as the host address.
Browser version, the phone's page is based on this to do.
The GET carry parameter is inside the URL, and the post is carried inside the package body.
The package body becomes body and the request head is called head.
Get pass parameters, format/url? username=xxx&passwd=bbb resolving parameter parts by question mark
The URL's pass-through parameters are limited, and each browser limit is different. URL does not allow carriage return line-wrapping
2POST
Post is also a request operation, and his data parameters are carried in the body of the HTTP request.
All parameters are not allowed to have the carriage return of the existence of a line, many times if you have to carry
To enter a line, you must first convert the data to Base64 encoding, because it does not have a carriage return to change. He is a common way to solve network transmission.
3HTTP Response Message Format
1 Status code: Success of request, status code description: Reason for success or failure
Sometimes access to a page will appear 404, this 404 is the status code.
4http Data transfer Mode
1 two important parameters in the transmission: written in the head surface
transfer-encoding:identity,chunked Which means the current body is a protocol .
Content-length:length: Length of packet
2Identity Direct send mode, length at the back of the data
3chunked mode, followed by each chunk package [Baotou, packet data]
Baotou: The first byte represents a Assic data, the second byte is also the Assic data
Two bytes combined to form a 16 binary data.
back two bytes, fixed 0d0a (carriage return line break) two bytes These 4 bytes are a chunk header,
The following packet is determined by the previous two bytes. The end flag for the packet is
0d 0a 30ASCLL code stands for 0.
That is, the end of the chunk package: is to meet a chunk equal to 0 end.
Then integrate this package to form the complete data.
5http Status Codes and tables
/*
{
[+] = "Continue",
[101] = "Switching Protocols",
[+] = "OK",
[201] = "Created",
[202] = "Accepted",
[203] = "non-authoritative Information",
[204] = "No Content",
[205] = "Reset Content",
[206] = "Partial Content",
[] = "Multiple Choices",
[301] = "Moved permanently",
[302] = "Found",
[303] = "See other",
[304] = "Not Modified",
[305] = "Use Proxy",
[307] = "Temporary Redirect",
[+] = "Bad Request",
[401] = "Unauthorized",
[402] = "Payment Required",
[403] = "Forbidden",
[404] = "Not Found",
[405] = "Method not Allowed",
[406] = "not acceptable",
[407] = "Proxy authentication Required",
[408] = "Request time-out",
[409] = "Conflict",
[410] = "Gone",
[411] = "Length Required",
[412] = "precondition Failed",
[413] = "Request Entity Too Large",
[414] = "Request-uri Too Large",
[415] = "Unsupported Media Type",
[416] = "Requested range not satisfiable",
[417] = "expectation Failed",
[+] = "Internal Server Error",
[501] = "Not Implemented",
[502] = "Bad Gateway",
[503] = "Service unavailable",
[504] = "Gateway time-out",
[505] = "HTTP Version not supported",
}
*/
6 use Http_parmer to parse the URL read and return it to the client
Parse our HTTP message http_parser p;http_parser_init (&p,http_request); http_parser_settings s;http_parser_ Settings_init (&s);//resolves to url callback s.on_url = ws_on_url;//resets parsing information init_ws_params ();//parser execution. Returns the parsed number of bytes http_parser_execute (&p,&s,http_req,len);//sets the callback function switch (P.method) //the way the message responds { Case http_get:{int len_url = filter_url (Ws_http.url);//access to the webpage if (strncmp (" /", ws_http.url, len_url) == 0) { //Access Test this htmlstrncpy (ws_http.url, " www_root/ Index.html ", strlen (" www_root/index.html "));} else if (strncmp ("/test", ws_http.url, len_url) == 0) { //access to the default url root directory strncpy (ws_http.url, "www_root/test.html", strlen ("www_root/test.html"));} Char* file_data = open_files (Ws_http.url);//delivery paper that is, response client//Release memory free (file_data);} Break;case http_post:break;} endprintf ("\ n"); Read file Static char* open_files (char* filename) {//Read this file File* f = fopen (filename, "RB");//File Size Int file_size = 0;fseek (f,0,seek_end ); File_size = ftell (f);//pointer to file header fseek (f, 0, 0); Char* file_data = malloc ( file_size + 1); fread (file_data, file_size,1, f); File_data[file_size] = 0;fclose ( f); return file_data;}
7 Response Request Message
Use identity to send response message static voidwrite_ok_identity (int sock, char* body) {int len = strlen (body);//Use Direct mode transfer-encoding:identitychar* send_line = malloc (len + 8096), memset (send_line, 0, sizeof (send_line));// Response HTTP Header sprintf (send_line, "http/1.1%d%s\r\n", "OK");//Set the head of some information such as transfer mode body length char* walk = send_line;//Skip this head wal K = walk + strlen (walk), sprintf (Walk, "transfer-encoding:%s\r\n", "Identity"),//body length walk = walk + strlen (walk); Head End sprintf (Walk, "Content-length:%d\r\n\r\n0", Len);//write data section walk = walk + strlen (walk); sprintf (Walk, "%s", body);// Send message response to client send (sock, Send_line, strlen (Send_line), 0); free (send_line); walk = NULL;}
C Language Implementation Simple Web server