otarza / serv-cst

CST web III porject
6 stars 0 forks source link

MIME Type Detection #10

Closed ioseb closed 11 years ago

ioseb commented 11 years ago

დემურ,

ძალიან კარგია რომ კვლევა ჩაატარე. URLConnection ყველაზე გამართული და მისაღებია ჩვენი ამოცანისთვის. ჩემი დასკვნა ასეთია:

პირველ ეტაპზე აბსოლუტურად საკმარისი იქნება თუ ამ ტიპების ამოცნობის ავტომატიზაციას მივაღწევთ არსებული საშუალებებით(ანუ URLConnection).

სხვა ნებისმიერი შემთხვევისთვის(ანუ როდესაც ვართ unknown მდგომარეობაში) კონტენტის ტიპი უნდა იყოს:

დამატებით გასარჩევი გექნებათ როგორ მუშაობს "Content-Disposition" (http://tools.ietf.org/html/rfc6266#section-4) HTTP სათაური. ამ შემთხვევაში შესაძლებელია "attachment" ატრიბუტის გამოყენება რაც ბრაუზერს უბიძგებს რომ მომხმარებელს შესთავაზოს ფაილის გადმოწერა ბრაუზერში გახსნის გარეშე.

demonno commented 11 years ago

@ioseb რაშემთხვევაში დაგვჭირდება :question:

ფაილზე რა ინფორმაცია მექნება , ფაილურ სისტემაში მისამართი თუ მსგავსი URL cst.ge/day3.pdf

ფაილამდე როგორ მივაღწევ რო ამოცნობა ვცადო ვერ ვხვდები

ioseb commented 11 years ago

@demonno

ძალიან ბევრ რამეში დაგვჭირდება. როდესაც @revazi დაასრულებს #8 დავალებას საინტერესო სურათი გვექნება. ვთქვათ შემოვიდა მოთხოვნა:

GET /images/logo.png HTTP/1.1
Host: service.org

თუ მოთხოვნის გაანალიზება წარმატებით გაივლის გვექნება HttpRequestLine ობიექტი რომელსაც გააჩნია getPath() მეთოდი რომელზე დაყრდნობითაც შეგვიძლია დავწეროთ ასეთი კოდი:

ServerConfig config = ServerConfig.getInstance();
String requestPath = request.getPath();
String filePath = config.getDocumentRoot() + "/" + requestPath;
File file = new File(filePath);

if (file.exists()) {
   if (file.isFile()) {
      // აქ ვხსნით ფაილს URL კლასით შენ როგორც გააკეთე
      // ვადგენთ შესაძლო MIME ტიპს
      // თუ დავადგინეთ 
      // response.setHeader("Content-Type", [დადგენილი MIME ტიპი]
      // response.setHeader("Content-Length", file.length());
      // response.write(urlConnection.getInputStream());
   } else if (file.isDirectory() && config.listDirectoryContents()) {
      // წავკითხოთ ყველა ფაილის სახელი დირექტორიაში, დავაგენერიროთ HTML
      // და დავაბრუნოთ response ობიექტის მეშვეობით
   }
} else {
   // ფაილი ვერ მოიძებნა
   // დავადგინოთ გვაქვს თუ არა ამ path - ისთვის რეგისტრირებული სკრიპტი
   // თუ გვაქვს მაშინ შევასრულოთ სკრიპტი და რეზულტატი დავაბრუნოთ როგორც text/html
   // თუ არ გვაქვს არც სკრიპტი მაშინ:
   // response.error(HttpStatus.Code.NOT_FOUND);
}
demonno commented 11 years ago

@ioseb სანამ დავიწყებ getDocumentRoot() ხო არ ჩავამატო properties ფაილში და ServerConfig კლასში ? თუ რეზოს დაველოდო ..

ioseb commented 11 years ago

@demonno

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

ioseb commented 11 years ago

@demonno

მაგალითად წარმოიდგინე რომ გაქვს ფაილი test/resources/filetypes/image.png და გინდა გადასცე ამ ფაილის მისამართი შენს მაიმ ტიპების იდენტიფიკატორ კლასს. შეგიძლია გააკეთო ასეთი რამე:

class MimeTypeDetectorTest {
    @Test
    public void testMimeTypeIsImagePNG() {
        String path = MimeTypeDetectorTest.class.getResource("/filetypes/image.png").getPath();
        String mimeType = MimeTypeDetector.detectMimeType(path);
        Assert.assertEquals("image/png", mimeType);
    }
}

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

კიდევ რაღაც დეტალები მიტრიალებს თავში მაგრამ ბოლომდე ვერ ვიაზრებ ახლა.

ioseb commented 11 years ago

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

demonno commented 11 years ago

@ioseb კარგი, საწყის იმპლემენტციას გავაკეთებ მხოლოდ.

ioseb commented 11 years ago

კარგი იქნება, მეც უფრო შენც უფრო მეტი ორიენტირი გაგიჩნდება და მეც.

On Friday, March 1, 2013 at 2:48 AM, Demur Nodia wrote:

@ioseb (https://github.com/ioseb) კარგი, საწყის იმპლემენტციას გავაკეთებ მხოლოდ.

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

demonno commented 11 years ago

@ioseb ცოტა უცნაურად გავაკეთე მარა სხვანაირად ვერ მოვიფიქრე ჯერ .

public class MimeTypeDetector {

    public static String detectedMimeType;

    private  MimeTypeDetector(String type){
               this.detectedMimeType = type;
    }
     public static MimeTypeDetector detectMimeType(String filePath) throws IOException {
        File file = new File(filePath);
        String mime = "";
        if(file.exists()){
            if(file.isFile()){
                URL url = new URL("file", "", file.getPath());
                URLConnection conn = url.openConnection();
                mime = conn.getContentType();

                // response.setHeader("Content-Type", [დადგენილი MIME ტიპი]
                // response.setHeader("Content-Length", file.length());
                // response.write(urlConnection.getInputStream());
            } else if( file.isDirectory()){
                // წავკითხოთ ყველა ფაილის სახელი დირექტორიაში, დავაგენერიროთ HTML
                // და დავაბრუნოთ response ობიექტის მეშვეობით
            }
        }
        return new MimeTypeDetector(mime);
    }

    public static String getDetectedMimeType() {
        return detectedMimeType;
    }
}

ტესტი (წარმატებით მუშაობს)

 @Test
    public void testMimeTypeIsImagePNG() throws IOException {
        String path = MimeTypeDetectorTest.class.getResource("/filetypes/img.png").getPath();
        String mimeType = String.valueOf(MimeTypeDetector.detectMimeType(path).getDetectedMimeType());
        Assert.assertEquals("image/png", mimeType);
    }
ioseb commented 11 years ago

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

შენ რაც გააკეთე სწორია, თუმცა არქიტექტურულად უნდა გამართვა. რამდენიმე ვარიანტი გვაქვს და უფრო დეტალურად დღეს მოგვიანებით დავწერ. მთავარია რომ მიდგომა თავსითავად სწორია.

P.S. ტესტებს რომ წერთ და არ გეზარებათ უკვე კარგის ნიშანია B-)

demonno commented 11 years ago

@ioseb ხვალე ქორწილში ვარ ქორწინების მოწმე :laughing: ცოტა ტემპის დაგდება მომიწევს სამწუხაროდ , მაგრამ ავანაზღაურებ შემდეგ დღე-ღამეებში :hand:

ioseb commented 11 years ago

@demonno ეგ არაფერი, დრო გაატარე! ჯერ საქმე გვაქვს ის ჯეელები გვაფერხებენ რაღაც იმათ დავმწყემსავ მანამდე :P

ioseb commented 11 years ago

@demonno ხაზზე ხარ?

demonno commented 11 years ago

@ioseb კი

ioseb commented 11 years ago

მოკლედ ვიფიქრე MIME ტიპების თემაზე, და გარკვეული არქიტექტურული მიდგომა ჩამოვაყალიებ. განწყობა თუ გაქვს დიალოგისთვის გავაკეთებ თიქეთს და განვავრცოთ. @revazi @reflooding @vaxop

demonno commented 11 years ago

@ioseb მზადვარ :D

demonno commented 11 years ago

@ioseb ამ დავალებას მივუბრუნდი ისევ , მხარდაჭერილი mime type ების enum კლასი გვჭირდება როგორც ჩანს

mime = "application/octet-stream";

if(mime.equals("content/unknown")){

ესე რო არ ვწერო მეთოდებზე და ჰედერებზე როგორც არის ისე რო გავაკეთოთ ?
დამიდასტურე და შენს ინსტრუქციას მივყვები

  • გააკეთე ტესკი და მიინიჭე
  • გააკეთე იმპლემენტაცია
  • დაუწერე ტესტები
  • რომ დაამთავრებ ჩემზე მოამაგრე ტესკი რევიუ რომ გავაკეთო
demonno commented 11 years ago

კიდევ გადავხედე #20 დავალებას და მგონი ამ კლასის ერთადერთი მთავარი დნიშნულება უნდა იყოს : ფაილის mime type ის დადგენა და დაბრუნება

ამჟამინდელი იმპლემენტაცია @ioseb თუ რამე შენიშვნა გაქვს მომწერე

public static String detectMimeType(String filePath) throws IOException, HttpRequestException {
        File file = new File(filePath);
        String mime = "";
        if(file.exists()){
            if(file.isFile()){
                URL url = new URL("file", "", file.getPath());
                URLConnection conn = url.openConnection();
                mime = conn.getContentType();

                if(mime.equals("content/unknown")){
                    mime = "application/octet-stream";
                }
            } else if( file.isDirectory()){
                throw new HttpRequestException(HttpStatus.Code.NOT_FOUND,"File not Found, Directory Located!");
            }//დირექტორიაზე ალბათ აღარ იქნება საჭირო შემოწმება Request Handling ში ც მოხდება ეგ
        } else {
            throw new HttpRequestException(HttpStatus.Code.NOT_FOUND,"File Not Found!");
    }
        return mime;
    }

ტესტები :

   @Test
    public void testMimeTypeIsImagePNG() throws IOException, HttpRequestException {
        String path = MimeTypeDetectorTest.class.getResource("/filetypes/img.png").getPath();
        String mimeType = MimeTypeDetector.detectMimeType(path);
        Assert.assertEquals("image/png", mimeType);
    }

    @Test
    public void testUnknownMimeType() throws IOException, HttpRequestException {
        String path = MimeTypeDetectorTest.class.getResource("/filetypes/bb.brb").getPath();
        String mimeType = MimeTypeDetector.detectMimeType(path);
        Assert.assertEquals("application/octet-stream", mimeType);
    }
demonno commented 11 years ago

ოპააა

  • text/javascript
  • text/css

ამ ტიპის ფაილებზე URLConnection getContentType() content/unknown ს აბრუნებს

პ.ს. :file_folder: ვინდოუსის ფროფერთისებში რომ ვნახულობ ნამდვილად js და css ფაილებს ვაძლევ შესამოწმებლად

ioseb commented 11 years ago

დემურ, უცნაურია. ჩემთან ახდენს იდენტიფიცირებას. ვნახავ დეტალურად.

Sent from my iPhone

On Mar 9, 2013, at 5:08 PM, Demur Nodia notifications@github.com wrote:

ოპააა

text/javascript text/css ამ ტიპის ფაილებზე URLConnection getContentType() content/unknown ს აბრუნებს

პ.ს. ვინდოუსის ფროფერთისებში რომ ვნახულობ ნამდვილად js და css ფაილებს ვაძლევ შესამოწმებლად

— Reply to this email directly or view it on GitHub.