otarza / serv-cst

CST web III porject
6 stars 0 forks source link

HttpResponse და HttpResponseWrapper კლასები #15

Closed ioseb closed 11 years ago

ioseb commented 11 years ago

HttpResponseWrapper კლასის იმპლემენტაცია შემდეგ ინტერფეისზე დაყრდნობით:

package edu.cst.webserver.http;

import java.io.IOException;

public interface HttpResponse {
    /**
     * Sets response header with a givean name and value
     * @param name
     * @param value
     */
    public void setHeader(String name, String value);

    /**
     * Sets status code for the response
     * @param status
     */
    public void setStatus(HttpStatus.Code status);

    /**
     * Sends a temporary redirect response with 307 HTTP status code
     * @param location
     */
    public void redirect(String location);

    /**
     * Sends redirect response with specified redirect status code
     * @param location
     * @param redirectStatus
     */
    public void redirect(String location, HttpStatus.Code redirectStatus);

    /**
     * Sends error response with specified error code
     * @param errorStatus
     */
    public void error(HttpStatus.Code errorStatus);

    /**
     * * Sends error response with specified error code and specific body
     * @param errorStatus
     * @param body
     */
    public void error(HttpStatus.Code errorStatus, String body);

    /**
     * Writes passed content to underlying OutputStream
     * @param content
     */
    public void write(String content) throws IOException;

    /**
     * Immediately flushes underlying OutputStream
     */
    public void flush() throws IOException;
}
demonno commented 11 years ago

HttpResponse შედგება

მაგალითები :

HTTP/1.1 200 OK
Content-Type: text/plain

Hello World
HTTP/1.1 302 Found
Location: http://www.iana.org/domains/example/
 HTTP/1.1 200 OK
 Date: Mon, 23 May 2005 22:38:34 GMT
 Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
 Etag: "3f80f-1b6-3e1cb03b"
 Accept-Ranges:  none
 Content-Length: 438
 Connection: close
 Content-Type: text/html; charset=UTF-8

კითხვები :

  1. იმპლემენტაციის კლასში უნდა მოწმდებოდეს რომ მიღებული პარამეტრები ვალიდურია და მხარდაჭერილია სერვერის მიერ
  2. იმპლემენტაციის კლასს უნდა შეეძლოს სტრიქონის დაბრუნება რომელსაც ექნება ზემოთ აღწერილი ფორმატი ?

@ioseb ტესტების დაწერას ვცდილობ მარა არ გამომდის რაღაც არ მესმის ბოლომდე როგორ უნდა გაკეტდეს

ioseb commented 11 years ago

შეგიძლია ტესტები გაგვიზიარო? რის მიღწევას ცდილობ ზუსტად?

Sent from my iPhone

On Mar 6, 2013, at 11:12 PM, Demur Nodia notifications@github.com wrote:

HttpResponse შედგება

სტატუსის სტრიქონისგან სტრიქონის სტრუქტურა : [HTTP ვერსია] [კოდი] 1 ან რამდენიმე ჰედერისგან ცარიელი ხაზისგან საჭიროების შემთხვვევაში მესიჯ ბოდისგან მაგალითები :

HTTP/1.1 200 OK Content-Type: text/plain

Hello World HTTP/1.1 302 Found Location: http://www.iana.org/domains/example/ HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Etag: "3f80f-1b6-3e1cb03b" Accept-Ranges: none Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8 კითხვები :

იმპლემენტაციის კლასში უნდა მოწმდებოდეს რომ მიღებული პარამეტრები ვალიდურია და მხარდაჭერილია სერვერის მიერ იმპლემენტაციის კლასს უნდა შეეძლოს სტრიქონის დაბრუნება რომელსაც ექნება ზემოთ აღწერილი ფორმატი ? @ioseb ტესტების დაწერას ვცდილობ მარა არ გამომდის რაღაც არ მესმის ბოლომდე როგორ უნდა გაკეტდეს

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

ioseb commented 11 years ago

@demonno

იმპლემენტაციის კლასში უნდა მოწმდებოდეს რომ მიღებული პარამეტრები ვალიდურია და მხარდაჭერილია სერვერის მიერ

რომელ პარამეტრებზე ლაპარაკობ? თუ თავსართის სახელებზე ლაპარაკობ მაშინ მაგაზე ერთადერთი შეზღუდვა შეიძლება დაწესდეს - დასაშვები სიმბოლოები. უშუალოდ სახელი რომ აიღო ნებისმიერი ახალი ჰიდერი რომ მოიგონო სიტყვაზე: X-Demur-Nodia ესეც კი დასაშვებია.

