XÂY DỰNG CHƯƠNG TRÌNH CGI TRÊN C

13 364 0
XÂY DỰNG CHƯƠNG TRÌNH CGI TRÊN C

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 44 Ebook Team chơng ii xây dựng một chơng trình CGI trên C I Truyền số liệu cho CGI gateway Web Server có thể chuyển thông tin cho gateway bằng tham số dòng lệnh, bằng biến môi trờng hoặc bằng dòng nhập chuẩn. I.1 Truyền thông tin qua tham số dòng lệnh Ta xem xét trờng hợp Web Server truyền thông tin cho các gateway qua tham số dòng lệnh (command line argument). Trong trờng hợp này, Web Server tách chuỗi tham số dòng lệnh thành các từ riêng rẽ và phân cách chúng bằng các dấu cộng (+) rồi đặt chúng vào tham số dòng lệnh. Từ đầu tiên của chuỗi yêu cầu sẽ trở thành phần tử đầu tiên ngay sau tên của ngữ trình. Chú ý là nếu chuỗi yêu cầu dài quá độ dài quy định của tham số dòng lệnh thì Server sẽ không ghi giá trị gì vào tham số dòng lệnh mà biến môi trờng QUERY_STRING sẽ chứa giá trị đó. I.2 Truyền thông tin qua biến môi trờng Với trờng hợp này, các thông tin về yêu cầu của Web Browser đợc Web Server truyền cho ngữ trình CGI thông qua các biến môi trờng của Server. Phơng thức truy nhập các biến môi trờng của ngữ trình CGI phụ thuộc vào ngôn ngữ viết nên ngữ trình đó. Nếu một biến môi trờng không thích hợp trong ngữ cảnh yêu cầu thì nó sẽ không đợc thiết lập hoặc sẽ đợc đặt giá trị là một chuỗi rỗng. Các biến môi trờng sau đây đợc dùng để chuyển thông tin cho Web Server tới các ngữ trình CGI: QUERY_STRING: Nếu URL có chứa chuỗi yêu cầu, biến này sẽ chứa giá trị của chuỗi yêu cầu đó. www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 45 Ebook Team CONTENT_TYPE: Biến này sẽ đợc xác định trong trờng hợp nếu dữ liệu đợc gắn vào yêu cầu và chuyển qua dòng nhập chuẩn. Nó chỉ ra kiểu MINE của dữ liệu đó. CONTENT_LENGTH: Chứa giá trị độ dài của dữ liệu nếu dữ liệu đợc gắn vào yêu cầu và chuyển qua dòng nhập chuẩn của GateWay. PATH_INFO: Chứa bất kỳ dữ liệu nào đợc thêm vào URL PATH_TRANSLATED: Chứa thông tin đợc đa ra trong biến PATH_INFO nhng đợc thêm vào đầu đờng dẫn tới gốc của Web Server. GATEWAY_INTERFACE: Xác định số hiệu phiên bản của CGI mà Web Server đang sử dụng, dới dạng tên/số hiệu. REMOTE_USER: tên của ngời sử dụng của máy gửi yêu cầu. REMOTE_ADDR: Địa chỉ Internet của máy gửi yêu cầu . REMOTE_HOST: Tên của máy gửi yêu cầu AUTH_TYPE: phơng thức xác thực đợc Server sử dụng . REQUERY_METHOD: Chỉ ra phơng thức yêu cầu. Với các yêu cầu HTTP, các phơng thức yêu cầu có thể là GET, POST, PUT và HEAD. SCRIPT_NAME: Chứa đờng dẫn ảo tới ngữ trình đang đợc thi hành. SERVER_NAME: Tên hoặc địa chỉ IP của Web Server. SERVER_PORT: Số hiệu của cổng nhận đợc yêu cầu . SERVER_PROTOCOL: Tên và số hiệu phiên bản của giao thức yêu cầu SERVER_SOFTWARE: Xác định phần mềm Server đang dùng. Những thông tin trong phần đầu của HTTP cũng có thể đợc Web Server chuyển cho ngữ trình qua những biến có tên bắt đầu bằng HTTP. Một số biến thông thờng là: HTTP_ACCEPT chỉ ra các kiểu MINE, mà Web Browser chấp nhận đợc www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 46 Ebook Team HTTP_USER_AGENT Chuỗi nhận dạng khách hàng. Thông thờng là tên và số hiệu phiên bản của Web Browser. Hầu hết việc truy cập dữ liệu vào của một chơng trình CGI là thông qua các biến môi trờng. I.3 Truyền thông tin qua dòng nhập chuẩn Nếu một yêu cầu đợc tạo bởi phơng thức HTTP POST, dữ liệu từ Web Browser đợc Web Server gửi cho ngữ trình CGI (gateway) qua dòng nhập chuẩn của nó. Các kiểu MINE của dữ liệu và độ dài của dữ liệu đợc chứa trong các biến môi trờng CONTENT_TYPE và CONTENT_LENGTH. II Xử lý các FORM Xử lý các Form là một trong những ứng dụng quan trọng nhất của CGI. Form do HTML tạo ra cho phép ngời sử dụng nhập các thông tin hay dữ liệu. Sau khi nhập các thông tin hay dữ liệu đó đợc gửi tới Server nhằm thức hiện chơng trình (có liên quan đến form) để giải m form đó. Chơng trình xử lý thông tin và sau đó gửi trả lại cho ngời sử dụng. II.1 Truy cập dữ liệu từ Form II.1.1 Các xâu query Một cách để gửi dữ liệu dạng Form tới chơng trình CGI là ghi tiếp các thông tin về form vào địa chỉ URL đạt sau dấu hỏi. Các dạng URL có thể nh sau: http://acernt/cgi/name.c?fortune. Sau dấu chấm hỏi đợc gọi là xâu query (query string). Khi chuyển địa chỉ URL và xâu query tới Server, Server sẽ gọi chơng trình CGI đợc chỉ định ở phần URL trớc dấu hỏi và lu trữ ở phần sau dấu hỏi vào biến môi trờng www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 47 Ebook Team II.1.2 Chơng trình xử lý Form Để thực hiện một chơng trình CGI cần phải bắt đầu từ một trang HTML có chứa một URL chỉ đến ứng dụng CGI đó. Một trang HTML đó có thể viết nh sau: <html> <head> <title>chào bạn</title> </head> <body> <h1>CGI Application Example </h1> <br> <form action="http://sco5:7000/cgi/ktra" method="POST" > Ten ban :<input Name="name_file" type="text"><p> Tuoi ban:<input name="tuoi" type="text"><p> <input type="submit" value="chay,click here!"> </form> </body> </html> Form nhập dữ liệu: www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 48 Ebook Team Trong Form trên ta thấy có hai nút: Chạy, Click here và Nhập lại Nút Chạy, Click here dùng để chuyển những thông tin trong Form tới chơng trình CGI. Sau khi nhập những thông tin cần thiết và chọn Chạy, click here ta sẽ nhận đợc kết quả về những thông tin trạng thái nh độ dài chuỗi yêu cầu, phơng pháp truy nhập, tên máy chủ, giao thức sử dụng . . .do chơng trình CGI cung cấp. Nút Nhập lại dùng để xoá các thông tin đ điền trong Form. Nội dung chơng trình CGI (ktra.c) đợc viết bằng ngôn ngữ C trình bày chi tiết trong phần phụ lục. Kết quả trả lại của chơng trìng CGI trên màn hình Web Browser: www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 49 Ebook Team II.2 Hoạt động của chơng trình CGI II.2.1 Lấy dữ liệu từ Form và xử lý dữ liệu Sau khi ngời dùng nhập dữ liệu vào Form và trình diện lên Server, nếu sử dụng phơng pháp yêu cầu là phơng pháp POST thì Web Server sẽ xác định một số giá trị tơng ứng vào một số biến môi trờng và đa dữ liệu của ngời dùng vào trong dòng vào chuẩn (Standard Input) của chơng trình CGI. Khi đó chơng trình CGI tham khảo các biến môi trờng rồi lấy dữ liệu từ dòng vào chuẩn đó để giải quyết yêu cầu. Còn nếu trình diện yêu cầu bằng phơng pháp GET thì ngoài việc đặt giá trị cho các biến môi trờng thông thờng, Web Server đa dữ liệu nhận đợc từ ngời dùng vào biến môi trờng QUERY_STRING, chơng trình CGI lấy dữ liệu từ đó. www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 50 Ebook Team Cụ thể với chơng trình ktra.c là chơng trình kiểm tra trạng thái Web Server, khi ngời dùng nhập các thông tin tên, tuổi và trình diện lên Web Server, và chơng trình sẽ nhận đợc dữ liệu từ Web Server. Chơng trình gồm có các thủ tục sau: Thủ tục strcvrt có chức năng chuyển đổi kí tự thành dạng xâu. Thủ tục TwoHex2Int chuyển đổi m ESCAPE thành kí tự. Thủ tục urlDecode giải m dữ liệu Thủ tục Main đọc dữ liệu từ Stdin và đa ra dữ liệu dới dạng HTML chuẩn. Trớc tiên chơng trình CGI sẽ tiến hành kiểm tra xem phơng thức yêu cầu của Client là phơng thức nào bằng cách đọc dữ liệu trong biến môi trờng REQUES_METHOD với dòng lệnh: pRequestMethod = getenv("REQUEST_METHOD") ; if (pRequestMethod == NULL || pRequestMethod[0] == '\0') { printf("\nERROR:Request Method error\n") ; goto error ; } if ( strcmp( pRequestMethod, "POST" ) == 0 ) . . . . . Ngoài việc đọc biến môi trờng REQUEST_METHOD, chơng trình CGI còn có thể tham khảo một số biến môi trờng khác nếu nó thấy cần. Ví dụ muốn biết thông tin về phần mềm Server đang sử dụng thì ta đọc dữ liệu từ biến môi trờng SERVER_SOFWARE bằng dòng lệnh: p = getenv("SERVER_SOFTWARE") ; if ( p != NULL && *p != '\0' ) printf(p) ; else printf("&nbsp;") ; Do dữ liệu đợc gửi lên theo phơng theo phơng thức POST nên chơng trình CGI sẽ đọc biến môi trờng CONTENT_LENGTH để biết độ dài dữ liệu rồi tiến hành đọc dữ liệu từ Standard Input và xử lý dữ liệu. www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 51 Ebook Team p = getenv("CONTENT_LENGTH") ; if ( p != NULL && *p != '\0' ) ContentLengh = atoi(p) ; else ContentLength = 0 ; i = 0 ; while ( i < ContentLength ) { x = fgetc(stdin) ; if ( x == EOF ) break ; InputBuffer[i++] = x ; } Sau nhận đợc dữ liệu chơng trình CGI sẽ tiến hành giải m dữ liệu đó (vì một số ký hiệu đặc biệt đ đợc m hoá) bằng thủ tục urlDecode, thủ tục đó đợc viết nh sau: void urlDecode( char *p ) { char *pD = p ; while (*p) { if ( *p == '%' ) { p++ ; if ( isxdigit(p[0]) && isxdigit(p[1]) ) { *pD++ = (char) TwoHex2Int(p) ; p += 2 ; } } else { *pD++ = *p++ ; } } *pD = '\0' ; } II.2.2 Đa kết quả đa ra từ CGI Gateway Kết quả trả về từ ngữ trình CGI (gateway) đợc Server nhận và chuyển nó cho ngời gửi yêu cầu (Web Server). Khi ngời sử dụng gọi URL của một www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 52 Ebook Team chơng trình CGI nào đó và gửi tới Server để tìm file, nếu Server nhận ra địa chỉ đợc yêu cầu là một chơng trình CGI, Server sẽ không trả lại toàn bộ nội dung file mà thay vào đó nó sẽ chạy chơng trình. Các Gateway CGI muốn tạo ra các t liệu thông tin để trả về cho ngời sử dụng phải thông báo cho Web Server về loại thông tin mà nó gửi cho Server dạng nh sau: Content_type: type/subtype Type và Subtype là kiểu MINE cho thông tin mà Gateway cần gửi. Nếu cần gửi một tệp dạng văn bản (ASCII) thì type/submit phải là "text/plain ", còn nếu cần gửi một t liệu HTML thì type/subtype phải là "text/html". Trong chơng trình ktra.c do muốn lấy kết quả trả về dới dạng HTML chuẩn nên gửi thông báo cho Web Server biết dạng thông tin cần trả về cho ngời dùng bằng cách: printf("Content-Type: text/html\n\n") ; Theo dòng lệnh này, Web Server tự động trả lại kết quả thực hiện chơng trình ktra.exe dới dạng HTML chuẩn (xem hàm main() của chơng trình ktra.c ở phụ lục 1). Các Gateway cũng không nhất thiết phải trả về một t liệu mà nó có thể trả về một URL tới một tập tin hay một thông tin khác. Khi đó Web Server sẽ dựa vào URL này để xác định và lấy thông tin hay tệp đó rồi gửi nó cho Web Browser. Để thực hiện đợc công việc này các gateway phải gửi cho Server dòng sau đây: Location: URL address II.2.3 Thông tin kết quả từ chơng trình CGI: Nh ta đ biết ở phần trên, khi chạy một chơng trình CGI, Server thay vì đa ra văn bản tĩnh sẽ đa ra kết quả của chơng trình. Tuy nhiên, vấn đề www.updatesofts.com --------------------------------------------------------------------------------------------- Trang 53 Ebook Team là ở chỗ chơng trình CGI phải làm sao tạo thông tin ra để phù hợp nhất với Browser. Thông tin thông thờng nhất do một chơng trình CGI tạo ra là một văn bản đơn giản ở dạng plain text hay HTML để cho Browser hiển thị nh đối với các văn bản khác trên Web. Tuy nhiên CGI còn có khả năng cung cấp các tiện ích nh sau: Trả lại đồ hoạ hay các dữ liệu nhị phân khác Chỉ cho Browser biết có cất văn bản hay không Gửi các m trạng thái HTTP đặc biệt tới Browser Chỉ cho Server gửi một văn bản có sẵn Các kỹ thuật trên đòi hỏi cần phải biết thêm đôi chút về các Header của chơng trình CGI. II.2.4 Các Header CGI Header thờng thấy nhất là Content-type, là HTTP header chứa kiểu nội dung MINE mô tả dữ liệu. Ngoài ra các header khác còn có thể mô tả: Kích thớc dữ liệu Các văn bản khác mà Server phải trả về Các m trạng thái HTTP Sau đây là một số header thông thờng: 1. Header Content-length: mô tả độ dài (theo bytes) luồng dữ liệu ra. Sử dụng dữ liệu nhị phân. 2. Header Expires: Mô tả ngày giờ của của các văn bản không còn giá trị và Browser cần tải lại (reload) 3. Header Location: Định hớng lại cho Server. 4. Header Pragma: Chỉ định có cất văn bản đi hay không 5. Header Status: Trạng thái của yêu cầu. [...]...www.updatesofts.com Dới đây sẽ tìm hiểu sâu một chút về c c header trên: + Accept types v Content Types C c chơng trình CGI c thể trả lại gần nh bất c dạng văn bản n o m Client c thể xử lý đ c: ví dụ nh file text, file HTML hay c thể c Postscript, PDF, SGML v.v .Do vậy Client sẽ chuyển danh sách c c kiểu file nó chấp nhận tới Server khi Server yêu c u Server... trờng HTTP_ACCEPT v chơng trình CGI c thể kiểm tra biến n y để bảo đảm rằng đ trả về một file c dạng m Browser c thể xử lý đ c Khi trả về một t i liệu, chơng trình CGI c ng c n phải sử dụng Header Content- type để chỉ cho Client biết nó đang gửi loại dữ liệu n o, nh vậy Browser c thể định dạng v hiển thị văn bản một c ch chuẩn x c + Header content-length Header n y chỉ định kích th c dữ liệu định... do CGI tạo ra thông thờng nó sẽ c t văn bản đó C c lần sau khi truy c p văn bản đó thì Client sẽ không yêu c u Server m sử dụng luôn văn bản đ c t do vậy thông tin cung c p cho ngời sử dụng c thể không chính x c nữa ví dụ ng y tháng- c trong văn bản lại l c a lần truy nhập tr c v do đó sẽ không c n giá trị Để hạn chế nh c điểm đó ngời ta sử dụng c c Header Exprires v Pragma để cho Client không c t... đi + C c m trạng thái Giao th c HTTP sử dụng c c m trạng thái để liên l c với trạng thái c a c c yêu c u chẳng hạn nếu văn bản c n truy c p không tồn tại thì sẽ trả về m trạng thái "404" tới Browser v nếu văn bản đ bị rời đi nơi kh c thì trả về m "301" Header Status chỉ c c m trạng thái gồm c 3 số, tiếp theo l xâu chỉ nọi dung m trạng thái đó, ví dụ: M 200: Truy c p th nh c ng M 204: Không c tín... đ bị chuyển M 401: Không đ c quyền truy c p M 404: Không tìm thấy M 500: Lỗi bên trong Server M 501: Không sử dụng (not implemented) Ebook Team Trang 55 www.updatesofts.com - chơng iii oracle WebServer và xây dựng chơng trình CGI truy nhập CSDL oracle a oracle WebServer I Kiến tr c của Oracle Web Server Oracle WebServer bao gồm c c th nh phần chính... th c hiện một thao t c n o đó Ví dụ nh sau khi họ đ điền v o một Form bạn muốn hiển thị một v i dòng c m ơn Về nguyên t c chơng trình CGI sau mỗi lần gọi c thể tạo v hiển thị Message đó, nhng hiệu quả hơn vẫn l gửi c c câu lệnh cho Server để định hớng lại v lấy một file c chứa Message c m ơn đó Để định hớng lại Server, ngời ta sử dụng Header Location để chỉ cho Server biết c n phải chuyển những gì v... đó + C c header Expires v Pragma Ebook Team Trang 54 www.updatesofts.com Hầu hết c c Browser sẽ c t trong cache văn bản m truy nhập nhằm tiết kiệm t i nguyên vì mỗi lần tìm văn bản đó Browser sẽ không lấy lại văn bản đó nữa Tuy vậy, đối với c c văn bản ảo do chơng trình CGI tạo ra thì đây sẽ l một điều phiền ph c vì khi Browser truy nhập v o một chơng trình. .. Broker + Sercure Socket Layer + Web Server Manager + CGI Interface + PL/SQL Agent I.1 Web Listener L một giao th c mạnh trong vi c giải quyết yêu c u v đa ra t i liệu siêu phơng tiện gửi tới Web Browser Nó hỗ trợ tất c những chuẩn ch c năng Web Server nh: + Hệ thống file ảo + Domain Name Services + Hỗ trợ về Sơ đồ ảnh + Hỗ trợ về CGI + Giao th c kết nối an to n + Bảo vệ file v phân quyền cho user Ebook... y cho phép tránh đ c c c lỗi dữ liệu từ Server khi đang xử lý dữ liệu nhị phân bởi Server sẽ biết đ c số byte từ luồng dữ liệu + Sử dụng Header Location để định hớng lại Server Chơng trình CGI c thể lệnh cho Server lấy một văn bản đ c sẵn v hiển thị văn bản đó quá trình n y gọi l định hớng lại Server Lý do để ngời ta sử dụng kĩ thuật n y l nhằm trả lại một văn bản tính sau khi ngời sử dụng đ thực . một chút về c c header trên: + Accept types và Content Types C c chơng trình CGI c thể trả lại gần nh bất c dạng văn bản nào mà Client c thể xử lý đ c: . HTML để cho Browser hiển thị nh đối với c c văn bản kh c trên Web. Tuy nhiên CGI c n c khả năng cung c p c c tiện ích nh sau: Trả lại đồ hoạ hay c c dữ

Ngày đăng: 06/10/2013, 21:26

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan