otarza / serv-cst

CST web III porject
6 stars 0 forks source link

Request Handling Design #20

Closed ioseb closed 11 years ago

ioseb commented 11 years ago

მოკლედ ახალგაზრდებო ბევრი ვიფიქრე თუ ცოტა სხვადასხვა ტიპის მოთხოვნათა მომსახურებისთვის მოვიფიქრე გარკვეული დიზაინი რომელსაც გაგანდობთ.

პირველ რიგში თუ რისი მომსახურება მოგვიწევს:

ამ ეტაპისთვის მნიშვნელოვანია ერთგვაროვანი მიდგომის მიღწევა. და გასათვალისწინებელია შემდეგი რამ:

მომსახურე რეალიზაციის დადგენის მიმდევრობა ასეთია:

საჭიროების შემთხვევაში ვამატებთ სხვა ჰენდლერებსაც. პირველ რიგში აუცილებელია დავადგინოთ თუ როგორ უნდა იყოს მოწყობილი. გარკვეული კვლევის და ექსპერიმენტების შემდეგ დავადგინე სასრული რაოდენობის ზიარი დეტალები და გთავაზობთ ინტერფეისს რომლის რეალიზაციაც უნდა გააკეთოს ცალკეულმა ჰენდლერმა:

package edu.cst.webserver.http;

import java.io.IOException;
import java.io.InputStream;

public interface HttpRequestHandler<T> {
    /**
     * @return resource InputStream
     * @throws IOException
     */
    public InputStream getInputStream() throws IOException;

    /**
     * @return MIME type
     */
    public String getContentType();

    /**
     * @return length of the file content or string
     */
    public int getContentLength();

    /**
     * @return formatted date format as defined by RFC 1123:
     * "EEE, dd MMM yyyy HH:mm:ss 'GMT'"
     */
    public String getLastModified();

    /**
     * Handler Implementation
     *
     * @param handle
     * @param request
     * @param response
     */
    public void process(T handle, HttpRequest request, HttpResponse response) 
            throws HttpRequestException;
}
ioseb commented 11 years ago

@demonno @revazi @reflooding @vaxop ეს არის საწყისი მონახაზი განხილვისთვის.

ioseb commented 11 years ago

ზემოთ ნაჩვენები ინტერფეისის ერთერთი კონკრეტული რეალიზაციის ნიმუში:

String path = "/path/to/resource";
File file = new File(path);

if (file.isFile()) {
    HttpRequestHandler<File> handler = new HttpRequestFileHandler<File>();
    try {
        handler.process(file, request, response);
    } catch (HttpRequestException e) {
        // do something here
    }
}
demonno commented 11 years ago

MimeTypeDetector.java ამ კლასში ხომ ხდება იმის დადგენა path არის თუ არა ფაილი , დირექტორია თუ სკრიპტი , ა.შ. ....

დადგენის შემდეგ ვიქცევი შესაბამისად და ვქმნი შესაბამისი ჰენდლერის ობიექტს(ინტერფეისის ტიპის), როგორც ბოლო კომენტარში დაწერე ..

ყველა ჰენდლერს აქვს საერთო ინტერფეისი ...

ioseb commented 11 years ago

@demonno მანდ არ უნდა მოხდეს ეგ ანუ MimeTypeDetector - ში. სხვა უნდა იყოს დისპეჩერი. და MimeTypeDetector - ში რაც გაქვს ახლა ანუ MIME ტიპის დადგენა მთლიანად გადაინაცვლებს ერთ კონკრეტულ HttpRequestFileHandler - კლასში. ჯერ ბოლომდე არ ვარ ჩამოყალიბებული ნიუანსებში მაგრამ სავარაუდოდ ამ გზით წავალთ. უკეთესი იდეები ცხადია მისაღებია.

demonno commented 11 years ago

MIME ტიპის დადგენა ანუ ეს ნაწილი გადაინაცვლებს ჰენდლერ კლასში

URL url = new URL("file", "", file.getPath());
URLConnection conn = url.openConnection();
mime = conn.getContentType();

MimeTypeDetector.java ამ კლასს მაშინ სახელი გადავუკეთოთ და დავაკისროთ დისპეჩერის ფუნქცია ?

ioseb commented 11 years ago

@demmno არ გინდა ჯერ, არ არის ამ მომენტში დისპეჩერის აუცილებლობა მოდი ასე შევთანხმდეთ, მე კიდევ ვიფიქრებ ცოტას რომ უფრო გავაუმჯობესოთ დიზაინი მანამდე სააზროვნოდ კი არის მგონი საკმარისი ეს. ვეცდები რომ რაც შეიძლება მალე დავიწყოთ უკვე ჰენდლერების რეალიზაცია.

On Tuesday, March 5, 2013 at 1:53 AM, Demur Nodia wrote:

MIME ტიპის დადგენა ანუ ეს ნაწილი გადაინაცვლებს ჰენდლერ კლასში
URL url = new URL("file", "", file.getPath()); URLConnection conn = url.openConnection(); mime = conn.getContentType();

MimeTypeDetector.java (https://github.com/reflooding/serv-cst/blob/master/src/main/java/edu/cst/webserver/env/MimeTypeDetector.java) ამ კლასს მაშინ სახელი გადავუკეთოთ და დავაკისროთ დისპეჩერის ფუნქცია ?

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/20#issuecomment-14408256).

ioseb commented 11 years ago
String path = "C:/path/to/folder/resource/1";

File f = new File(path);

if (f.exists() && f.canRead()) {
    if (f.isDirectory()) {
        // vaxos klasi
    } else if (f.isFile()) {
        if (isExecutable(f)) {
            // aq server side javascript
        } else {
            String mimeType = // demuris klasi romelic gveubneba mime tips
        }
    }                  
}
demonno commented 11 years ago
  1. ვადგენთ არსებობს თუ არა ფაილი ფიზიკურად
    • თუ არ არსებობს response NOT_FOUND
    • თუ არსებობს Go To 2
  2. თუ არის ფაილი და არის წაკიტხვადი
    • ვადგენთ MimeType
    • თუ დავადგინეთ response set 200_OK და response set MimeType
    • ვტვირთავთ new HttpRequestFileHandler(file, request, response);
  3. თუ ვერ დავადგინეთ "MimeType" Go To 4
  4. თუ დირექტორიაა დაisDirListingAllowed == true
    • response set 200_OK და response set MimeType.TEXT_HTML
    • ვტვირთავთ new HttpRequestDirectoryHandler(file, request, response);
  5. პასუხს ვაბრუნებთ როგორც ფაილ attachments

p.s. Content Length იწერება ჰენდლერ კლასებში #34 #16 მაგალითი : response.setHeader(HttpHeader.CONTENT_LENGTH,String.valueOf(size));

ioseb commented 11 years ago

@demonno ვხურავ ამას, უკვე ჩამოვყალიბდით რაც საჭირო იყო იმ საკითხებზე.