იმპლემენტაციის კლასს უნდა შეეძლოს სტრიქონის დაბრუნება რომელსაც ექნება ზემოთ აღწერილი ფორმატი ?

იმპლემენტაციის კლასმა რომ დააბრუნოს ეგ სტრიქონი რისთვის გამოვიყენებთ? ეგ ობიექტი ესაჭიროება იმას ვინც შექმნა ეგ ობიექტი(დისპეჩერი ჩვენს შემთხვევაში), რომ შემდეგ მოთხოვნა/პასუხის ციკლის დასრულების შემდეგ გამოაძროს ეგ ინფორმაცია და დააგენერიროს(ან სხვას, გენერატორს დააგენერირებინოს) ეგ სტრიქონი.

demonno commented 11 years ago

@ioseb ინფორმაციის გამოძრობა გეთერებით მოხდება.

სტატუს კოდი 1 ზე მეტი ხო ვერ იქნება ერთ რესფონსში ?

setStatus(HttpStatus.Code.OK);
error(HttpStatus.Code.NOT_FOUND);

ესეთი რამე რო ცადოს ვინმემ მე რავქნა ექსეფშენი ვისროლო? სხვანაირად როგორ გავაგებინო რო არ შეიძლება

ioseb commented 11 years ago

@demonno

error(...) მეთოდის გამოძახების შემთხვევაში მომენტალურად უნდა მოხდეს პასუხის დამუშავების შეწყვეტა და კლიენტისთვის შესაბამისი HTTP პასუხის დაბრუნება. აქ იგულისხმება HttpResponse ობიექტის მიმდინარე მდგომარეობის სრული იგნორირება, ანუ რადგან შეცდომაა უბრალოდ ვაბრუნებთ სიტყვაზე:

HTTP/1.1 400 Bad Request
Content-Type: text/plain
Content-Length: ...

Something wrong happened!

ცხადია სტატუსის კოდი და შეტყობინება შეცდომის კოდიდან გამომდინარეა.

demonno commented 11 years ago

@ioseb

უნდა მოხდეს პასუხის დამუშავების მომენტალური შეწყვეტა

როგორ გავაკეთო ეგ ?

HttpResponseWrapper ს მხოლოდ ინფორმაციის მატარებელია რომელსაც შემდეგ დისპეჩერი გამოიყენებს და დააბრუნებს ან დააბრუნებინებს ვინმეს კლიენტთან http პასუხს (error)ს

ესე მოხდებოდა მეგონა

ioseb commented 11 years ago

@demonno რამდენიმე ვარიანტია

ან შეიძლება მეორე გზით წავიდეთ:

ioseb commented 11 years ago

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

interface HttpResponseErrorHandler {
    public void handle(HttpStatus.Code statusCode, HttpResponse response);
}

public class HttpResponseWrapper {
    private HttpResponseErrorHandler errorHandler;

    public void setErrorHandler(HttpResponseErrorHandler errorHandler) {
        this.errorHandler = errorHandler;
    }

    public void error(HttpStatus.Code statusCode) {
        errorHandler.handle(HttpStatus.Code statusCode, this);
    }
}

P.S. მიხარია ლოგიკური შეკითხვები რომ გებადება!!

ioseb commented 11 years ago

მაგალითად ამ მეორე მიდგმოით უამრავ რამეს მივაღწევთ:

რას იტყვი?

ioseb commented 11 years ago

და ამ თემის მცირე განვრცობა:

public class HttpRequestDispatcher implements HttpResponseErrorHandler {
    @Override
    public void handle(Code statusCode, HttpResponse response) {
        // do some actual redirecting code here
    }

    public void dispatch() {
        HttpResponseWrapper response = new HttpResponseWrapper();
        response.setErrorHandler(this);
    }
}

thoughts?

demonno commented 11 years ago

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

ioseb commented 11 years ago

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

revazi commented 11 years ago

@ioseb ანუ მე როგორც გავიგე HttpResponseWrapper კლასს ეყოლება ორი დამხმარე Dispatcher და Error Handler interface სადაც HttpResponseWrapper აკეთებს ყველა იმ მეთოდის იმპლემენტაციას რომელიც HttpResponse ინტერფეისშია აღწერილი. error მეთოდის შესასრულებლად ვიყენებთ interface HttpResponseErrorHandler { public void handle(HttpStatus.Code statusCode, HttpResponse response); } რომლის handle მეთოდსაც override - ს უკეთებს HttpRequestDispatcher რომელიც თავის მხრივ dispatch - მეთოდით ქმნის HttpResponseWrapperტიპის ობიექტს და ამავე კლასის response.setErrorHandler(this); მეთოდის გამოყენებით აბრუნებს დამუშავებულ შეცდომას.

სწორად გავიგე? :yum:

კითხვა: public void error(HttpStatus.Code errorStatus, String body); ამ მეთოდისთვის იგივე სვლები უნდა გავაკეთოთ :question: (იმედია მნიშვნელოვანი არ გამომრჩა რამე)

ioseb commented 11 years ago

@revazi

კითხვა: public void error(HttpStatus.Code errorStatus, String body); ამ მეთოდისთვის იგივე სვლები უნდა გავაკეთოთ (იმედია მნიშვნელოვანი არ გამომრჩა რამე)

აბსოლუტურად

ioseb commented 11 years ago

@demonno არის რამე პროგრესი?

demonno commented 11 years ago

@ioseb error handlerები გავაკეთე , და HTTP პასუხებიც უნდა გავამზადო ამ თასქის ფარგლებში ?

ioseb commented 11 years ago

@demonno თუ ამ კლასებს HttpResponse და HttpResponseWrapper თუ გულისხმობ, კი უნდა გააკეთო.

demonno commented 11 years ago

@ioseb

HTTP პასუხების გამზადებაში ვგულისხმობ ამ სტრიქონების გამზადებას..

HTTP/1.1 400 Bad Request
Content-Type: text/plain
Content-Length: ...

Something wrong happened!

როგორც ზემოთ კომენტარში მომწერე ეს დავალება შეიძლება დაეკისროს დისპაჩერს

დააგენერიროს(ან სხვას, გენერატორს დააგენერირებინოს) ეგ სტრიქონი.

HttpResponseWrapper გაამზადებს

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

ioseb commented 11 years ago

@demonno საწყისი იმპლემენტაცია არ იქნება ურიგო!

demonno commented 11 years ago

აა პანიკაშივარ :boom:

წავედი ლექციაზე

ioseb commented 11 years ago

@demonno პანიკაში რის გამო ხარ?

demonno commented 11 years ago

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

ioseb commented 11 years ago

ველოდებით!

demonno commented 11 years ago

@ioseb ვითხოვ ნებართვას HttpResponse ინტერფეისში შემდეგი მეთოდების ჩამატებაზე

public HttpStatus.Code getStatusCode();
public Map<String, String> getHeaders();
public String getMessageBody();
demonno commented 11 years ago

აღარ მინდა ბოდიში ...

ioseb commented 11 years ago

ოკ :D

On Friday, March 8, 2013 at 11:39 PM, Demur Nodia wrote:

აღარ მინდა ბოდიში ...

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

ioseb commented 11 years ago

@demonno არ არის პრობლემა თუ ჩამატებაა საჭირო უნდა ჩაამატო.

demonno commented 11 years ago

კაი ვამატებ :D

demonno commented 11 years ago

@ioseb

write(String content); 

ზე გადავედი,

LinkedList რო გავაკეთო და ჩავამატო ყოველ გამოძახებაზე ?

აქ იდეაში html ი შეიძლება გადაეცეს რომელსაც მერე ბრაუზერი წაიკითხავს და ჩატვირთავს ..

ioseb commented 11 years ago

@demonno და StringBuilder რომ გააკეთო არა? http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html და კერძოდ ეს მეთოდი:

http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#append(java.lang.CharSequence)

Java - ში String ტიპი ასევე არის CharSequence რადგან მისი მემკვიდრეა.

demonno commented 11 years ago

კი როგორარა :)

fush(); ზე რა უნდა გავაკეთო ,

ფაილი ხო არ მაქ სადმე და ამ ფაილში ხო არ ვწერ ....

ioseb commented 11 years ago

ჯერ არაფერი არ გააკეთო flush() - ზე. სერვერის ნაწილს რომ გავაკეთებთ მაგას სოკეტიდან OutputStream - ს გადავცემთ გარედან და იმაში ჩაიწერება.

On Saturday, March 9, 2013 at 1:15 AM, Demur Nodia wrote:

კი როგორარა :) fush(); ზე რა უნდა გავაკეთო , ფაილი ხო არ მაქ სადმე და ამ ფაილში ხო არ ვწერ ....

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

demonno commented 11 years ago

ოკ , ტესტებს ჩავამატებ და დავაკომიტებ

ioseb commented 11 years ago

ოკ, მომწონს ტესტები რომ არ გავიწყდება.